select语句中包含多个和的查询性能不佳

时间:2012-05-07 08:37:57

标签: sql performance sql-server-2008

您好我正在使用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)

提前致谢!

3 个答案:

答案 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时的体验中)。