datekey
列( でありdate
、インデックスを持つ)、 である列contents
、varbinary(max)
およびである列を含むいくつかの列を持つテーブル mytable がありstringhash
ますvarchar(100)
。stringhash
と を合わせてテーブルのdatekey
主キーを形成します。すべてが私のローカルマシンで実行されています。
ランニング
SELECT TOP 1 * FROM mytable where datekey='2012-12-05'
0 行を返し、0 秒かかります。しかし、datalength
条件を追加すると:
SELECT TOP 1 * FROM mytable where datekey='2012-12-05' and datalength(contents)=0
非常に長い時間実行され、待つことをあきらめる前に何も返されません。
私の質問: なぜですか? なぜこれほど長い時間がかかるのか、どうすればわかりますか?
これまでに確認したことは次のとおりです。
「推定実行計画の表示」をクリックすると、非常に時間がかかり、待つことをあきらめる前に何も返されません。
私が行った場合
SELECT TOP 1000 datalength(contents) FROM mytable order by datalength(contents) desc
7 秒かかり、リスト 4228081、4218689 などを返します。
exec sp_spaceused 'mytable'
戻り値
rows reserved data index_size unused
564019 50755752 KB 50705672 KB 42928 KB 7152 KB
そのため、テーブルは 50 GB と非常に大きくなります。ランニング
SELECT TOP 1000 * FROM mytable
26秒かかります。
sqlservr.exe プロセスは、データベースに設定した制限である約 6 GB です。