您好我正在使用SQL管理工作室2008R2。
我有一个查询来获取tblScan的scanids,其中一些varbinary(max)字段为null。我的疑问是:
select SCANID
from tblScan
where scanFileFace is null
and scanFileAvatar is null
and hair is null
当我在SQL中执行查询时,我第一次运行此查询需要一分半钟。 在我的客户端,这给出了超时异常。如果我没有在SQL管理工作室中运行一次查询。
优化此查询的最佳方法是什么?或者只是增加连接字符串中的超时可以吗?
编辑:
这是我的桌子设计:
SCANID - int
scanDate - 日期时间
scanFileMeasurements - varbinary(MAX)
MEMBERID - int
scanFileFace - varbinary(MAX)
scanFileAvatar - varbinary(MAX)
头发 - varbinary(MAX)
提前致谢!
答案 0 :(得分:2)
请使用scanFileFace,scanFileAvatar和hair字段上的索引。
创建一个计算列,该列将在目标字段中更改值时自动计算,并在此计算字段上创建索引。我会大大提高查询性能。
alter table tblScan
add ContentLength as ISNULL(DATALENGTH(scanFileFace ),0) persisted
CREATE NONCLUSTERED INDEX [IX_tblScan_ContentLength] ON [dbo].[tblScan]
(
[ContentLength] ASC
)
select scanid from tblScan where ContentLength > 0
答案 1 :(得分:1)
也许带有索引的计算布尔字段就是你想要的。
插入时,将布尔字段设为现有条件;更新时,您可以使用触发器
执行此操作答案 2 :(得分:1)
您可以尝试使用materialized view。简而言之,它是一个索引视图,表现为一个表,并随着底层数据的变化而变化,但它不需要执行select,因为在基础表的CRUD操作期间已经准备好了数据。
create view EmptyScans with schemabinding
as
select SCANID
from dbo.tblScan
where scanFileFace is null
and scanFileAvatar is null
and hair is null
GO
create unique clustered index ix_empty_scans on EmptyScans (ScanID)
GO
select scanid
from EmptyScans (noexpand)
从物化视图中选择时不要忘记添加noexpand提示,否则它将作为普通视图(至少在我使用Sql Server 2005时的体验中)。