我正在开发一个 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 值(如果有)。
答案 0 :(得分:0)
我终于找到了解决方法:
kubectl logs