過去に、varbinary(max) 列をクエリするときのパフォーマンスがひどいことに気付きました。理解できますが、null かどうかを確認するときにも発生するようで、代わりにエンジンがいくつかのショートカットを取ることを望んでいました。
select top 100 * from Files where Content is null
私はそれが遅いと思うだろう
- バイナリ全体を引き出す必要があり、
- インデックスが作成されていません (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
それは有効な戦略ですか?バイナリ フィールドが関係している場合に効率的にクエリを実行する他の方法はありますか?