Sql server 内联SQL与存储过程

Sql server 内联SQL与存储过程,sql-server,performance,tsql,optimization,Sql Server,Performance,Tsql,Optimization,我有一个简单的SELECT语句,在WHERE子句中引用了两列。通常我在VB代码中执行这些简单的操作(设置命令对象,将命令类型设置为文本,将命令文本设置为Select语句)。但是,我看到超时问题。我们已经对我们的桌子等进行了尽可能多的优化 我想知道,与创建一个带有几个参数的简单存储过程相比,仅仅因为我以这种方式执行查询是否会对性能造成很大影响。我想可能内联代码迫使SQL进行额外的编译、创建查询计划等工作,如果我使用存储过程,这是不会发生的 正在运行的实际SQL示例: SELECT TOP 1 *

我有一个简单的
SELECT
语句,在
WHERE
子句中引用了两列。通常我在VB代码中执行这些简单的操作(设置命令对象,将命令类型设置为文本,将命令文本设置为Select语句)。但是,我看到超时问题。我们已经对我们的桌子等进行了尽可能多的优化

我想知道,与创建一个带有几个参数的简单存储过程相比,仅仅因为我以这种方式执行查询是否会对性能造成很大影响。我想可能内联代码迫使SQL进行额外的编译、创建查询计划等工作,如果我使用存储过程,这是不会发生的

正在运行的实际SQL示例:

SELECT TOP 1 * FROM MyTable WHERE Field1 = @Field1 ORDER BY ID DESC

的确,数据库必须完成您提到的额外工作,但这不应导致性能大幅下降(除非您非常、非常频繁地运行查询…)

使用sql探查器查看实际发送到服务器的内容。使用活动监视器查看是否有其他查询阻止了您的查询。

格式良好的“内联”或“特殊”SQL查询-如果与参数一起正确使用-与存储过程一样好

但这绝对是至关重要的:您必须使用正确的参数化查询!如果您没有-如果您将每个请求的SQL连接在一起-那么您就不会从这些要点中获益

就像存储过程一样,在第一次执行时,必须找到查询执行计划,然后将该执行计划缓存在计划缓存中,就像存储过程一样

如果多次调用内联参数化SQL语句,“内联”SQL查询计划与存储过程的执行计划遵循相同的缓存逐出策略,则该查询计划将被反复重用

从这个角度来看,如果您确实正确地使用参数化的查询,那么存储过程的性能就不会有任何好处


存储过程还有其他好处(如作为“安全边界”等),但原始性能并不是其主要优点之一。

您的查询再简单不过了。Field1是否已编制索引?正如其他人所说,没有与“特别”查询相关的性能影响


关于将您的查询放在哪里,这是科技界最古老的争论之一。我认为您的请求“属于”您的应用程序。它们将与你的应用程序进行版本连接,并用你的应用程序进行测试,当你的应用程序消失时,它们将消失。把它们放在应用程序之外的任何地方都会让你陷入痛苦的世界。但看在上帝的份上,请使用编译为嵌入式资源的.sql文件。

Select语句,它是任何 另一个语句称为内联查询。 无法获取参数。 不是数据库对象

程序: 可以获取参数 数据库对象
如果需要执行相同的操作,则可以全局使用。

发布代码将有助于回答问题。如果您所做的操作可能重复,请在sql中使用参数!真正检查性能瓶颈的唯一方法是评测查询,但从参数化sql开始(通过内联sql或存储过程)是一个好的开始。从MyTable中选择TOP 1*,其中Field1=@Field1 ORDER BY ID DESC(ID是标识种子的第一列)执行计划是什么样子的?
Field1
是否已编制索引?您可能会遇到并发数据修改语句的阻塞?是的,它可以非常频繁地运行,比如每分钟100-500次。然后将其放入存储过程中-这应该会有所不同-或者按照marc_的建议进行参数化(我个人认为存储过程更易于编码和维护)