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



这将在几秒钟内执行:

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分钟却没有任何结果(这可能是这里发生的事情的关键。。。因此,这个问题可以重新格式化:在哪些情况下,我们必须等待"估计的执行计划">

p.S.表定义很简单,但表包含大约一百万个Blob(表的大小为200GB(,ID上有PK:

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

添加。我在30分钟后得到了估计的执行计划。但这个执行计划包含与第一个查询完全相同的"集群索引扫描"。而且,令人惊讶的是,第二次和最后一次处决是几秒钟。。。IO问题?错误的执行计划?

添加了2。UPDATE STATISTICS FILES-运行缓慢(30分钟,顺便说一句,这个数字相当于在该系统上读取200 gb的分钟数(,之后选择操作变得快速。那么一切都清楚了吗?不,因为:

  1. 我不明白下次当我不能做的时候该怎么做为了得到一个估计的运动计划?如何检查该查询统计数据更新速度慢吗
  2. 我不明白为什么UPDATE STATISTICS需要读取Blob

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

既然您使用的是SQL Server 2012,您是否考虑过筛选索引?这可能是最简单的运行方式。

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

最新更新