Weblog @ rebex.cz

Weblogy na webu Rebexu
Welcome to Weblog @ rebex.cz Sign in | Help
in Search

Weblog @ Rebex.cz :: Honza Šotola

nepravidelné poznámky .NET vývojáře

Pomalé SQL dotazy s ORDER BY při volání ADO.NET

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:

  1. 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
  2. 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.

Published 25. února 2005 11:56 by honzas

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

honzas said:

Jako prvni bych se zkusil podivat do SQL Profileru jaky dotaz ve skutecnosti ADO.NET na SQL Server poslal.

Pokud na SQL Server dorazi "puvodni dotaz" bude problem v jinak sestavenem exekucnim planu - a to je treba overit.

Pokud dorazi dotaz "zmrseny" k obrazu ADO je treba ADO nastavit tak aby dotaz nemrsilo. Napr. vypnout klientsky kurzor.
února 27, 2005 11:49

Leave a Comment

(required) 
(optional)
(required) 
Submit
Powered by Community Server (Personal Edition), by Telligent Systems