我的老板给我们发了一个查询,要求我们用更高效的版本替换它,并达到以下目标:
从
PACKAGE
表中获取所有记录,其中PASS_PACKAGE_DETAILS
表中至少有1条记录。
给定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之后,我想知道我的哪个查询确实达到了我的老板要求及其原因。
我的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
希望从这里获得专家的宝贵信息!
编辑:我正在使用SQL Server Management Studio。我的执行时间有点怪异。对于IN
方法,第一次执行大约需要90 ms以上,第二次执行需要200 ms,第三次执行需要大约90+ ms。所以我不确定我应该参考哪个执行时间。 EXISTS
方法也是如此。
答案 0 :(得分:-1)
exists
和in
是等效的,它们最多都会针对联接进行优化,最糟糕的是......好吧,不是。
你花了好几分钟打字整篇文章,我建议你看一下执行计划,以便更好地利用你的时间。你失去了所有的信誉,我相信" (甚至在阅读其他内容并看到你错了之前),而不是显示硬数据来支持每个替代方案。
编辑:注意那些查询不等同。最上面的一个做了额外的(无用的)排序和过滤(distinct
),其他两个没有。