2013-11-14 25 views
6

, 2 order by

enter image description here
olmadan aynı sorgu aşağıdaki sorgu resimde ilk yürütme planı oluşturduğundanoptimize sorgu yüzden sıralama

select top 25 
    tblSystem.systemName, 
    tblCompany.name 
from 
    tblSystem 
    join tblCompany 
     on tblSystem.fkCompanyID = tblCompany.pkCompanyID 
order by 
    tblSystem.systemName, 
    tblCompany.name 

olduğunu gelmiş bir Üst N gerekmez Tabloları belirli bir şekilde dizine ekleyerek TOP N Sort'dan (yani sadece TOP gereklidir) kurtulmanın bir yolu var mı?

+1

Soruyu anlamıyorum. İhtiyaç duyduğunuzda neden "TOP 25" i kaldırmak istiyorsunuz? –

+0

@TimSchmelter Eğer 'sırala' siparişi 'kaldırırsanız sıralama yapılmazsa. Tabloları, sıralama işleminin gerekli olmadığına göre endeksleyip dizemediğimi bilmek istiyorum. – Magnus

+0

[İndeksli görünüm] (http://stackoverflow.com/questions/19982562/optimize-query-so-it-does-not-need-a-top-n-sort) işe yarayabilir, ancak ayrı tablolardaki dizinler JOINED, bu durumda sıralama gereğini ortadan kaldırmaz. – HABO

cevap

4

dizinine fkCompanyID ürününü içeren bir dizin ekleyin.

create index IX_tblSystem_systemName 
    on tblSystem(systemName) include(fkCompanyID) 
systemName tarafından sipariş Türetilmiş tabloda tblSystem den (bağları olan) 25 birinci değerlerini almak ve ardından size gereken 25 değerlerini almak için tblCompany katılmak için sorguyu yeniden

.

fkCompanyID, null değerlere izin verip vermediğine bağlı olarak, türetilmiş tablodaki neredeyseniz boş değerleri filtrelemeniz gerekir.

select top (25) 
    S.systemName, 
    C.name 
from (
    select top (25) with ties 
     S.fkCompanyID, 
     S.systemName 
    from tblSystem as S 
    where S.fkCompanyID is not null 
    order by S.systemName 
    ) as S 
    inner join tblCompany as C 
    on S.fkCompanyID = C.pkCompanyID 
order by S.systemName, 
     C.name 

Hala (n) sıralama operatörünü üst gerekecektir ancak yalnızca türetilmiş tablo tblCompany karşı katıldı elindeki 25 satır (+ bağlarını) sıralanır.

enter image description here

0

SistemName ASC, ASC adıyla sıralanmış satırları içeren bir örtme dizini oluşturarak bunlardan kurtulabilirsiniz, ancak benim şüphem mikro optimizasyon yaptığınızdır. Bu sorgu yavaş mı? Eğer hızlıysa, o zaman “top N sort” in “yarım zaman” alması gerçekten önemli değildir. Yavaşsa,% 4 olarak listelenmiş olsa bile, Dizin Taraması ile daha çok ilgilenirim.