【发布时间】:2015-06-30 22:49:02
【问题描述】:
查询滞后 - 单行选择需要超过 2 分钟才能完成
SQL Server 10.50.4000.0 (2008 R2 SP2)
第 1 步 - 填充测试表
begin tran
truncate table MSDS_PROD_BK..MSDS_Import
insert into MSDS_PROD_BK..MSDS_Import
select * from MSDS_PROD..MSDS_Import (nolock)
commit tran
(受影响的 30354 行)
(需要 32 秒才能完成)
(重要提示 - 该表包含一个 VARBINARY 列)
第 2 步 – 仅选择 1 行的 VARBINARY 列(通过新的查询窗口,数据库:MSDS_PROD_BK)
SELECT distinct FILE_DATA
FROM MSDS_Import
WHERE FILE_NAME = ‘example.pdf’
(需要 2 分钟完成)
(重要提示 - 在运行时,相同的查询会从其他新的和现有的会话返回亚秒级 [响应时间],是的,如果未指定 DISTINCT,则不会出现延迟)
(随后,所有此类查询现在返回亚秒级 [响应时间])
在延迟时间期间,运行 sp_who2 显示没有阻塞,但 sp_lock 显示:
dbid ObjId IndId Type Resource Mode Status
75 0 0 MD 2(35e8b1ea:b:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:a:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:a:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:b:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:9:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:8:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:8:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:9:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:3:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:3:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:1:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:1:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:1:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:7:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:6:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:6:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:7:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:5:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:4:0) Sch-S GRANT
75 0 0 MD 2(35e8b1ea:4:0) Sch-S GRANT
75 0 0 MD 1(35e8b1ea:5:0) Sch-S GRANT
问题 - VARBINARY 列的第一次点击查看的幕后情况是什么?
当然,计划尝试安装 SP3
谢谢
【问题讨论】:
-
我假设你没有任何索引。
-
听起来
DISTINCT是在WHERE之前应用的;所以它正在读取所有 30,354 个 VARBINARY 字段?你能提供实际的执行计划吗? (虽然这就是我的感觉,但我有信心/希望我一定是错的。) -
DISTINCT是罪魁祸首。意思是不发送重复,但是为了找到重复,引擎需要读取并比较所有二进制字段的内容。 -
我同意 DISTINCT 是罪魁祸首——然而,当查询旋转运行超过两分钟时,我可以打开一个新的查询窗口,运行相同的查询并完成子第二个(而第一个命中查询仍在运行和运行
-
该表有一个主键,并且估计的查询计划说它正在执行聚集索引扫描(即使查询列 FILE_DATA 和 FILE_NAME 不是索引的一部分 - 奇怪吗?)
标签: sql-server sql-server-2008-r2