如何改进这个SQL?

时间:2015-04-23 03:51:21

标签: sql sql-server performance join exists

我的老板给我们发了一个查询,要求我们用更高效的版本替换它,并达到以下目标:

  

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方法也是如此。

1 个答案:

答案 0 :(得分:-1)

existsin是等效的,它们最多都会针对联接进行优化,最糟糕的是......好吧,不是。

你花了好几分钟打字整篇文章,我建议你看一下执行计划,以便更好地利用你的时间。你失去了所有的信誉,我相信" (甚至在阅读其他内容并看到你错了之前),而不是显示硬数据来支持每个替代方案。

编辑:注意那些查询不等同。最上面的一个做了额外的(无用的)排序和过滤(distinct),其他两个没有。