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のテーブルにはdoubleエントリが含まれています。最も多くのユーザーに接続しているものを知りたいです。したがって、変更する必要があるのは、最も少ないものの外部キーだけです。(私はすでにダブルスの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
  1. 郵便番号と住所のインデックスを作成する

  2. データベースはおそらくすべての行に対して副選択を実行します。(ここで推測して、説明計画でそれを確認してください。この場合、インラインビューと結合するようにクエリを書き直すことができます(これはオラクルホップでどのように見えるか、SQLサーバーでも機能することに注意してください):

    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 に答える