MySQL优化视图

时间:2019-01-12 18:05:32

标签: mysql sql asp.net

我正在开发一个 ASP.NET 应用程序,该应用程序使用以下查询来检索要馈入 GridView 的数据。 该查询工作正常,但完成起来非常缓慢(即使通过MySQL Workbench运行)。 对于相当差的数据库(即数据量不如预期填充的数据库),查询大约需要7秒钟才能完成。 该查询在 MySQL 中定义为一个视图,并通过 SQLDataSource 绑定到 GridView 。 我想对其进行优化,但是我在SQL方面的表现不佳。

SELECT 
        `noleggio`.`iddocumento` AS `iddocumento`,
        `noleggio`.`numero` AS `numero`,
        `noleggio`.`serie` AS `serie`,
        `noleggio`.`data` AS `data`,
        `noleggio`.`anno` AS `anno`,
        `noleggio`.`cliente_ragione_sociale` AS `cliente_ragione_sociale`,
        `noleggio`.`imponibile` AS `imponibile`,
        `noleggio`.`totale` AS `totale`,
        `noleggio`.`tipo_documento` AS `tipo_documento`,
        `noleggio`.`tipo_documento_dettaglio` AS `tipo_documento_dettaglio`,
        `noleggio`.`data_pagamento` AS `data_pagamento`,
        `noleggio`.`aliquota_ritenuta_acconto` AS `aliquota_ritenuta_acconto`,
        `noleggio`.`ra_percentuale_importo_imponibile` AS `ra_percentuale_importo_imponibile`,
        `noleggio`.`aliquota_ritenuta_enasarco` AS `aliquota_ritenuta_enasarco`,
        `noleggio`.`re_percentuale_importo_imponibile` AS `re_percentuale_importo_imponibile`,
        `noleggio`.`id_noleggio` AS `id_noleggio`,
        `stati`.`data_stato` AS `data_stato`,
        `stati`.`stato` AS `stato_sdi`,
        `noleggio_veicoli_fatturazione`.`data_incasso_saldo` AS `data_incasso_saldo`
    FROM
        (((SELECT 
            `noleggio`.`iddocumento` AS `iddocumento`,
                `noleggio`.`numero` AS `numero`,
                `noleggio`.`serie` AS `serie`,
                `noleggio`.`data` AS `data`,
                `noleggio`.`anno` AS `anno`,
                `noleggio`.`cliente_ragione_sociale` AS `cliente_ragione_sociale`,
                `noleggio`.`imponibile` AS `imponibile`,
                `noleggio`.`totale` AS `totale`,
                `noleggio`.`tipo_documento` AS `tipo_documento`,
                `noleggio`.`tipo_documento_dettaglio` AS `tipo_documento_dettaglio`,
                `noleggio`.`data_pagamento` AS `data_pagamento`,
                `noleggio`.`aliquota_ritenuta_acconto` AS `aliquota_ritenuta_acconto`,
                `noleggio`.`ra_percentuale_importo_imponibile` AS `ra_percentuale_importo_imponibile`,
                `noleggio`.`aliquota_ritenuta_enasarco` AS `aliquota_ritenuta_enasarco`,
                `noleggio`.`re_percentuale_importo_imponibile` AS `re_percentuale_importo_imponibile`,
                `doc_righe`.`id_noleggio` AS `id_noleggio`
        FROM
            (`doc_righe`
        JOIN (SELECT 
            `doc_testa`.`id` AS `iddocumento`,
                `doc_testa`.`numero` AS `numero`,
                `doc_testa`.`serie` AS `serie`,
                `doc_testa`.`data` AS `data`,
                `doc_testa`.`anno` AS `anno`,
                `doc_testa`.`cliente_ragione_sociale` AS `cliente_ragione_sociale`,
                `doc_testa`.`imponibile` AS `imponibile`,
                `doc_testa`.`totale` AS `totale`,
                `doc_testa`.`tipo_documento` AS `tipo_documento`,
                `doc_testa`.`tipo_documento_dettaglio` AS `tipo_documento_dettaglio`,
                `doc_testa`.`data_pagamento` AS `data_pagamento`,
                `doc_testa`.`aliquota_ritenuta_acconto` AS `aliquota_ritenuta_acconto`,
                `doc_testa`.`ra_percentuale_importo_imponibile` AS `ra_percentuale_importo_imponibile`,
                `doc_testa`.`aliquota_ritenuta_enasarco` AS `aliquota_ritenuta_enasarco`,
                `doc_testa`.`re_percentuale_importo_imponibile` AS `re_percentuale_importo_imponibile`
        FROM
            `doc_testa`) `noleggio` ON ((`noleggio`.`iddocumento` = `doc_righe`.`id_testa`)))
        GROUP BY `noleggio`.`iddocumento`) `noleggio`
        LEFT JOIN `noleggio_veicoli_fatturazione` ON ((`noleggio`.`id_noleggio` = `noleggio_veicoli_fatturazione`.`id_noleggio`)))
        LEFT JOIN (SELECT 
            `transizioni_sdi`.`id` AS `id`,
                `transizioni_sdi`.`id_doc` AS `id_doc`,
                MAX(`transizioni_sdi`.`data_stato`) AS `data_stato`,
                `tab_stati_sdi`.`stato` AS `stato`
        FROM
            (`transizioni_sdi`
        JOIN `tab_stati_sdi` ON ((`tab_stati_sdi`.`id` = `transizioni_sdi`.`stato`)))
        GROUP BY `transizioni_sdi`.`id_doc`) `stati` ON ((`noleggio`.`iddocumento` = `stati`.`id_doc`)))
    ORDER BY `noleggio`.`numero`;

