0

タイトルは少しわかりにくいかもしれませんが、説明します。

次のクエリ:

SELECT DISTINCT t.something FROM table1 as m  LEFT JOIN table2 as t ON
t.id = m.id  LEFT JOIN table3 as c ON t.id = c.id  WHERE ... LIMIT
1000;

これが特定のアクションで実行される唯一のクエリです。Zend デバッグ ツールがインストールされ、そのページで実行される SQL クエリを見ると、このクエリが次のクエリと一緒に実行されていることがわかります。 a 1000 回 (結果のすべての行に対して、各行の ID で 1 回:

SELECT "table1".* FROM table1 WHERE ((("table1"."id" = *id*)))

これにより、ページのパフォーマンスが非常に遅くなります。これらすべてのクエリが必要だとは思わないため、これらすべてのクエリが実行されなくなり、パフォーマンスが向上するように解決策を探しています。

この状況を認識している人はいますか?

PS: Postgresql を Zend フレームワークと一緒に使用していることを知っておくとよいでしょう。

4

1 に答える 1

1

これは、プログラマーの質問というよりも、自分のやり方を推測しなければならない古代のなぞなぞのようなものです。

somethingあなたのページ以上のものを必要としているようですが、クエリは のみを取得しますsomething。次に、非常にスマートなアプリがすべての行を個別にフェッチします - パフォーマンスの惨事です。

また、質問で提供したクエリは(非効率的であることに加えて)間違っているため、次のように読む必要があると思います。

SELECT DISTINCT m.something
FROM   table1 as m
LEFT   JOIN table2 as t ON t.id = m.id
LEFT   JOIN table3 as c ON t.id = c.id
WHERE  ...
LIMIT  1000;

WHERE..これは、実際の条項によっては、おそらくまだナンセンスです。

意味のあるテーブル エイリアスを使用して行全体 (または必要な列のみ) を取得するには、次のようにします。

SELECT DISTINCT t1.*
FROM table1 t1
LEFT JOIN table2 t2 ON t2.id = t1.id
LEFT JOIN table3 t3 ON t3.id = t2.id
WHERE ...
LIMIT 1000;

同じことをより効率的に行うには(table1最初からだまされていない場合):

SELECT t1.*
FROM   table1 t1
WHERE EXISTS (
    SELECT 1 
    FROM   table2      t2
    LEFT   JOIN table3 t3 USING (id)
    WHERE  ON t2.id = t1.id
    )
AND ...
LIMIT 1000;
于 2012-12-26T09:22:57.263 に答える