为什么我无法获得估计的执行计划?如何检查该查询是否已启动统计信息更新?

时间:2014-07-10 09:59:28

标签: sql-server sql-server-2012 blob

这会在几秒钟内执行:

DECLARE @FILES_IDS TABLE
(
    ID int,
    fc int NULL
)

INSERT INTO @FILES_IDS
SELECT id, datalength(FILE_CONTENT)
FROM FILES with (nolock) 

DELETE FROM @FILES_IDS WHERE fc is not null

SELECT * FROM @FILES_IDS

但是(这应该带来相同的记录集)永远不会结束:

SELECT id, datalength(FILE_CONTENT)
FROM FILES with (nolock) 
WHERE datalength(FILE_CONTENT) is null

我甚至无法得到"估计执行计划" !!! (等待20分钟没有任何结果)这可能是未知的关键所在...这样的问题可以通过这种方式重新格式化:在哪种情况下我们必须等待很多时间#34;估计执行计划"?

P.S。表定义简单但表包含大约百万个blob(表的大小为200 GB),ID上有PK:

CREATE TABLE [FILES](
    [ID] [int] NOT NULL,
    [FILE_CONTENT] [varbinary](max) NULL)

添加即可。我在30分钟后得到了估计的执行计划。但是这个执行计划包含完全相同的" Clustered Index Scan"作为第一个查询。并且,siurprise,第二次和最后一次执行完成是几秒钟...... IO问题?到那个错误的执行计划?

已添加2 。更新统计文件 - 运行缓慢(30分钟,顺便说一下这个数字与该系统上读取200 gb的分钟数相当),之后选择操作变得很快。一切都很清楚?不,因为:

  1. 我无法理解下次我无法行动的时候 得到估计的计划?如何检查该查询 统计更新速度慢了吗?
  2. 我无法理解为什么UPDATE STATISTICS需要读取blob ???

2 个答案:

答案 0 :(得分:1)

启用自动统计信息后,SQL Server将在需要时为必要的列创建统计信息。当您询问估计的查询计划时,SQL Server将为FILE_CONTENT列创建统计信息,因为它在where子句中使用,并且可能需要一些时间,具体取决于使用的采样率和您拥有的行数桌子。要检查SQL Server是否确实创建了统计信息,您可以查看在请求查询计划之前和之后的统计信息。应该有一个名为_WA_Sys_...的名称之前没有添加过。

答案 1 :(得分:-1)

看到你在SQL Server 2012上,您考虑过Filtered Index吗?它可能是最简单的方法来运行它。

CREATE NONCLUSTERED INDEX idx_filesFiltered ON files WHERE FILE_CONTENT IS NOT NULL`