不思議なんだけど。SQL Server 2005 Express エディションで約 3 秒で実行される複雑なクエリがあります。
メイン テーブルには約 30 万行あります。
追加すると
ROW_NUMBER() OVER (ORDER BY date_column)
date_column
が列である間、123 秒かかりdatetime
ます。
私が行った場合
ROW_NUMBER() OVER (ORDER BY string_title)
再び 3 秒で実行されます。
datetime
列にインデックスを追加しました。変化なし。それでも123秒。
それから私は試しました:
ROW_NUMBER() OVER (ORDER BY CAST(date_column AS int))
クエリは再び 3 秒で実行されます。
キャストには時間がかかるため、なぜ SQL Server はこのように動作するのですか?
更新: ROW_NUMBER は WHERE ステートメントをまったく無視し、利用可能なすべてのエントリの行列リストを作成するようです? 誰でもそれを確認できますか?
ここで、SQL Management Studio でより読みやすい (まだ大量のロジック :)) をコピーしました。
SELECT ROW_NUMBER() OVER (ORDER BY xinfobase.lid) AS row_num, *
FROM xinfobase
LEFT OUTER JOIN [xinfobasetree] ON [xinfobasetree].[lid] = [xinfobase].[xlngfolder]
LEFT OUTER JOIN [xapptqadr] ON [xapptqadr].[lid] = [xinfobase].[xlngcontact]
LEFT OUTER JOIN [xinfobasepvaluesdyn] ON [xinfobasepvaluesdyn].[lparentid] = [xinfobase].[lid]
WHERE (xinfobase.xlngisdeleted=2
AND xinfobase.xlinvalid=2)
AND (xinfobase.xlngcurrent=1)
AND ( (xinfobase.lownerid = 1
OR (SELECT COUNT(lid)
FROM xinfobaseacl
WHERE xinfobaseacl.lparentid = xinfobase.lid
AND xlactor IN(1,-3,-4,-230,-243,-254,-255,-256,-257,-268,-589,-5,-6,-7,-8,-675,-676,-677,-9,-10,-864,-661,-671,-913))>0
OR xinfobasetree.xlresponsible = 1)
AND (xinfobase.lid IN (SELECT lparentid
FROM xinfobasealt a, xinfobasetree t
WHERE a.xlfolder IN(1369)
AND a.xlfolder = t.lid
AND dbo.sf_MatchRights(1, t.xtxtrights,'|')=1 )) )
AND ((SELECT COUNT(*) FROM dbo.fn_Split(cf_17,',')
WHERE [value] = 39)>0)
このクエリは、300k レコードで 2 ~ 3 秒かかります。を に変更するORDER BY
とxinfobase.xstrtitle
、再び約 2 ~ 3 秒で実行されます。xinfobase.dtedit
(追加したばかりの追加のインデックスを持つdatetime列)に切り替えると、すでに上で述べた時間が必要です。
また、「チート」を試み、ステートメントをSUB SELECTとして作成して、最初にレコードを取得しROW_NUMBER()
、別のSQLステートメントで外側を実行するように強制しました。同じパフォーマンス結果です。