请注意,查询最初使用的是 RIGHT JOIN 语句,但是当我将其保存为MySQl WB中的View时,由于某种原因已解决 RIGHT用这种结构加入。 这是原始查询:

SELECT 
    noleggio.*,
    stati.data_stato AS data_stato,
    stati.stato AS stato_sdi,
    data_incasso_saldo
FROM
    noleggio_veicoli_fatturazione
        RIGHT JOIN
    (SELECT 
        noleggio.*, id_noleggio
    FROM
        doc_righe
    JOIN (SELECT 
        id AS iddocumento,
            anno,
            numero,
            serie,
            data,
            cliente_ragione_sociale,
            imponibile,
            totale,
            tipo_documento,
            tipo_documento_dettaglio,
            data_pagamento,
            aliquota_ritenuta_acconto,
            ra_percentuale_importo_imponibile,
            aliquota_ritenuta_enasarco,
            re_percentuale_importo_imponibile
    FROM
        doc_testa) AS noleggio ON noleggio.iddocumento = doc_righe.id_testa
    GROUP BY iddocumento) AS noleggio ON noleggio.id_noleggio = noleggio_veicoli_fatturazione.id_noleggio
        LEFT JOIN
    (SELECT 
        transizioni_sdi.id,
            id_doc,
            MAX(data_stato) AS data_stato,
            tab_stati_sdi.stato AS stato
    FROM
        transizioni_sdi
    INNER JOIN tab_stati_sdi ON tab_stati_sdi.id = transizioni_sdi.stato
    GROUP BY id_doc) AS stati ON noleggio.iddocumento = stati.id_doc
ORDER BY numero DESC;

该查询旨在在 doc_righe 中找到所有具有至少一条匹配记录的 doc_testa 记录(在此应用程序中始终为true),这是 doc_righe唯一需要的字段 id_noleggio (当然,该字段值可以是 null )。 id_noleggio 用于在 noleggio_veicoli_fatturazione (如果有)中查找匹配项,并检索 data_incasso_saldo 值。然后,对于所有 doc_testa 记录,我们需要找到最后一个匹配的 tab_stati_sdi.stato 值(如果有)。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方法:

kubectl logs