0

EVENTSTOCKLINK からのフィールドを持つ ACTION レコードのリストを生成しようとしています (存在する場合) 私のクエリは以前は次のようでした

SELECT 
  action.actionid,
  partex.stockmake AS partexmake, 
  partex.stockmod AS partexmod
FROM
  ACTION 
  INNER JOIN EVENT 
    ON action.eventid = event.eventid 
  LEFT JOIN 
    (SELECT registrationnumber,stockmake,stockmod,stocktran,eventid 
    FROM eventstocklink 
  LEFT JOIN stock ON stock.stockid = eventstocklink.stockid 
WHERE statusid = '5'
GROUP BY eventstocklink.eventid
) AS partex 
ON partex.eventid = event.eventid 
WHERE actiondate2 BETWEEN 20130601 
  AND 20131031 
  AND event.siteid = 1 
  AND action.typeid = 1 

このクエリには 4 秒以上かかります。スレッドからのアドバイスに従って、SELECT 行でサブクエリを実行しており、このようなクエリを作成することで実行時間を短縮できます。

SELECT action.actionid,
 (SELECT stockmake FROM eventstocklink
  LEFT JOIN stock ON stock.stockid = eventstocklink.stockid 
  WHERE statusid = '5' AND eventstocklink.eventid = event.eventid
 GROUP BY eventstocklink.eventid) partexmake,
 (SELECT stockmod FROM eventstocklink
  LEFT JOIN stock ON stock.stockid = eventstocklink.stockid 
  WHERE statusid = '5' AND eventstocklink.eventid = event.eventid
 GROUP BY eventstocklink.eventid) partexmod
FROM
  ACTION 
  INNER JOIN EVENT 
    ON action.eventid = event.eventid 
WHERE actiondate2 BETWEEN 20130601 
  AND 20131031 
  AND event.siteid = 1 
  AND action.typeid = 1  

これがこのクエリを構成する最良の方法ですか - 「statusid=5」を持つ STOCK テーブルのフィールドをさらに含めたいと思います

4

1 に答える 1

1

新しいクエリには、パフォーマンスが低下する傾向がある相関サブクエリがありますが、元のクエリでサブクエリが必要かどうかはわかりません。

テーブルのインデックスを知ることは、現在のクエリが苦労している本当の理由であると思われるため、役立ちます (たとえば、eventstocklink.eventid にインデックスはありますか)。

このようなことを試してください:-

SELECT 
  action.actionid,
  MAX(partex.stockmake) AS partexmake, 
  MAX(partex.stockmod) AS partexmod
FROM ACTION 
INNER JOIN EVENT 
ON action.eventid = event.eventid 
LEFT JOIN eventstocklink
ON eventstocklink.eventid = event.eventid
LEFT JOIN stock 
ON stock.stockid = eventstocklink.stockid 
AND stock.statusid = '5'
WHERE actiondate2 BETWEEN 20130601 AND 20131031 
AND event.siteid = 1 
AND action.typeid = 1 
GROUP BY action.actionid

これは、一致するものが複数ある場合に、どの stockmake または stockmod が返されるかを気にしていないことを前提としています (既存のクエリでは、どれが返されるかを定義しようとしないため)。

于 2013-10-17T12:02:32.547 に答える