【问题标题】:SQL Server : Query execution time depends on how many times query is executedSQL Server:查询执行时间取决于查询执行的次数
【发布时间】: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 查询引起了一些麻烦?

【问题讨论】:

  • '预热缓冲区缓存' - 即将数据从磁盘读入内存

标签: performance sql-server-2008 execution


【解决方案1】:

你应该看看Execution Plan Caching and Reuse

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

【讨论】:

  • 即使在慢速系统上,编译计划也不会超过几秒钟。所以这不能解释 1 分钟到 1 秒的差异。
  • @MitchWheat,这是真的,但正如评论摘录中所述,它还可以存储数据缓冲区,这可能有助于提高性能
  • 这是我在对 OP 的评论中所说的。您的回答表明它是查询计划缓存而不是缓冲区缓存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2019-04-16
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多