加入表时缓慢的SQL查询

时间:2010-12-03 13:22:53

标签: sql join left-join

这个查询非常慢,而且我不确定我哪里出错会导致它太慢。

我猜这与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'' ')

任何想法如何加快这种加入?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

尝试使用EXPLAIN PLAN,查看数据库返回的内容。

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

第二次加入对我来说很奇怪。我想知道是否可以改写。

答案 2 :(得分: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
  • 位置
  • customer,inc_flights,booking_ref(覆盖索引)