2013-11-14 14 views
6

Ich habe die folgende AbfrageOptimieren Abfrage, damit es nicht eine Top-N benötigen Art

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

, dass die erste Ausführungsplan in dem Bild erzeugt, die zweite ist die gleiche Abfrage, ohne die order by

enter image description here
Gibt es eine Möglichkeit, die TOP N Sort loszuwerden (so wird nur ein TOP benötigt), indem Sie die Tabellen in einer bestimmten Weise indizieren?

+1

Ich verstehe die Frage nicht. Warum möchten Sie die TOP 25 entfernen, wenn Sie sie brauchen? –

+0

@TimSchmelter Wenn ich die 'order by' entferne, wird ein' TOP' ohne Sortierung gemacht. Ich möchte wissen, ob ich die Tabellen indizieren kann, dass die Sortierung nicht benötigt wird. – Magnus

+0

Eine [indizierte Ansicht] (http://stackoverflow.com/questions/19982562/optimize-query-so-it-does-not-need-a-top-n-sort) könnte funktionieren, aber Indizes für separate Tabellen sind JOINed wird das Sortieren in diesem Fall nicht erleichtern. – HABO

Antwort

4

Fügen Sie einen Index zu tblSystem auf systemName mit fkCompanyID enthalten.

create index IX_tblSystem_systemName 
    on tblSystem(systemName) include(fkCompanyID) 

Rewrite Ihre Anfrage, die die 25 ersten Werte (mit Verbindungen) von tblSystem in einer abgeleiteten Tabelle von systemName und dann beitreten müssen tblCompany bekommen die 25 Werte, die Sie bestellt zu holen.

Abhängig davon, ob fkCompanyID NULL-Werte zulässt oder nicht, müssen Sie NULL-Werte in der WHERE-Klausel in der abgeleiteten Tabelle ausfiltern.

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 

Sie werden noch oben müssen (n) Art Operator, aber es wird die 25 Zeilen nur sortieren (+ Bindungen), die Sie bekommen von der abgeleiteten Tabelle gegen tblCompany verbunden.

enter image description here

0

Sie können es möglicherweise loswerden, indem Sie einen Deckungsindex haben, der die Zeilen enthält, die bereits nach systemName ASC, Name ASC, sortiert sind, aber mein Verdacht ist, dass Sie Mikro-Optimierung sind. Ist diese Abfrage langsam? Wenn es schnell ist, dann ist die Tatsache, dass die "Top N Sortierung" "die Hälfte der Zeit" benötigt, nicht wirklich wichtig. Wenn es langsam ist, bin ich viel mehr mit dem Index-Scan beschäftigt, obwohl es als 4% aufgeführt ist.