1

我的查询很简单:

select  a.ID, a.adres, a.place, a.postalcode  
from COMPANIES a, COMPANIES b  
where a.Postcode = b.Postcode  
and a.Adres = b.Adres  
and (  
select COUNT(COMPANYID)  
from USERS  
where COMPANYID=a.ID  
)>(  
select COUNT(COMPANYID)  
from USERS  
where COMPANYID=b.ID  
)

数据库:sql server 2008 r2

我正在尝试做的事情: COMPANIES 表包含双重条目。我想知道连接到最多用户的那些。所以我只需要更改那些最少的外键。(我已经知道双打的ID)

现在需要很多时间才能完成。我想知道是否可以更快地完成

4

3 回答 3

3

试试这个版本。它应该只是快一点。COUNT速度很慢。我已经添加a.ID <> b.ID以避免之前的少数情况。

select  a.ID, a.adres, a.place, a.postalcode  
from COMPANIES a INNER JOIN COMPANIES b
ON
a.ID <> b.ID
and a.Postcode = b.Postcode  
and a.Adres = b.Adres  
and (  
select COUNT(COMPANYID)  
from USERS  
where COMPANYID=a.ID  
)>(  
select COUNT(COMPANYID)  
from USERS  
where COMPANYID=b.ID  
)

FROM ... INNER JOIN ... ON ...是连接表的首选 SQL 构造。它也可能更快。

于 2012-04-06T08:41:08.173 回答
0

一种方法是在进行连接之前预先计算COMPANYID计数,因为您将在主查询中重复计算它。即类似的东西:

insert into @CompanyCount (ID, IDCount)
select COMPANYID, COUNT(COMPANYID)
from USERS
group by COMPANYID

然后你的主要查询:

select a.ID, a.adres, a.place, a.postalcode
from COMPANIES a
  inner join @CompanyCount aCount on aCount.ID = a.ID
  inner join COMPANIES b on b.Postcode = a.Postcode and b.Adres = a.Adres
  inner join @CompanyCount bCount on bCount.ID = b.ID and aCount.IDCount > bCount.IDCount

如果你想要所有的实例,a即使没有对应的b,那么你需要有left outer joins tobbCount.

但是,您需要查看查询计划 - 您正在使用哪些索引 - 您可能希望将它们至少放在IDs 和 thePostcode字段Adres上,因为您要加入它们。

于 2012-04-06T08:35:01.380 回答
0
  1. 建立关于邮政编码和地址的索引

  2. 数据库可能会为每一行执行子选择。(只是在这里猜测,在解释计划中对其进行验证。如果是这种情况,您可以重写查询以加入内联视图(注意这是它在 oracle hop 中的外观,它也适用于 sql server):

    select distinct a.ID, a.adres, a.place, a.postalcode  
    from 
        COMPANIES a, 
        COMPANIES b,  
    (
        select COUNT(COMPANYID) cnt, companyid  
        from USERS
        group by companyid) cntA,  
    (
        select COUNT(COMPANYID) cnt, companyid  
        from USERS
        group by companyid) cntb   
    where a.Postcode = b.Postcode  
    and a.Adres = b.Adres  
    and a.ID<>b.ID
    and cnta.cnt>cntb.cnt
    
于 2012-04-06T08:42:11.250 回答