这会在几秒钟内执行:
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的分钟数相当),之后选择操作变得很快。一切都很清楚?不,因为:
答案 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`