最近、SELECTクエリでデータを並べ替えるパターン(確かではありませんが、アンチパターンである可能性があります)に出くわしました。このパターンは、データを順序付けるためのより冗長で非宣言的な方法です。パターンは、関連データを実際のテーブルから一時テーブルにダンプしてから、一時テーブルのフィールドにorderbyを適用することです。私が思うに、誰かがそれをする唯一の理由は、パフォーマンスを改善することであり(私は疑っています)、他の利点はありません。
たとえば、ユーザーテーブルがあるとします。テーブルには、数百万の行が含まれる場合があります。名が「G」で始まり、名でソートされているすべてのユーザーを取得する必要があります。このシナリオのSQLクエリを実装するための自然で宣言的な方法は次のとおりです。
より自然で宣言的な方法
SELECT * FROM Users
WHERE NAME LIKE 'G%'
ORDER BY Name
冗長な方法
SELECT * INTO TempTable
FROM Users
WHERE NAME LIKE 'G%'
SELECT * FROM TempTable
ORDER BY Name
その文脈で、私はいくつかの質問があります:
名フィールドにインデックスがない場合、2つの方法の間にパフォーマンスの違いはありますか?はいの場合、どちらが良いでしょう。
名フィールドにインデックスがある場合、2つの方法の間にパフォーマンスの違いはありますか?はいの場合、どちらが良いでしょう。
SQL Serverオプティマイザーは、両方の方法で同じ実行プランを生成するべきではありませんか?
ロック/ブロッキングのような他のパースペクティブから冗長な方法を書くことに何か利点はありますか?
前もって感謝します。