joz*_*ozi 6 sql sql-server join group-by sql-server-2008
我正在尝试优化需要很长时间的查询.查询的目标是获得最佳类似的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, F2, F3 ) VALUES ( 'D', 'B', 'E' )
INSERT INTO TEST ( F1, F2, F3 ) VALUES ( 'F', 'I', 'G' )
INSERT INTO TEST ( F1, F2, F3 ) VALUES ( 'F', 'I', 'G' )
INSERT INTO TEST ( F1, F2, F3 ) VALUES ( 'D', 'B', 'C' )
INSERT INTO TEST ( F1, F2, F3 ) VALUES ( 'F', 'B', 'G' )
INSERT INTO TEST ( F1, F2, F3 ) VALUES ( 'D', 'I', 'C' )
INSERT INTO TEST ( F1, F2, F3 ) VALUES ( 'A', 'B', 'C' )
INSERT INTO TEST ( F1, F2, F3 ) VALUES ( 'A', 'B', 'K' )
INSERT INTO TEST ( F1, F2, F3 ) VALUES ( 'A', 'K', 'K' )
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行此查询:
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
Run Code Online (Sandbox Code Playgroud)
该表有1米+行.什么是更好的方法来做到这一点?
对所有行的筛选搜索WHERE F2 = 'B'将导致全表扫描,除非您创建将 F2 作为其第一列或唯一列的索引。再往下,连接条件涉及列 F1 和 F3,您提到它们已经是以 F1 开头的索引的一部分。
我还注意到,查询的第一部分并没有消除 (T1, T3) 集合(其中 T2 = 'B')的重复项,正如人们在将该集合与同一个表的另一个子集相交时所期望的那样。您可能有这样做的理由,但在您提供有关您尝试实现的相似性测量算法的一些详细信息之前,我们无法确定。
您的ORDER BY子句还会对最终结果集进行潜在的大型内部排序,从而影响查询运行时间。