加入两个表时缓慢的SQL查询,以何种方式提高查询速度?

时间:2017-10-18 20:41:47

标签: sql oracle join

加入两个表时缓慢的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

这很慢。此外,我只有读取权限,所以我无法创建新表。有什么方法可以改善它吗?感谢。

3 个答案:

答案 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

这两种解决方案都不可行,但它们可能值得一试