SQL Server:查询执行时间取决于查询执行的次数

Posted

技术标签:

【中文标题】SQL Server:查询执行时间取决于查询执行的次数【英文标题】:SQL Server : Query execution time depends on how many times query is executed 【发布时间】:2014-02-10 13:32:14 【问题描述】:

我正在尝试在 SQL Server 数据库上执行一个相当“大”的查询:

SELECT *, (SELECT MAX(data) FROM another_sample_table) as max_data
FROM sample_test_1 st1
    LEFT JOIN sample_table_2 st2 ON (st2.date = st1.date)
    LEFT JOIN sample_table_3 st3 ON (st3.id = st2.id)
    LEFT JOIN sample_table_4 st4 ON (st4.code = st1.code)
    -- Two ohter LEFT JOINs
WHERE st1.date = '2000-01-01'
    AND st4.code IN ('EX1') -- and a list of code

预期行为:

第一次执行查询大约需要 1 分钟。 我认为这是索引问题。预期的行为应该是每次执行查询时,执行时间应该或多或少在 1 分钟左右。

实际结果:

查询执行第2、3、4等次时,执行时间变为1秒。

问题:

SQL Server 2008 的哪些技术方面可以解释这种行为?数据库是否将结果保存在某种缓存中一段时间​​然后将其删除?还是SELECT MAX(data) FROM another_sample_table 查询引起了一些麻烦?

【问题讨论】:

'预热缓冲区缓存' - 即将数据从磁盘读入内存 【参考方案1】:

你应该看看Execution Plan Caching and Reuse

SQL Server 有一个内存池,用于存储两个执行 计划和数据缓冲区。分配给任一池的百分比 执行计划或数据缓冲区动态波动,具体取决于 系统的状态。内存池中用于 存储执行计划称为过程缓存。

【讨论】:

即使在慢速系统上,编译计划也不会超过几秒钟。所以这不能解释 1 分钟到 1 秒的差异。 @MitchWheat,这是真的,但正如评论摘录中所述,它还可以存储数据缓冲区,这可能有助于提高性能 这是我在对 OP 的评论中所说的。您的回答表明它是查询计划缓存而不是缓冲区缓存。

以上是关于SQL Server:查询执行时间取决于查询执行的次数的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询执行时间、SQL Server、嵌套查询

sql语句中where条件的嵌套子查询性能

同一查询的不同执行时间 - SQL Server

SQL Server - 条件语句的查询执行计划

引用:初探Sql Server 执行计划及Sql查询优化

查看执行计划时禁用 SQL Server 中的查询工具提示