加入两个表时缓慢的SQL查询,以何种方式提高查询速度?
我有一个小表A和一个大表B.我有我们需要的所有列,TYPE列除外,TYPE值只能在B中找到。但是B有太多无用的行。
现在我想从A中选择所有行,它们应该包含所有列和TYPE。我的想法是使用左连接,因为它可以选择A中存在的所有B行,所以我们可以得到TYPE值。
甲骨文:
SELECT B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE
FROM A LEFT JOIN B
ON A.HOUR=B.HOUR AND A.LOCATION=B.LOCATION AND A.PRICE=B.PRICE AND A.DATE=B.DATE
这很慢。此外,我只有读取权限,所以我无法创建新表。有什么方法可以改善它吗?感谢。
答案 0 :(得分:1)
对于您的查询,您需要b(hour, location, price, date)
上的索引。
列的顺序并不重要。
我认为您的查询应该写成:
SELECT a.*, b.type
FROM A LEFT JOIN
B
ON A.HOUR = B.HOUR AND A.LOCATION = B.LOCATION AND
A.PRICE = B.PRICE AND A.DATE = B.DATE;
答案 1 :(得分:1)
连接的问题是它试图匹配多个键,并且它们都不是整数。而不是试图解决这个问题(你还没有获得许可),使用子查询。
子查询仅获取A行,并在B中添加具有匹配条件的单个字段:
SELECT A.HOUR, A.LOCATION, A.PRICE,
,(SELECT TYPE
FROM B
WHERE B.HOUR = A.HOUR AND B.LOCATION = A.LOCATION
AND B.PRICE = A.PRICE AND B.DATE = A.DATE
) AS [Type]
,A.DATE
FROM A
答案 2 :(得分:1)
如果没有查看实际数据或能够添加索引等,很难提供建议,但您可以尝试以下几种方法:
a)使用Exists而不是JOIN
SELECT B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE
FROM B
WHERE EXISTS ( SELECT 1 FROM A
WHERE A.HOUR=B.HOUR AND A.LOCATION=B.LOCATION AND A.PRICE=B.PRICE AND A.DATE=B.DATE)
b)将较大的'B'表分组到CTE或临时表中
;WITH data as (
SELECT B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE
FROM B
GROUP BY B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE
)
SELECT Data.HOUR, Data.LOCATION, Data.PRICE, Data.TYPE, Data.DATE
FROM Data
INNER JOIN A
ON A.HOUR=Data.HOUR AND A.LOCATION=Data.LOCATION AND A.PRICE=Data.PRICE AND A.DATE=Data.DATE
这两种解决方案都不可行,但它们可能值得一试