2017-10-18 94 views
0

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

这是非常缓慢的。此外,我只有读权限,所以我不能创建新表。有什么方法可以改进它吗?谢谢。

+1

表和索引定义请。 – jarlh

+0

确保ON子句中的所有列都被编入索引 – SEarle1986

+2

没有任何权限但只能读取,您无法做太多工作。 – jarlh

回答

1

没有看到实际的数据或能添加索引等很难提供咨询,但有几个方法可以尝试:

一)使用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 

这是可能的,无论是解决方案的工作,但他们可能是值得一试

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; 
+0

你正在推荐一个通配符?你知道这是错的。只是懒得打字。 – Hogan

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