SQL查询优化JOIN多列
Posted
技术标签:
【中文标题】SQL查询优化JOIN多列【英文标题】:SQL query Optimisation JOIN multiple column 【发布时间】:2015-10-19 10:16:48 【问题描述】:我在 Microsoft Access 上有两个表:T_DATAS(大约 200 000 行)和 T_REAF(大约 1000 行)。
T_DATAS 有很多列(大约 30 列),T_REAF 大约有 10 列。
我必须告诉你,我不能更改这些表,也不能创建其他表。我必须使用它。
两个表都有 6 个相同的列。我需要连接这 6 列上的表,以选择 T_DATAS 中的所有列以及 T_REAF 但不在 T_DATAS 中的列。
我的查询是:
SELECT A.*, B.CARROS_NEW, B.SEGT_NEW, B.ATTR
INTO FINALTABLE
FROM T_DATAS A LEFT JOIN T_REAF B ON
A.REGION LIKE B.REGION AND
A.PAYS LIKE B.PAYS AND
A.MARQUE LIKE B.MARQUE AND
A.MODELE LIKE B.MODELE AND
A.CARROS LIKE B.CARROS AND
A.SEGT LIKE B.SEGT
我得到了我需要的结果,但问题是这个查询花费的时间太长而无法给出结果(大约 3 分钟)。 我知道 T_DATAS 包含很多行(200 000),但我认为 3 分钟对于这个查询来说太长了。
您能告诉我这个查询有什么问题吗?
非常感谢您的帮助
【问题讨论】:
你为什么在此处使用 like 进行查询? 另外,考虑在表上放置一些索引以加快查询速度 【参考方案1】:两个步骤。一是将查询更改为使用=
。我不是 100% 确定这是否有必要,但它不会受到伤害。二是创建索引。
所以:
SELECT D.*, R.CARROS_NEW, R.SEGT_NEW, R.ATTR
INTO FINALTABLE
FROM T_DATAS D LEFT JOIN
T_REAF R
ON D.REGION = R.REGION AND
D.PAYS = R.PAYS AND
D.MARQUE = R.MARQUE AND
D.MODELE = R.MODELE AND
D.CARROS = R.CARROS AND
D.SEGT = R.SEGT;
第二,你想要一个T_REAF
的索引:
CREATE INDEX IDX_REAF_6 ON T_REAF(REGION, PAYS, MARQUE, MODELE, CARROS, SEGT);
MS Access 然后可以使用JOIN
的索引,加快查询速度。
请注意,我将表别名更改为表名的缩写。这样更容易遵循查询中的逻辑。
【讨论】:
谢谢!从“LIKE”更改为“AND”使请求更快(大约 30 秒,而不是之前的 3 分钟)。我还创建了索引。有没有办法查看索引是否真的被 Access 使用,还是我必须“信任”它?【参考方案2】:我假设这 6 列相同,也可能具有相同的数据类型。
注意:等于 (=) 运算符是一个比较运算符 - 比较两个值是否相等。因此,在您的查询中将 LIKE
替换为 =
并查看结果时间。
SELECT A.*
,B.CARROS_NEW
,B.SEGT_NEW
,B.ATTR
INTO FINALTABLE
FROM T_DATAS A
LEFT JOIN T_REAF B
ON A.REGION = B.REGION
AND A.PAYS = B.PAYS
AND A.MARQUE = B.MARQUE
AND A.MODELE = B.MODELE
AND A.CARROS = B.CARROS
AND A.SEGT = B.SEGT
【讨论】:
以上是关于SQL查询优化JOIN多列的主要内容,如果未能解决你的问题,请参考以下文章
clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化(代码