小编Vic*_*ria的帖子

如何加快按计算字段排序的查询?

我会试着举一个例子 - 这不是我的表格结构 - 我只是想概述这个问题以找到解决方案......

人员 ID、姓名

BrothersNames Id, 名称

SistersNames Id, 名字

PersonBrothers(连接表)PersonId、BrotherNameId

PersonSisters(连接表)PersonId、SisterNameId

好的 - 想象一下这个数据库包含来自一个小国家的每个人。数据库记录了每个人的兄弟姐妹的名字(它不会将一个人映射到他们的兄弟姐妹——只是他们的名字),以便我们可以找到关于名字的统计数据。

显然很多名字是共享的,所以连接表为我们规范了这一点。

我想要做的是取一个用户,找出系统中每个其他用户的兄弟姓名匹配数和姐妹姓名匹配数,然后将这两个匹配项加在一起并按降序排列。所以这会给我们一个拥有最多兄弟姐妹名字的用户列表。

我真的只对前十场比赛感兴趣,但我认为我必须得到整个结果集才能计算出前十场比赛。

请注意,在我的实际数据中,一个人可以有一百万个兄弟或一百万个姐妹。这是我遇到性能问题的地方。

这就是我计算兄弟匹配的方式,我为姐妹计算匹配

select p.id, matches
FROM Person p
LEFT JOIN 
        (
            SELECT 
            COUNT(*) AS Matches,
            pbn.PersonId
            FROM PersonBrothersNames pbn
            INNER JOIN Brothersnames bn on pbn.BrothernameId =bn.Id
            inner join PersonBrothersName otherpbn on otherpbn.BrothernameId = bn.Id

            WHERE pbn.PersonId= @PersonId and pbn.PersonId <> otherpbn.personid
            GROUP BY  pbn.PersonId

        ) As BrothersNamesJoin ON BrothersNamesJoin.Person = p.Id
Run Code Online (Sandbox Code Playgroud)

请让我知道我是否应该指定更多信息...我使用的是 SQL Server 2008,但可能与平台无关...

sql-server

4
推荐指数
1
解决办法
3488
查看次数

标签 统计

sql-server ×1