【问题标题】:Slow SQL query when join two tables, any way to improve the query speed?连接两个表时SQL查询慢,有什么方法可以提高查询速度?
【发布时间】:2017-10-18 20:41:47
【问题描述】:

连接两个表时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

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

【问题讨论】:

  • 请定义表和索引。
  • 确保您的 ON 子句中的所有列都已编入索引
  • 除了阅读之外没有任何权限,你什么都做不了。
  • 运行解释计划并发布结果
  • 我想你想要内部加入

标签: sql oracle join


【解决方案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

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

【讨论】:

    【解决方案2】:

    对于您的查询,您需要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;
    

    【讨论】:

    • 您要推荐通配符?你知道那是错误的。只是懒惰打字。
    【解决方案3】:

    连接的问题是它试图匹配多个键,并且它们都不是整数。与其尝试解决这个问题(无论如何您都没有权限),不如使用子查询。

    子查询只取 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多