【发布时间】:2014-01-21 11:59:08
【问题描述】:
我有一个存储过程,它根据输入参数构建动态 SQL 语句,然后执行它。
其中一个查询导致超时,所以我决定检查一下。第一次(也是第一次)执行 issue 语句很慢(30 秒 - 45 秒),并且每次下一次执行需要 1-2 秒。
为了重现问题,我正在使用
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
我真的很困惑问题出在哪里,因为普通的if SQL语句很慢,总是很慢。现在,它只有第一次执行时间长。
有可能,是本身速度慢需要优化还是其他原因造成的?
执行计划如下,但对我来说并没有什么奇怪的:
【问题讨论】:
-
清除缓存,然后在 SET STATISTICS IO ON 的情况下运行查询;查看读取次数(尤其是物理读取或预读),然后在不清除缓存的情况下再次运行它并查看读取次数,如果有很多现在是逻辑读取的物理/预读读取, SQL server 很可能只需要做大量的 IO 来满足查询,一旦这些数据缓存在内存中,速度就会快很多。
-
@steoleary 你是对的。所有物理读取都变为逻辑读取。所以,这就解释了为什么会出现这种情况。我想,唯一要解决的就是尝试优化查询本身。
标签: sql sql-server tsql sql-server-2012