Мой босс послал нам запрос и попросил заменить его на более эффективный вариант и для достижения следующих целей:Как улучшить этот 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
.
Вы просмотрели планы выполнения запроса для трех вариантов запроса? – Jackson
Сравните планы выполнения и проверьте данные, аналогичные фактическому набору. Нет необходимости предполагать, что было бы лучше, если бы его можно было измерить. –
Я использую студию управления SQL. Мое время выполнения немного странно. Для использования метода IN первое исполнение будет меня около 90 + мс, второе выполнение получило меня как 200 мс, третье выполнение - до 90+ мс. Поэтому я не уверен, какое время выполнения я должен ссылаться. – VincentPzc