2010-12-03 93 views
3

該查詢速度非常慢,我不確定在哪裏出錯導致它很慢。加入表時緩慢的SQL查詢

我猜這是與flight_prices表
有關,因爲如果我刪除該連接,它會從16秒到不到一秒。

SELECT * FROM OPENQUERY(mybook, 
    'SELECT wb.booking_ref 
    FROM web_bookings wb 
      LEFT JOIN prod_info pi ON wb.location = pi.location 
      LEFT JOIN flight_prices fp ON fp.dest_date = pi.dest_airport + '' '' + wb.sort_date 
    WHERE fp.dest_cheapest = ''Y'' 
      AND wb.inc_flights = ''Y'' 
      AND wb.customer = ''12345'' ') 

任何想法,我可以加快這個加入?

回答

4

您不太可能在flight_prices.dest_date上使用任何索引,因爲您並未真正加入另一列,從而導致優化程序難以執行。

如果您可以更改模式,我會這樣做flight_prices.dest_date被拆分爲兩列dest_airport和dest_Date,因爲它似乎是目前機場和日期的組合。如果你這樣做,你可以加入這樣的

fp.dest_date = wb.sort_date and fp.dest_airport = pi.dest_airport 
2

試解釋計劃,看看你的數據庫回來了。

如果您看到TABLE SCAN,則可能需要添加索引。

那第二個JOIN看起來對我來說很奇怪。我想知道這是否可以重寫。

+0

我看到遠程掃描 - 100%,這是否意味着任何人都沒有? – Tom 2010-12-03 13:36:50

+0

您的整個表格正在被掃描並且索引未被使用 – JamieDainton 2010-12-03 13:48:32

3

你的聲明重新格式化,讓我這個

SELECT wb.booking_ref 
FROM web_bookings wb 
     LEFT JOIN prod_info pi ON wb.location = pi.location 
     LEFT JOIN flight_prices fp ON fp.dest_date = pi.dest_airport + ' ' + wb.sort_date 
WHERE fp.dest_cheapest = 'Y' 
     AND wb.inc_flights = 'Y' 
     AND wb.customer = '12345' 

我將確保以下領域具有指標

  • dest_cheapest
  • dest_date
  • 位置
  • 客戶,inc_flights,booking_ref(覆蓋指數)