2017-01-04 13 views
0

ORDER BY節で完了すると、以下のクエリに時間がかかります。 Table_AについてはORDER BY SQLクエリのパフォーマンスに影響を及ぼす

select a.* 
    from table_a a 
    left join table_b b on a.colid = b.colid 
    where (
     a.colid = 0 
    or a.colid = b.colid 
    ) 
    order by a.colid2, a.colid3 asc 

主キークラスタ化インデックスは、(colid2,colid3)Table_Aについては

非クラスタ化インデックスがTable_B用の非クラスタ化インデックスがORDER BY(colid)

実行時間が、一方、13秒を取っているされて(colid)

ある

です ORDER BYが1秒かかる。

+4

これは正常です、注文に時間がかかります... – fedorqui

+5

うん、注文は高価です。あなたの質問は何ですか? –

+0

スケーラブルなアプリケーションでは、データベース内の何もソートせずに、ミドルウェアのマシンにソートを行わせる方法もあります。別名、「C#コードで並べ替えをする」のようなもの。 – granadaCoder

答えて

1

GROUP BY、ORDER BY、LIKE、DISTINCTのような節は比較的時間がかかります。使用している場合は、スクリプト作成中に評価してみてください。サブクエリは使用しないでください。可能であれば、クエリの内部を計算しないで評価してください。

問題のあるインデックス作成+関連するキャッシュとパーティション分割(必要な場合)が問題を解決するはずです。

私はあなたがcolid2のインデックスを作成すべきだと考えます。あなたが役立つかもしれないヒントをロックし、使用しているSQL Serverのバージョンによって

+0

GROUP BY、ORDER BY、LIKE、DISTINCTのような句はありません。一番左のジョインどこの句 – phanish

+0

@phanish:わかっています。その一般的な提案。私はcolid2のインデックスを付けるべきだと述べました。しかし、非常に高い性能を期待しないでください。すでに注文しているので –

+0

TOP句はパフォーマンスを低下させているトランザクションサイズを指定するために使用されます – phanish

0

、試してみてください。

select a.* 
from table_a a with (nolock) 
left join table_b b with (nolock) 
on a.colid = b.colid 
where a.colid = 0 
or a.colid = b.colid 
order by a.colid2, 
    a.colid3 asc 

をそれが解決しない場合は、シンプルにクエリを下げてみてくださいそのように結合します

--this is equivalent to your original query 
select * 
from (
    select * 
    from table_a 
    where colid = 0 
    union 
    select a.* 
    from table_a as a 
    inner join table_b as b 
    on b.colid = a.colid 
    ) as tbl 
order by colid2, 
    colid3 
+0

ありがとうございます。次の変更を行うことでパフォーマンスが向上しました。1. table_aのtempテーブルを作成します。2. tempテーブルのclusteredインデックスを作成します。3. join句を使用してtempテーブルに挿入します。パラメータと順序に基づいてテンポラリテーブルを選択 – phanish

関連する問題