20

過去に、varbinary(max) 列をクエリするときのパフォーマンスがひどいことに気付きました。理解できますが、null かどうかを確認するときにも発生するようで、代わりにエンジンがいくつかのショートカットを取ることを望んでいました。

select top 100 * from Files where Content is null

私はそれが遅いと思うだろう

  1. バイナリ全体を引き出す必要があり、
  2. インデックスが作成されていません (varbinary を通常のインデックスに含めることはできません)。

この質問は、ここでの遅さの前提に同意しないようですが、バイナリフィールドでパフォーマンスの問題が何度も発生しているようです。

私が考えた解決策の 1 つは、インデックス付きの計算列を作成することです。

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

それは有効な戦略ですか?バイナリ フィールドが関係している場合に効率的にクエリを実行する他の方法はありますか?

4

2 に答える 2

13

varbinary列はインデックス付けされていない(そしてインデックス付けできない)ので、遅いと思います。したがって、計算された(およびインデックス付けされた)列を使用するアプローチは有効です。

ただし、ISNULL(DATALENGTH(Content), -1)長さ0とNULLを区別できるように、代わりに使用します。または、を使用しますDATALENGTH(Content)。つまり、Microsoft SQL ServerはOracleではなく、空の文字列はNULLと同じです。

于 2010-09-23T06:26:25.743 に答える