我正在尝试优化需要很长时间的查询.查询的目标是获得最佳类似的F2.(特殊相似性度量)
这是我的一个例子:
CREATE TABLE Test ( F1 varchar(124),F2 varchar(124),F3 varchar(124) ) INSERT INTO TEST ( F1,F2,F3 ) VALUES ( 'A','B','C' ) INSERT INTO TEST ( F1,F3 ) VALUES ( 'D','E' ) INSERT INTO TEST ( F1,F3 ) VALUES ( 'F','I','G' ) INSERT INTO TEST ( F1,'K' ) INSERT INTO TEST ( F1,'K','K' )
现在,如果我运行此查询:
SELECT B.f2,COUNT(*) AS CNT FROM ( select F1,F3 from Test where F2='B' )AS A INNER JOIN Test AS B ON A.F1 = B.F1 AND A.F3 = B.F3 GROUP BY B.F2 ORDER BY CNT DESC
该表有1米行.
什么是更好的方法来做到这一点?
解决方法
对所有行进行过滤搜索WHERE F2 =’B’将产生全表扫描,除非您创建的索引具有F2作为其第一列或唯一列.再往下,连接条件涉及列F1和F3,您提到它们已经是以F1开头的索引的一部分.
我还注意到,你的查询的第一部分并没有消除T2 =’B’的(T1,T3)集合的重复,正如人们在将该集合右后卫与同一个表的另一个子集交叉时所期望的那样.您可能有理由这样做,但在您提供有关您尝试实施的相似性度量算法的一些详细信息之前,我们无法确切知道.
您的ORDER BY子句也会通过在最终结果集上产生可能较大的内部排序来影响查询运行时.