Comparaison de la gestion des requêtes lentes MySQL dans une relation maître-détails entre deux tables : un guide étape par étape
P粉724256860
P粉724256860 2023-09-13 16:56:06
0
1
491

S'il vous plaît, aidez-moi.. J'ai une requête comme celle-ci : Voici un tableau :

  1. delivery_order
  2. delivery_order_item
  3. bst
  4. bst_item

Je souhaite afficher les éléments qui existent dans la table delivery_order/item mais pas dans la table bst/item, en comparant en fonction de KODE_BARANG et JUMLAH.

J'ai l'instruction de requête suivante, mais elle est toujours très lente s'il y a déjà beaucoup de données (la partie lente compare les lignes de KODE_BARANG). Je voudrais demander si l'un de mes amis a une situation similaire et comment la résoudre ? Merci d'avance, j'espère que quelqu'un ici sera prêt à répondre.

SELECT
    del.KODE_DO,
    deli.KODE_BARANG,
    deli.NAMA_BARANG,
    deli.JUMLAH,
    deli.SATUAN,
    @DITERIMA := COALESCE ((
        SELECT
            SUM( JUMLAH ) 
        FROM
            bst_item 
        WHERE
            KODE_PENERIMAAN = deli.KODE_DO
            AND KODE_BARANG = deli.KODE_BARANG  #这行使它变慢
            AND `STATUS` <> 0),0) AS DITERIMA,
    COALESCE ( deli.JUMLAH, 0 ) - @DITERIMA AS SISA
FROM
    delivery_order del
    INNER JOIN delivery_order_item deli ON del.KODE_DO = deli.KODE_DO
WHERE
    DATE(del.TANGGAL) >= :TGL1
    AND DATE(del.TANGGAL) <= :TGL2  
    AND COALESCE ( deli.JUMLAH, 0 ) - COALESCE ((
        SELECT
            SUM( JUMLAH ) 
        FROM
            bst_item 
        WHERE
            KODE_PENERIMAAN = deli.KODE_DO
            AND KODE_BARANG = deli.KODE_BARANG  #这行使它变慢
            AND `STATUS` <> 0),0) > 0
SELECT
    del.KODE_DO,
    deli.KODE_BARANG,
    deli.NAMA_BARANG,
    deli.JUMLAH,
    deli.SATUAN,
    @DITERIMA := COALESCE ((
        SELECT
            SUM( JUMLAH ) 
        FROM
            bst_item 
        WHERE
            KODE_PENERIMAAN = deli.KODE_DO
            AND KODE_BARANG = deli.KODE_BARANG  #这行使它变慢
            AND `STATUS` <> 0),0) AS DITERIMA,
    COALESCE ( deli.JUMLAH, 0 ) - @DITERIMA AS SISA
FROM
    delivery_order del
    INNER JOIN delivery_order_item deli ON del.KODE_DO = deli.KODE_DO
WHERE
    DATE(del.TANGGAL) >= :TGL1
    AND DATE(del.TANGGAL) <= :TGL2  
    AND COALESCE ( deli.JUMLAH, 0 ) - COALESCE ((
        SELECT
            SUM( JUMLAH ) 
        FROM
            bst_item 
        WHERE
            KODE_PENERIMAAN = deli.KODE_DO
            AND KODE_BARANG = deli.KODE_BARANG  #这行使它变慢
            AND `STATUS` <> 0),0) > 0

P粉724256860
P粉724256860

répondre à tous(1)
P粉652523980
INDEX(KODE_PENERIMAAN, KODE_BARANG, `STATUS`)

Et ne cachez pas TANGGAL dans les appels de fonction. (cf "sargable")

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal