我的查询非常简单:
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表包含双重条目。我想知道连接到最多用户的那些。所以我只需要更改那些最少的外键。 (我已经知道双打的身份)
现在需要花费很多时间才能完成。我想知道是否可以更快地完成
答案 0 :(得分: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构造。它也可能更快。
答案 1 :(得分: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 join
到b
和bCount
但是,您需要查看查询计划 - 您正在使用哪些索引 - 您可能希望将它们放在ID
以及Postcode
和Adres
字段中因为你加入了它们。
答案 2 :(得分:0)
在邮政编码和地址上建立索引
数据库可能会为每一行执行子选择。 (只是在这里猜测,非常在解释计划中。如果是这种情况,你可以重写查询以加入内联视图(注意这是它在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