Vandaag een vreemd probleem van een klant proberen te tackelen: een niet al te spannende query neemt bij hun al gauw 5 seconden in beslag, terwijl ze vrij fatsoenlijke hardware hebben staan (dual processor DB-server met 4GB aan boord) en niet eens zo gek veel concurrent users hebben, zo'n stuk of 40 schat ik.
Op m'n eigen testserver (single processor, 1GB) duurt die query iets meer dan een halve seconde, maar ik ben dan ook single user.
De query ziet er ongeveer zo uit:
Toen ik de profiler op mijn testsetup losliet, zag ik dat van de 563 ms totaal er bijna 500 ms naar 't volgende commando gingen:
Ik heb 't nu opgelost door exact diezelfde query in een stored procedure te zetten, met als gevolg dat sp_indexes_rowset niet meer wordt aangeroepen, en dat de execution time is gedaald van 563 naar 16 ms...
Probleem opgelost, maar ik weet nog steeds niet waarom MSSQL besloot dat 'ie bij die query sp_indexes_rowset nodig had, en bij diezelfde query in een stored proc niet.
Iemand enig idee?
Getest met MSSQL 2000 SP4 en MDAC 2.8
Op m'n eigen testserver (single processor, 1GB) duurt die query iets meer dan een halve seconde, maar ik ben dan ook single user.
De query ziet er ongeveer zo uit:
SQL:
Indexen staan goed, FK's staan goed, query is geparametriseerd, en de aggregates kosten vrijwel geen tijd: meestal MIN() op de velden uit tabel2, om te voldoen aan de eis dat niet-group-by velden altijd geaggregeerd moeten zijn.1
2
3
4
| SELECT <3 group by velden>, <17 geaggregeerde velden, waarvan 12 uit tabel2> FROM tabel1 JOIN tabel2 ON <2 foreign key velden> WHERE <conditie op 2 niet-group-by velden uit tabel1> GROUP BY <3 group by velden> |
Toen ik de profiler op mijn testsetup losliet, zag ik dat van de 563 ms totaal er bijna 500 ms naar 't volgende commando gingen:
SQL:
Op die sp werden steeds zo'n 50.000 reads losgelaten (OK, tabel2 is groot, dus daar kan ik me iets bij voorstellen). Niet handig, en volgens mij ook niet nodig.1
| exec sp_indexes_rowset N'tabel2', NULL, NULL |
Ik heb 't nu opgelost door exact diezelfde query in een stored procedure te zetten, met als gevolg dat sp_indexes_rowset niet meer wordt aangeroepen, en dat de execution time is gedaald van 563 naar 16 ms...
Probleem opgelost, maar ik weet nog steeds niet waarom MSSQL besloot dat 'ie bij die query sp_indexes_rowset nodig had, en bij diezelfde query in een stored proc niet.
Iemand enig idee?
Getest met MSSQL 2000 SP4 en MDAC 2.8