【问题标题】:How to make SQL statement (query) precompiled In SQL Server 2012如何在 SQL Server 2012 中预编译 SQL 语句(查询)
【发布时间】:2016-03-19 07:52:02
【问题描述】:

我们的 asp.net 应用程序中有许多小型 SQL 查询。此外,我们在数据库中有一些存储过程。

我们不能为每个 SQL 语句创建存储过程。

我们如何使这些 SQL 查询预编译,以便在每次查询执行时忽略编译时间?给我们一个小例子。

【问题讨论】:

  • This 可能比一个简短的例子更有帮助。
  • 如果您的查询没有改变,那么很有可能会重用缓存的计划。如果您的查询是非参数化的即席,每次调用都有不同的文本 - 那么就没有机会重用缓存的计划。一个完全新的查询如何被“预编译”?

标签: sql-server database sql-server-2008 database-performance sqlperformance


【解决方案1】:

预编译查询的唯一方法是使用存储过程和参数查询。每当您运行查询时,SQL Server 都会将编译后的执行计划保存在缓存中,因此如果您的应用程序中经常使用查询,SQL Server 会将其保留更长时间。

请注意,如果您使用临时查询,则不会发生这种情况。 如果 query1 甚至与 query2 相差 1 个字符,则 SQL 假定它们是 2 个不同的查询。

因此,尽可能多地使用参数查询。这也有助于防止 SQL 注入。

为了进行更结构化的数据库编程,最好使用存储过程。 SP 的行为类似于参数查询,实际上阻止您使用临时查询。

搜索“SQL Sever 执行计划缓存”可以在网上找到很多文章

如果您需要深入了解这些内容,请阅读本书:

Microsoft SQL Server 2012 内部结构

此链接为您提供更深入的信息。

Chaching Mechanisms

【讨论】:

  • 甚至 SQL Server 中的存储过程也不是“预编译”的——它们的执行计划是在第一次执行时确定的——就像使用即席 SQL 查询一样——并为后续执行而缓存。见Pre-Compiled Stored Procedures - Fact Or Myth?
  • @marc_s,你是对的。我并不是说 SQL 服务器在执行 rpoc 之前编译它们。它在第一次执行时编译它们,然后保留执行计划,如参数查询。与查询相比,存储过程有更多机会保留在缓存中,因为它们的签名保持不变(如参数查询)。如果我错了,请纠正我。谢谢
  • 再次说明:存储过程和适当参数化即席查询将其执行计划的相同机会保存在内存中。但是,如果查询没有参数化,当然,这会给计划缓存带来更大的压力,因此计划可能会被更快地踢出 - 但是存储过程计划与临时计划之间没有区别查询计划 - 最旧(最少使用)的计划优先
  • @marc_s,我不同意。如果我们使用 SP 或参数查询,从 SQL Server 的角度来看,同样的事情会一次又一次地运行。如果一个查询运行 100 次,它比执行 2 或 3 次的查询更有机会留在缓存中。对不对?
  • 是的 - 但如果您有一个运行 100 次的存储过程,以及一个 运行 100 次的正确参数化查询 - 那么两者都有相同的机会保留在缓存中- 存储过程并没有仅仅基于它是一个存储过程(相对于即席查询)这一事实的优势。这就是我想说的:如果两者执行的次数相同,那么在存储过程方面保留在计划缓存中没有任何优势
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多