0

私はこれをやっていた:

SELECT layerID
FROM layers
WHERE ownerID = ?
AND collectionID = ?

これにより、レイヤーIDの配列が得られ、ループしてそれぞれに対してこれを実行します。

SELECT DATA
FROM drawings
WHERE layerID = ?

そして、それはすべてうまくいきました。だから今、私はそれを1つのステップでやろうとしているので、これを試します:

SELECT DATA , layerID
FROM drawings
WHERE layerID = ANY (
  SELECT layerID
  FROM layers
  WHERE ownerID = ?
  AND collectionID = ?
) 

しかし、何らかの理由で、メイン クエリのインデックスを使用しませんSELECT DATA etc。したがって、この 1 つの結合されたクエリは、以前に行っていた個別のクエリと比較して、完了するまでにはるかに長い時間がかかります。(ちなみに、サブクエリはSELECT layerID etc引き続きインデックスを使用します)。

「EXPLAIN」ステートメントを使用して、クエリを使用しているかどうかを判断しました。

ownerIDテーブルの列とcollectionIDlayers、およびテーブルの列に個別のインデックスがlayerIDありdrawingsます。

クエリのどこが間違っていますか?

4

2 に答える 2

5

結合してみてください。ANY は、クエリ オプティマイザーにとって最適化できない UNION のように見えます。

SELECT d.DATA, d.layerID  
FROM drawings AS d  
INNER JOIN layers AS l ON d.layerID = l.layerID  
WHERE l.ownerID = ? AND l.collectionID = ?
于 2008-11-13T20:52:01.950 に答える
0

ANY キーワードはこれまで見たことがありませんが、試してみると

選択データ、レイヤーID
図面から
WHERE レイヤーID IN (
  画層 ID を選択
  FROM レイヤー
  WHERE 所有者 ID = ?
  AND コレクション ID = ?
)

それは同じ問題を抱えていますか?すべきではないと思います。ただし、おそらく INNER JOIN の方が少し優れています。

于 2008-11-13T21:24:39.200 に答える