Sql server Delphi调用SQL Server存储过程速度慢

Sql server Delphi调用SQL Server存储过程速度慢,sql-server,delphi,stored-procedures,Sql Server,Delphi,Stored Procedures,我被难住了。在SSMS中,当我执行带有参数的存储过程时,该过程需要6秒钟。当从Delphi程序(使用相同的参数)执行时,程序运行需要26秒。我运行了SQL Profiler和Devart的DBMonitor,它只确认时间实际上是26秒 为了确保我在比较苹果和苹果,我在两种情况下执行之前都会清理环境和缓存 该过程有7个可选参数(带有默认值)所有varchar 有谁能指导我找到问题的根源吗 提前感谢。感谢@Alex K.的评论+1,这让我找到了我能够指出问题的答案。 虽然这篇文章有30页,但理解和解

我被难住了。在SSMS中,当我执行带有参数的存储过程时,该过程需要6秒钟。当从Delphi程序(使用相同的参数)执行时,程序运行需要26秒。我运行了SQL Profiler和Devart的DBMonitor,它只确认时间实际上是26秒

为了确保我在比较苹果和苹果,我在两种情况下执行之前都会清理环境和缓存

该过程有7个可选参数(带有默认值)所有varchar

有谁能指导我找到问题的根源吗


提前感谢。

感谢@Alex K.的评论+1,这让我找到了我能够指出问题的答案。 虽然这篇文章有30页,但理解和解决这个问题却花了7页

发现的两个最常见的问题是参数嗅探和应用程序为运行查询设置的不同选项

在将参数值复制到过程的局部变量中以避免参数嗅探(这不会改变行为)之后,我查看了应用程序中设置的不同选项,例如: ArithAbort、ansi\u警告、concat\u null\u产生\u null等

我们在应用程序中遇到的问题是,在Delphi中运行的应用程序在启动之前设置了一系列选项:ArithAbort关闭、ansi_警告关闭。。。包括concat_null_产量_null OFF

在我的案例中,导致问题的是concat_null_产生的值 在SSMS中运行时(默认情况下),concat_null_yields_null处于启用状态


我现在需要弄清楚这个选项的开/关是如何影响存储过程的

您使用什么客户端进行sql连接?(OLEDB,原生客户端,…@whosrdaddy因为我不是创建Delphi程序的人(我更像是DBA),我不确定,但我认为是SDAC(这有意义吗?LOL)我认为这可能是一个参数嗅探问题。我现在正在读。经典读物:@Alex K。谢谢你。。。现在读吧。