加入收藏 | 设为首页 | 会员中心 | 我要投稿 大庆站长网 (https://www.0459zz.com/)- 科技、智能边缘云、事件网格、云计算、站长网!
当前位置: 首页 > 数据库 > MsSql > 正文

复杂SQL连接与group by

发布时间:2021-03-31 02:16:06 所属栏目:MsSql 来源:互联网
导读:我正在尝试优化需要很长时间的查询.查询的目标是获得最佳类似的F2.(特殊相似性度量) 这是我的一个例子: CREATE TABLE Test( F1 varchar(124), F2 varchar(124), F3 varchar(124))INSERT INTO TEST ( F1, F2, F3 ) VALUES ( A, B, C )INSERT IN

我正在尝试优化需要很长时间的查询.查询的目标是获得最佳类似的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子句也会通过在最终结果集上产生可能较大的内部排序来影响查询运行时.

(编辑:大庆站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读