我有一个简单的SELECT
语句,在WHERE
子句中引用了几列。通常我会在VB代码中执行这些简单的操作(设置Command对象,将Command Type设置为text,将Command Text设置为Select语句)。但是我看到了超时问题。我们已经用表格等优化了我们所能做的一切。
我想知道是否因为我正在以这种方式进行查询,而不是创建一个带有几个参数的简单存储过程,会有很大的性能损失。我想也许内联代码强制SQL做额外的工作编译,创建查询计划等,如果我使用存储过程就不会发生。
正在运行的实际SQL的一个示例:
SELECT TOP 1 * FROM MyTable WHERE Field1 = @Field1 ORDER BY ID DESC
答案 0 :(得分:4)
良好形成的“内联”或“临时”SQL查询 - 如果与参数一起使用 - 与存储过程一样好。
但绝对至关重要:您必须使用正确的参数化查询!如果你不这样做 - 如果你为每个请求连接你的SQL - 那么你不从这些点中受益......
就像存储过程一样,首次执行时,必须找到查询执行计划 - 然后将执行计划缓存在计划缓存中 - 就像使用存储过程一样。
如果多次调用内联参数化SQL语句,则会一遍又一遍地重复使用该查询计划 - 并且“内联”SQL查询计划遵循与存储过程的执行计划相同的缓存逐出策略。< / p>
从这个角度来看 - 如果你真的使用了正确的参数化查询 - 对于存储过程没有任何性能优势。
存储过程还有其他好处(比如“安全边界”等),但只是原始性能不是它们的主要优点之一。
答案 1 :(得分:0)
db确实需要完成你提到的额外工作,但这不应该导致性能大打击(除非你非常频繁地运行查询......)
使用sql profiler查看实际发送到服务器的内容。使用活动监视器查看是否有其他查询阻止您。
答案 2 :(得分:0)
您的查询不可能更简单。 Field1被编入索引吗?正如其他人所说,“临时”查询没有任何性能损失。
在哪里提出您的疑问,这是最古老的技术争论之一。我认为你的请求“属于”你的申请。它们将使用您的应用进行版本控制,并使用您的应用进行测试,并在您的应用消失时消失。将它们放在应用程序以外的任何地方都会陷入痛苦的世界。但为了善良,请使用.sql文件,编译为嵌入式资源。
答案 3 :(得分:0)
Select语句,它是任何form子句的一部分 另一条语句称为内联查询。 无法接受参数。 不是数据库对象
程序: 可以服用参数 数据库对象 如果需要执行相同的操作,则可以全局使用。