2010-09-23 43 views
10

在過去,我在查詢varbinary(max)列時注意到了糟糕的性能。可以理解,但它似乎也發生在檢查它是否爲空,我希望引擎會採取一些捷徑。在varbinary字段上檢查ISNULL的策略?

select top 100 * from Files where Content is null 

我會懷疑它是緩慢的,因爲它是

  1. 孤男寡女拉動整個二進制出來,
  2. 它沒有索引(VARBINARY不能正常指數的一部分)

This question似乎不同意我這裏的緩慢前提,但是我似乎一次又一次地在二進制領域存在性能問題。

一個可能的解決方案,我認爲是做一個計算列索引:

alter table Files 
add ContentLength as ISNULL(DATALENGTH(Content),0) persisted 

CREATE NONCLUSTERED INDEX [IX_Files_ContentLength] ON [dbo].[Files] 
(
    [ContentLength] ASC 
) 

select top 100 * from Files where ContentLength = 0 

那是一個有效的策略是什麼?還有什麼其他方法可以有效地查詢二進制字段的涉及時間?

回答

8

我認爲這很慢,因爲varbinary列沒有(也不能)索引。因此,您使用計算(和索引)列的方法是有效的。

但是,我會使用ISNULL(DATALENGTH(Content), -1)來代替,以便您可以區分長度爲0和NULL。或者只是使用DATALENGTH(Content)。我的意思是,Microsoft SQL Server不是Oracle,其中空字符串與NULL相同。

2

當查找varbinary值不爲null的行時,我們遇到了類似的問題。對於我們來說,解決方案是更新數據庫的統計數據:

exec sp_updatestats 

執行此操作後,查詢運行得更快。