Σε ένα παλιότερο post με τίτλο Sorted Tables ψάχναμε τον τρόπο με τον οποίο μπορούμε να έχουμε συνεχώς ταξινομημένα τα δεδομένα ενός πίνακα ώστε να μην χρειάζεται να προσθέτουμε ORDER BY στο τέλος κάθε query. Άσχετα με το πρακτικό ή όχι, σωστό ή λάθος, ανατρεπτικό ή όχι της υπόθεσης, το ενδιαφέρον βρίσκεται στο εξής:
Μία από τις λύσεις είναι να χρησιμοποιηθεί ένα view το οποίο να είναι κάπως έτσι:
CREATE VIEW V1 AS (SELECT TOP 100 PERCENT * FROM T1 ORDER BY COL1 ASC)
Ωραία; Ωραία!
Ε, λοιπόν, αν το δοκιμάσετε αυτό στον SQL Server 2005, πολύ απλά δεν θα παίξει. Ο λόγος είναι ότι ο query optimizer αναγνωρίζει το TOP 100 PERCENT ως μη απαραίτητο (μιας και επιστρέφει όλες τις εγγραφές) και το αφαιρεί από το execution plan!
To ηθικό δίδαγμα είναι ότι καλό είναι να ακολουθούμε τη θεωρία (στη συγκεκριμένη περίπτωση πρόκειται για τη σχεσιακή, η οποία λέει ότι "ένα view δεν μπορεί να δίνει ταξινομημένα αποτελέσματα" - για την ακρίβεια το λέει κάπως διαφορετικά, δηλαδή ότι σε ένα σύνθετο SELECT statement μόνο το εξώτερο SELECT μπορεί να έχει ORDER BY clause) για να αποφεύγουμε μελλοντικά προβλήματα που προκύπτουν από το πουθενά, όταν αποφασίζουμε να μετακινήσουμε την εφαρμογή μας σε ένα νέο περιβάλλον.
Vir prudens non contra ventum mingit