慢速 Union All 和左外连接查询

问题描述 投票:0回答:1

我想基于三个不同的源(表)创建一个结果集:

  • 报告(540 条记录)
  • 业务术语(300条记录)
  • 属性(50万条记录)

以下 SQL 运行良好:

SELECT report.code AS code, report.name AS name, 'report' AS type, report.class AS class 
FROM report
UNION ALL
SELECT businessterm.id AS code, businessterm.business_term AS name, 'business_term' AS type, businessterm.class AS class 
FROM businessterm
UNION ALL
SELECT attributes.table_name AS code, attributes.column_name AS name, 'attributes' AS type, 'P0' AS class
FROM attributes;

但是,对于属性表,

class
元素必须从另一个表(attributes_class,600k 条记录)连接。

据我所知,最终的 SQL 应该是这样的:

SELECT report.code AS code, report.name AS name, 'report' AS type, report.class AS class 
FROM report
UNION ALL
SELECT businessterm.id AS code, businessterm.business_term AS name, 'business_term' AS type, businessterm.class AS class 
FROM businessterm
UNION ALL
SELECT a.table_name AS code, a.column_name AS name, 'attributes' AS type, a.class AS class
FROM (
    SELECT attributes.table_name, attributes.column_name, attributes_class.class as class
    FROM attributes
    INNER JOIN attributes_class ON attributes_class.attribute_id = attributes.id
    ) AS a;

当我执行所有单独的查询时,它们运行得非常好。但是,当组合到单个查询时,它会继续运行。

sql mariadb
1个回答
0
投票

使用 UNION ALL 将多个查询合并为单个查询通常是高效的,但有时会导致性能问题,特别是在处理大型表或复杂联接时。在您的情况下,您将在子查询中将属性表与attributes_class 表连接起来。此子查询可能会导致性能问题,特别是因为属性表包含 500k 记录,attributes_class 表包含 600k 记录。

以下是一些优化查询的建议:

使用 INNER JOIN 而不是子查询: 不使用子查询,而是使用 INNER JOIN 将属性表直接与 attribute_class 表连接。

索引: 确保在连接涉及的列(attributes.id 和attributes_class.attribute_id)上创建适当的索引。索引可以显着提高连接操作的性能。

检查执行计划: 使用数据库的查询执行计划功能来分析查询是如何执行的。这可以帮助识别任何瓶颈或需要优化的领域。

这是包含上述建议的优化查询:

SELECT report.code AS code, report.name AS name, 'report' AS type, report.class AS class 
FROM report
UNION ALL
SELECT businessterm.id AS code, businessterm.business_term AS name, 'business_term' AS type, businessterm.class AS class 
FROM businessterm
UNION ALL
SELECT attributes.table_name AS code, attributes.column_name AS name, 'attributes' AS type, attributes_class.class AS class
FROM attributes
INNER JOIN attributes_class ON attributes_class.attribute_id = attributes.id;

确保在attributes表的id列和attributes_class表的attribute_id列上创建适当的索引以获得最佳性能。此外,监视查询执行以确保它在您的数据集上高效执行。

© www.soinside.com 2019 - 2024. All rights reserved.