6

不思議なんだけど。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 BYxinfobase.xstrtitle、再び約 2 ~ 3 秒で実行されます。xinfobase.dtedit(追加したばかりの追加のインデックスを持つdatetime列)に切り替えると、すでに上で述べた時間が必要です。

また、「チート」を試み、ステートメントをSUB SELECTとして作成して、最初にレコードを取得しROW_NUMBER()、別のSQLステートメントで外側を実行するように強制しました。同じパフォーマンス結果です。

4

1 に答える 1

1

アップデート

回避策を実行することにまだ不満を感じていた後、さらに調査しました。既存のインデックスをすべて削除し、テーブルに対していくつかの SQL ステートメントを実行しました。列の新しい並べ替え順序で新しいインデックスを作成し、さまざまな列を含めることがわかりました。問題を修正し、クエリは dtedit (datetime) 列でも高速です。

そこで学んだ教訓: インデックスと実行計画をより注意深く管理し、作成するソフトウェアの更新 (新しいバージョン) ごとにそれらを再確認してください...

しかし、なぜ CAST(datetime_column AS int) が前に高速になるのか疑問に思っています...

于 2013-01-17T11:23:18.283 に答える