我有一个表 mytable ,其中包含一些列,包括列datekey
(这是 adate
并具有索引)、一列contents
是 avarbinary(max)
和一列stringhash
是 a varchar(100)
。和一起构成表stringhash
的datekey
主键。一切都在我的本地机器上运行。
跑步
SELECT TOP 1 * FROM mytable where datekey='2012-12-05'
返回 0 行并花费 0 秒。但是如果我添加一个datalength
条件:
SELECT TOP 1 * FROM mytable where datekey='2012-12-05' and datalength(contents)=0
它运行了很长时间并且在我放弃等待之前没有返回任何东西。
我的问题: 为什么?我如何找出为什么这需要这么长时间?
这是我到目前为止检查的内容:
当我单击“显示估计的执行计划”时,它也需要很长时间并且在我放弃等待之前没有返回任何内容。
如果我做
SELECT TOP 1000 datalength(contents) FROM mytable order by datalength(contents) desc
它需要 7 秒并返回一个列表 4228081、4218689 等。
exec sp_spaceused 'mytable'
返回
rows reserved data index_size unused
564019 50755752 KB 50705672 KB 42928 KB 7152 KB
所以表在 50 GB 时相当大。跑步
SELECT TOP 1000 * FROM mytable
需要 26 秒。
sqlservr.exe 进程大约为 6 GB,这是我为数据库设置的限制。