3

WINDOWS 2008 上の SQL サーバー 2008

次の sql を比較してください。

1.

select count(*) 
from Trades t 
inner join UserAccount ua on ua.AccID = t.AccID

2.

select count(*) 
from Trades t 
inner join (
    select * 
    from UserAccount ua 
    where ua.UserID = 1126
) as theua on theua.AccID = t.AccID

3.

select count(*) 
from Trades t 
inner join UserAccount ua on ua.AccID = t.AccID 
where ua.UserID=1126

Trades には何百万もの行があり、UserAccount は非常に小さなテーブルです。また、AccID は重複する可能性があります。

実行結果:

  1. 234734792
  2. 8806144
  3. 8806144

No.2 は少なくとも No.1 と同じくらい速くなると思いますが、実際には No.3 よりもはるかに遅く、さらに時間がかかります。

  1. 2秒
  2. 10秒
  3. 8秒

誰かが理由を説明できますか?また、UserID=1126 のようなフィルターが必要な場合に高速化することはできますか?

4

1 に答える 1

3
  1. where条件の量が最も少ないため、が最速です。
    (欠落しているユーザーID)

  2. 結合ごとに実行する必要がある内部選択があるため、最も低速です
    ところで:これは絶対に行わないでください

  3. 余分なwhere条件(UserID)があるため、#1よりも遅くなります。これは、使用するクエリです。
    (参加直後に「where」を「and」に交換することもできます)

外部キーを設定していますか?

また、適切なインデックス(IE:AccIDとUserID)があることを確認してください。

SSMSから、実行プランをオンにしてクエリを実行すると、作成する必要のあるクエリ/インデックスの潜在的な非効率性が示されます。

実行プランでは、テーブルスキャンなどに注意する必要があります。あなたが見たいのはシークです。

于 2012-02-29T01:29:52.163 に答える