6

システムが過負荷になるという問題があります。以下のクエリは 3 つのテーブルからデータを取得しています。そのうちの 2 つには 10.000 を超えるレコードがあり、実行に 50 秒かかります。

SELECT DISTINCT
p.prod_name,
p.prod_price,
Sum(dt.vt_qtd) as total_qtd

FROM tdb_products p 
LEFT JOIN tdb_sales_temp dt ON p.prod_mp_id = dt.vt_product
LEFT JOIN tdb_sales s ON dt.vt_cupom = s.sl_coupom

WHERE
s.sl_day = $day_link AND
s.sl_mon = $mon_link AND
s.sl_year = $year_link

GROUP BY
p.prod_name

ORDER BY
p.prod_name ASC

これは正常ですか?

解決しました!

4

2 に答える 2

10
SELECT  prod_name, prod_price, SUM(dt.vt_qtd) AS total_qtd
FROM    tdb_sales s
JOIN    tdb_sales_temp dt
ON      dt.vt_cupom = s.sl_coupom
JOIN    tdb_products p
ON      p.prod_mp_id = dt.vt_product
WHERE   (s.sl_day, s.sl_mon, s_sl_year) = ($day_link, $mon_link, $year_link)
GROUP BY
        p.prod_name -- but it's better to group by product's PRIMARY KEY

削除します(グループ化フィールドを選択して選択するDISTINCTので冗長です)GROUP BY

'ed テーブルにフィルター条件があるため、次のようにLEFT JOIN書き換えます。INNER JOINLEFT JOIN

インデックスを作成します。

tdb_sales (sl_year, sl_mon, sl_day, sl_coupom)
tdb_sales_temp (vt_cupom, vt_product)
tdp_product (prod_mp_id) -- it's probably a PRIMARY KEY and you already have it
于 2013-01-16T18:35:59.440 に答える
4

短い答えはノーです。一般的なデータベース システムであれば、複数の 10,000 行のテーブルを 1 秒未満の時間で処理できるはずです。

完全なスキーマまたは dbms バックエンドがわからないので、以下を参照することをお勧めします。

インデックス作成 - 結合で使用されている列に適切なインデックスがあることを確認してください。大幅なパフォーマンスの低下。

于 2013-01-16T18:30:35.663 に答える