我们在我们的asp.net应用程序中有很多小的SQL查询。另外我们在数据库中有一些存储过程。如何使SQL语句(查询)预编译在SQL Server 2012中
我们无法为每个SQL语句创建存储过程。
如何预编译这些SQL查询,以便每次查询执行时忽略编译时间?给我们一个小例子。
我们在我们的asp.net应用程序中有很多小的SQL查询。另外我们在数据库中有一些存储过程。如何使SQL语句(查询)预编译在SQL Server 2012中
我们无法为每个SQL语句创建存储过程。
如何预编译这些SQL查询,以便每次查询执行时忽略编译时间?给我们一个小例子。
查询预编译的唯一方法是使用存储过程和参数查询。无论何时运行查询,SQL服务器都会将编译后的执行计划保存在缓存中,因此如果在您的应用程序中经常使用查询,SQL服务器会将其保留更长时间。
请注意,如果您使用临时查询,则不会发生这种情况。 如果query1甚至与query2不同,则SQL假定它们是2个不同的查询。
因此尽可能多地使用参数查询。这也有助于防止SQL注入。
对于更多结构化的db编程,最好使用存储过程。 SP的行为就像参数查询,并且实际上阻止您使用即席查询。
你可以找到在网络上的许多文章,如果你搜索一下“SQL Sever的执行计划缓存”
如果你需要这些东西了解不深,读过这本书:
微软SQL Server 2012和的内幕
此链接为您提供更深入的信息。
甚至SQL Server中的存储过程也不是“预编译”的 - 它们的执行计划是在第一次执行时确定的 - 就像使用临时SQL查询一样 - 并为后续执行而缓存。参见[预编译的存储过程 - 事实还是神话?](http://www.scarydba.com/2009/09/30/pre-compiled-stored-procedures-fact-or-myth/) –
@marc_s,You是对的。我并不是说SQL服务器在执行它们之前编译rpocs。它在第一次执行时编译它们,然后保存执行计划,如参数查询。存储过程有更多的机会留在缓存而不是查询中,因为它们的签名保持不变(如参数查询)。如果我错了,请纠正我。谢谢 – FLICKER
同样,存储过程和**正确参数化的即席查询的执行计划的** SAME CHANCE **被保存在内存中。但是,如果查询不*参数化,当然会给计划缓存带来更多压力,因此计划可能会更快地被推出 - 但存储过程计划与临时查询计划之间没有区别 - 最老的(最少使用)计划先走 –
[这](https://msdn.microsoft.com/en-us/library/cc293623.aspx)可以帮助将大于短例子更。 –
如果您的查询不变,那么缓存的计划很有可能会被重用。如果您的查询是每次调用时使用不同文本的非参数化adhoc - 那么就没有机会重用缓存计划。一个完全_new_查询如何被“预编译”? –