Už několikrát jsem se dostal do následujícícho problému:
Volal jsem z .NET aplikace SQL dotaz na nějakou rozsáhlejší tabulku (řádově statisíce záznamů) a v dotazu bylo použito ORDER BY.
(je jedno, kolik záznamů z té rozsáhlé tabulky dotaz vracel - zda všechny nebo byl omezen pomocí WHERE či TOP)
Nad sloupcem, podle kterého se ORDERovalo byl samozřejmě postaven (neclusterovaný) index.
Problém byl v tom, že takový dotaz byl při volání z ADO.NET velmi pomalý (desítky sekund) kdežto při volání z Query Analyzeru byl uspokojivě rychlý (pár sekund).
ADO.NET aplikace i Query Analyzer běžely na mém vývojářském počítači, SQL Server běžel na jiném stroji.
Zatím jsem našel dva hacky, jak tuto situaci řešit:
- nad sloupcem (sloupci), použitými v ORDER BY, jsem postavil clusterovaný index
to je ale k ničemu, pokud chci střídavě řadit dle jednoho sloupce a pak zas podle jiného
navíc bývá zvykem nechat clusterovaný index nad primárním klíčem kvůli joinům
- ADO.NET aplikaci spustit na tom samém stroji, jako běží SQL Server
(což si naštěstí mohu dovolit, protože se jedná o ASP.NET aplikaci a produkční server má zároveň IIS i SQL server)
Problém je, že stále nevím PROČ k této situaci dochází (a proč uvedené hacky pomáhají)
Našel jsem k tomu zatím jen jeden příspěvěk v newsgroups, který tvrdí, že ADO.NET si vždy data seřadí v pořadí primárního klíče (takže můj původní ORDER BY zruší a pak ho znovu vytvoří...) a dále že použití vzdáleného SQL serveru může ADO.NET aplikace zpomalovat, ale tyto teorie nejsou ničím podloženy.
Uvítám připomínky kohokoliv k tomuto tématu.