加入两个表时速度很慢的SQL查询,以任何方式提高查询速度?
问题描述:
加入两个表时速度很慢的SQL查询,以任何方式提高查询速度?加入两个表时速度很慢的SQL查询,以任何方式提高查询速度?
我有一个小表A和大表B. A有我们需要的所有列,TYPE列除外,TYPE值只能在B中找到。但是B有太多无用的行。
现在我想从A中选择所有行,并且它们应该包含所有列和TYPE。我的想法是使用左连接,因为它可以选择B中存在于A中的所有行,所以我们可以获得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
这是非常缓慢的。此外,我只有读权限,所以我不能创建新表。有什么方法可以改进它吗?谢谢。
答
没有看到实际的数据或能添加索引等很难提供咨询,但有几个方法可以尝试:
一)使用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)组中的CTE或者到一个临时TA较大的“b”表竹叶提取
;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
这是可能的,无论是解决方案的工作,但他们可能是值得一试
答
为了您的查询,您需要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;
+0
你正在推荐一个通配符?你知道这是错的。只是懒得打字。 – Hogan
答
问题与连接是它试图匹配多个键,并且他们都不是整数。而不是试图解决这个问题(无论如何您都没有权限),请使用子查询。
子查询只需要在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
表和索引定义请。 – jarlh
确保ON子句中的所有列都被编入索引 – SEarle1986
没有任何权限但只能读取,您无法做太多工作。 – jarlh