2

私はこのビューを持っています:

CREATE VIEW invoicereport
SELECT i.ID, SUM(o.Amount * o.Price) AS Total
FROM invoice i
JOIN `order` o ON i.ID = o.InvoiceID
GROUP BY i.ID

このクエリを直接実行すると、0.03 秒かかります。ただし、ビューの実行には 2 秒かかります。私がやっSELECT * FROM invoicereport WHERE ID=9000たとしても、まだ2秒かかります。

したがって、ビューを次のように書き直します。

CREATE VIEW invoicereport
SELECT i.ID, (SELECT SUM(Amount * Price) FROM `order` WHERE InvoiceID=i.ID) AS Total
FROM invoice i

サブクエリはID 9000に対してのみ実行されると思っていました。その後、実行SELECT * FROM invoicereport WHERE ID=9000するとさらに遅くなり、完了するまでに3秒かかります。

このクエリを最適化する他の方法はありますか?

4

2 に答える 2

0

Kuya Johnのコメントに同意します。このような単純な要約では、それをビューとして実行しようとさえしないでください。その単純さは、結合を行う必要がありません。数年前に、誰かが既存のビューを使用していて、彼のクエリがわいせつな時間だったという同様の別の回答がありました。クエリの生のテーブルに戻って直接書き込むように依頼したところ、クエリは非常に読みやすく、非常に高速でした。ビューを使用しないでください。直接選択ステートメントとして使用してください。

サブセレクトのようなビューは、典型的にはクエリ時間のキラーであり、私は常に両方を避けるようにしています.

他の請求書データも探しているので、取得するのに問題はありません... しかし、より大きな確認です... 注文テーブルには請求書 ID のインデックスがありますか?

SELECT 
      I.ID, 
      I.Customer_Name,
      I.Tel,
      SUM(o.Amount * o.Price) AS Total
   FROM 
      invoice I
         JOIN `order` o ON I.ID = O.InvoiceID
   WHERE
      I.ID = 9000
   GROUP BY 
      I.ID
于 2012-12-08T11:27:47.173 に答える
0

これらのテーブルを結合する必要はないと思います。グループ化orderするだけで十分です。(私の意見です)。このような:

CREATE VIEW INVOICEREPORT
SELECT O.INVOICEID as ID, SUM(O.AMOUNT * O.PRICE) AS TOTAL
FROM `ORDER` O
GROUP BY O.INVOICEID

次に、このビューを他のユーザーと結合できます。でインデックスを使用しますorder

于 2012-12-08T08:46:22.733 に答える