-1

このステートメントは非常に長い間実行され、何も返しません。私は何が間違っているのですか?

SELECT *
  FROM supplierdata AS s1
 WHERE s1.zip IN (
    SELECT zip
      FROM supplierdata AS s2
     WHERE s1.zip = s2.zip
           );
4

3 に答える 3

4

あなたのステートメントは非効率的であるため、長い間実行されています。

ただし、最初に、クエリは実際には意味がありません。以下は同等です:

select *
from supplierdata
where zip is not null

クエリを強制終了し、にインデックスを作成することをお勧めしますsupplierdata(zip)。これにより、クエリのパフォーマンスが大幅に向上します。

本質的に、クエリはのすべての行に対してサブクエリを実行していますsupplierdata。これは非常に費用がかかり、テーブルの全表スキャンが必要です。インデックスでこれを修正する必要があります。

于 2013-03-26T13:26:16.637 に答える
1

あなたは非常に貧弱な人の数をしているので、あなたのクエリは基本的に次のようになります:

  1. サプライヤーデータのすべての行に対して
  2. 現在の行のzipについてsupplierdata全体をクエリします
  3. 私が何かを見つけたらそれを選択してください
  4. 繰り返す。

同じことを達成するためのより簡単な方法。zipがnullではないsupplierdatas1からcount(1)を選択します

于 2013-03-26T13:26:32.933 に答える
1

「これは意味をなさない」とは別に:

select * 
from supplierdata as s1 
where s1.zip IN 
(select zip from supplierdata as s2 where s2.zip between 200 and 300);

と同等

select * 
from supplierdata as s1 
where s1.zip 
between 200 and 300;

などなど....意味をなさないでください....達成しようとしたことを説明すると、より良いはずです;)

または、親クエリを参照しない条件。@Nixが言うように、最初は行ごとに移動するため、ループは無限ではありません。

于 2013-03-26T13:33:54.853 に答える