Медленный SQL-запрос при объединении таблиц - PullRequest
3 голосов
/ 03 декабря 2010

Этот запрос очень очень медленный, и я не уверен, в чем я ошибаюсь, потому что он слишком медленный.

Я предполагаю, что это как-то связано с таблицей 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 ]

4 голосов
/ 03 декабря 2010

Вам вряд ли удастся использовать какие-либо индексы для 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
3 голосов
/ 03 декабря 2010

Ваше переформатированное утверждение дает мне это

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 (индекс покрытия)
3 голосов
/ 03 декабря 2010

Попробуйте EXPLAIN PLAN и посмотрите, с чем возвращается ваша база данных.

Если вы видите TABLE SCAN, вам может потребоваться добавить индексы.

Этот второй JOIN выглядит довольно странно для меня.Интересно, можно ли это переписать?

...