连接两个表时SQL查询速度慢,有没有办法提高查询速度?

连接两个表时SQL查询速度慢,有没有办法提高查询速度?,sql,oracle,join,Sql,Oracle,Join,连接两个表时SQL查询速度慢,有没有办法提高查询速度 我有一个小表a和一个大表B。a有我们需要的所有列,除了类型列,类型值只能在B中找到。但是B有太多无用的行 现在我想选择A中的所有行,它们应该具有all column plus类型。我的想法是使用leftjoin,因为它可以从B中选择A中存在的所有行,所以我们可以得到类型值 甲骨文: SELECT B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE FROM A LEFT JOIN B ON A.HOUR=B

连接两个表时SQL查询速度慢,有没有办法提高查询速度

我有一个小表a和一个大表B。a有我们需要的所有列,除了类型列,类型值只能在B中找到。但是B有太多无用的行

现在我想选择A中的所有行,它们应该具有all column plus类型。我的想法是使用leftjoin,因为它可以从B中选择A中存在的所有行,所以我们可以得到类型值

甲骨文:

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

它非常慢。此外,我只有读取权限,因此无法创建新表。有什么方法可以改进吗?谢谢。

对于您的查询,您需要
b(小时、地点、价格、日期)
上的索引

列的顺序实际上并不重要

我认为你的问题应该写为:

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;

对于您的查询,您需要
b(小时、地点、价格、日期)
上的索引

列的顺序实际上并不重要

我认为你的问题应该写为:

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;

联接的问题是它试图匹配多个键,但没有一个键是整数。使用子查询,而不是尝试修复该问题(您无论如何都没有权限)

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

联接的问题是它试图匹配多个键,但没有一个键是整数。使用子查询,而不是尝试修复该问题(您无论如何都没有权限)

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

在看不到实际数据或无法添加索引等情况下,很难提供建议,但您可以尝试以下几种方法:

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) 将CTE中较大的“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

这两种解决方案都可能不起作用,但在没有看到实际数据或无法添加索引等情况下,它们可能值得一试。很难提供建议,但您可以尝试以下几种方法:

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) 将CTE中较大的“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

这两种解决方案都可能不起作用,但它们可能值得一试。请确保ON子句中的所有列都是索引的,没有任何权限,只有读取,你不能做太多。运行解释计划和发布结果我想你需要内部连接表和索引定义。请确保你的ON子句中的所有列都是索引的,没有任何特权,但是读取,你不能做太多。运行解释计划和发布结果我想你需要内部连接你建议使用通配符吗?你知道这是错误的。只是懒得打字。你是在推荐一个通配符吗?你知道这是错误的。只是懒得打字。