2015-04-23 2 views
-1

Мой босс послал нам запрос и попросил заменить его на более эффективный вариант и для достижения следующих целей:Как улучшить этот SQL?

Получить все записи из PACKAGE таблицы, которая имеет, по меньшей мере, 1 запись в PASS_PACKAGE_DETAILS таблице.

Учитывая SQL:

SELECT DISTINCT 
    pckg.* 
FROM 
    PASS_PACKAGE pckg 
JOIN 
    PASS_PACKAGE_DETAILS pckg_dtl ON (pckg.PACKAGE_ID = pckg_dtl.PACKAGE_ID) 
WHERE 
    IS_ACTIVE = 1 
    AND '2015/04/22' BETWEEN DATE_START AND DATE_END 
ORDER BY 
    PACKAGE_NAME 

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

My SQL:

Попытка # 1 - с помощью IN:

SELECT 
    pckg.* 
FROM 
    PASS_PACKAGE pckg 
WHERE 
    IS_ACTIVE = 1 
    AND '2015/04/22' BETWEEN DATE_START AND DATE_END 
    AND pckg.PACKAGE_ID IN (SELECT DISTINCT pckg_dtl.PACKAGE_ID 
          FROM PASS_PACKAGE_DETAILS pckg_dtl) 
ORDER BY 
    PACKAGE_NAME 

Попытка # 2 - с помощью EXISTS:

SELECT 
    pckg.* 
FROM 
    PASS_PACKAGE pckg 
WHERE 
    IS_ACTIVE = 1 
    AND '2015/04/22' BETWEEN DATE_START AND DATE_END 
    AND EXISTS (SELECT pckg_dtl.PACKAGE_ID 
       FROM PASS_PACKAGE_DETAILS pckg_dtl 
       WHERE pckg_dtl.package_id = pckg.package_id) 
ORDER BY 
    PACKAGE_NAME 

Надежда, чтобы получить ценную информацию от специалистов здесь!

EDIT: Я использую SQL Server Management Studio. Мое время выполнения немного странно. Для метода IN 1-е исполнение займет около 90 + мс, второе выполнение - 200 мс, 3-е исполнение - до 90+ мс. Поэтому я не уверен, какое время выполнения я должен ссылаться. То же самое касается метода EXISTS.

+1

Вы просмотрели планы выполнения запроса для трех вариантов запроса? – Jackson

+1

Сравните планы выполнения и проверьте данные, аналогичные фактическому набору. Нет необходимости предполагать, что было бы лучше, если бы его можно было измерить. –

+0

Я использую студию управления SQL. Мое время выполнения немного странно. Для использования метода IN первое исполнение будет меня около 90 + мс, второе выполнение получило меня как 200 мс, третье выполнение - до 90+ мс. Поэтому я не уверен, какое время выполнения я должен ссылаться. – VincentPzc

ответ

-1

exists и in эквивалентны, и оба они в лучшем случае оптимизированы для соединения, а в худшем случае.

Вы потратили несколько хороших минут, набрав все это сообщение, я предлагаю вместо этого рассмотреть план исполнения, как лучшее использование вашего времени. Вы потеряли доверие к «Я верю» (даже перед тем, как прочесть остальное и увидеть, что вы ошибаетесь) вместо того, чтобы показывать жесткие данные для поддержки каждой альтернативы.

Редактировать: с учетом того, что эти запросы не являются эквивалентными. Верхняя часть делает дополнительный (бесполезный) сортировать и фильтровать (distinct), где остальные два не делают.

Смежные вопросы