Come noto la clausola ORDER BY non è ammessa in una vista ed il tentativo di definire all'interno di essa un ordinamento genera il messaggio
Server: Msg 1033, Level 15, State 1, Procedure nomevista, Line 5
The ORDER BY clause is invalid in views, inline functions, derived tables, and subqueries, unless TOP is also specified.
Sempre più spesso mi capita di vedere script che, per forzare l'ordinamento di una vista, definiscono la clausola TOP 100 PERCENT rendendo possibile, a questo punto, includere la clausola di ordinamento.
Utilizzare questo artificio al solo scopo di evitare di includere l'order by nella query che richiama la vista rappresenta uno dei tanti modi che hanno gli sviluppatori di far arrabbiare i dba (non me ne vogliano gli amici sviluppatori che in quanto amici sono sicuro che non commettono di queste ingenuità... ;-)).
Il risparmio dei 15 o 20 caratteri nel codice non vale certamente l'onere aggiuntivo a cui sottoponiamo SQL Server nel caso in cui si richieda la vista ordinata secondo un criterio differente.
Visualizzando il piano di esecuzione di una query del tipo
SELECT select_list
FROM dbo.vw_MyView
ORDER BY campo
dove dbo.MyView è una vista definita utilizzando la clausola TOP 100 PERCENT ed un criterio di ordinamento differente da campo, si può notare che al termine delle attività per ottenere i dati richiesti (possono essere presenti più step se dbo.vw_MyView è una query complessa) inizia la fase di ordinamento della vista (secondo il criterio definito nella stessa) a cui segue lo step per ordinare i dati secondo il criterio indicato nella query.
L'ultimo ordinamento, quindi, vanifica l'attività eseguita al passaggio precedente e SQL Server ha eseguito una attività (più o meno onerosa) del tutto inutile. E se la vista richiama altre viste ciascuna con un criterio di ordinamento differente, quante attività inutili vengono eseguite?
Spero che le persone a cui mi riferisco leggano prima o poi questo blog e a prescindere dal fatto se si riconoscano o meno nei soggetti destinatari di questo messaggio, diano inizio ad una attività di più pacifica e proficua collaborazione con il dba con cui lavorano...
Buone query a tutti... :-)
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Tempo di commiati, il 4 giugno 2007 alle 15:04
- White paper su vardecimal storage format, il 30 maggio 2007 alle 10:49
- Tools per SQL Server, il 24 maggio 2007 alle 08:34
- Serie di articoli su SSIS, il 17 maggio 2007 alle 08:32
- Non c'è pace per il SP2, il 4 maggio 2007 alle 09:39
- Recuperare informazioni sugli indici, il 29 aprile 2007 alle 19:04