4

以下は正常に動作しますが、遅すぎます。表Bに一致するレコードがあることを知っておく必要があるので、何かトリックはありますか?

(不思議なことに反対の検索:結合しないレコードを見つける(IS NULL)は非常に高速です)

SELECT
  TableA.id
FROM
  TableA
  LEFT JOIN
    TableB 
  ON
    TableB.TableA_id = TableA.id
WHERE
  TableB.id IS NOT NULL and TableA.clientid=13 ;

Clientidのインデックスが作成されましたが、クエリが非常に高速から数分に大幅に遅くなるのはこの節です。

(03May12私は今、はるかに強力なサーバー上の同一のデータベースでこの同じクエリを試しましたが、クエリには1秒かかります。したがって、元のサーバーが完全に過負荷になっていることが問題のようです。皮肉なことに、上記のクエリを使用して識別していました。テーブルのサイズを縮小するために削除できるレコード。より高速なサーバーでデータベースを再構築し、クリーンアップしてから、「低速」サーバーで再生成する必要があります)

4

3 に答える 3

2

インデックスは TableB.TableA_id と TableA.id に作成されるはずです

SELECT
  Count(TableA.id)
FROM
  TableA
  JOIN
    TableB 
  ON
        TableB.TableA_id = TableA.id And TableB.id IS NOT NULL
and TableA.clientid=13 ;
于 2012-05-01T13:20:25.410 に答える
1

このクエリは、B にもある A からのすべてのレコードを検索します。

SELECT TableA.id
FROM TableA
JOIN TableB ON TableB.TableA_id = TableA.id

インデックスがある場合はうまく機能しますTableB.TableA_id(インデックスTableA.idはこのクエリのパフォーマンスとは無関係です)

于 2012-05-01T13:21:31.027 に答える
0

これを試して

SELECT TableA.id
FROM TableA
INNER JOIN TableB ON TableB.TableA_id = TableA.id

この場合、内部結合のために not null を使用する必要はありません。これがより良い解決策になることを願っています

于 2012-05-01T13:24:18.950 に答える