2017-10-18 325 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