这应该是J9988的功劳,我现在还在和J9988讨论这个问题,比较你的思路和J9988的,
下面是一些初步的结果:
我有测试了10万条和100万条的数据,我想是I/0的问题,如果是100万条数据,那么你的语句是对2042条数据排序,而楼主的是对617条再加上2次的HASH匹配,所以差别不大.而对于800万条数据,那么你的语句是对14008条数据排序,而楼主的是对2403条再加上2次的HASH匹配,所以速度的差别就出来了.而且我看HASH匹配的速度也非常的快.
j9988 says:
噢,那他的应该快。有道理。但如果列数多了会不会有还是这结果,难说。还有如果条件多了或条件用IN(.....)这样他的语句就不够灵活通用了。
 Ray  says:
你说的对,在100万条记录下,如果检索条件是6列:执行规划就是:71.49%--28.51%(yours),运行时间是106ms---114ms(yours).如果在800万条的记录下就反过来了:执行规划就是:27.76%--72.24%(yours),运行时间是544ms---867ms(yours).

解决方案 »

  1.   

    测试的语句是:
    SET STATISTICS TIME ON
    --Test 4
    SELECT distinct a.[id] FROM 
    stress_test AS a,stress_test AS b,stress_test AS c,stress_test AS d,stress_test AS e,stress_test AS f
    WHERE a.[key]='Ac' AND b.[key]='Bb' AND c.[key]='Ca' AND d.[key]='Da' AND e.[key]='Ea' AND f.[key]='Fa'
          AND a.[id]=b.[id] AND a.[id]=c.[id] AND a.[id]=d.[id]AND a.[id]=e.[id]AND a.[id]=f.[id]
    ORDER BY A.[ID]
    go
    SET STATISTICS TIME off
    go
    SET STATISTICS TIME ON
    go
    select [id] 
    from stress_test  
    where [key]='Ac' or [key]='Bb' or [key]='Ca' or [key]='Da' or [key]='Ea' or [key]='Fa' 
    group by id having(count(distinct [key])=6)
    GO
    SET STATISTICS TIME off
    go
      

  2.   

    楼主高手!
    为了这问题我的leimin玩了两天。
    我太想当然了。