Σήμερα 31 Οκτώβρη σε πολλά μέρη γιορτάζεται το Halloween και έτσι είναι μια καλή ευκαιρία να αναφερθεί το ομώνυμο πρόβλημα. Το Halloween problem στον κόσμο των δεδομένων είναι ένα πρόβλημα που εντοπίστηκε περίπου 30 χρόνια πριν και αφορά μια ανεπιθύμητη συμπεριφορά στα data modification operations.
Το query το οποίο αποτέλεσε την αφορμή να εξετασθεί το εν λόγω πρόβλημα ήταν κάτι αντίστοιχο του παρακάτω, με σκοπό την αύξηση του μισθού όλων των υπαλλήλων που έπαιρναν λιγότερο από $25.000 κατά 10%.
UPDATE Employees
SET Salary = Salary * 1.1
WHERE Salary < 25000;
Ας υποθέσουμε ότι έχουμε έναν nonclustered index πάνω στην στήλη Salary και μπορεί να χρησιμοποιηθεί για να φέρνει τα rows που θα πρέπει να γίνουν update και ας πάρουμε για παράδειγμα τους παρακάτω υπαλλήλους στους οποίους θέλουμε να γίνει η αύξηση:
Η αρχική ιδέα είναι ότι αν διαβάζονται από τον index ένα ένα τα rows και εφόσον ικανοποιούν την συνθήκη γίνονται update θα έχουμε καλό performance. Όταν όμως αλλάξει το πρώτο row από 21.000 σε 23.100, θα ενημερωθεί για την αλλαγή και ο index που μας δίνει τα rows βάζοντας την εγγραφή μετά τον Scott. Οπότε τώρα το πινακάκι με τις επόμενες αλλαγές που θα γίνουν διαμορφώνεται ως εξής:
Το πρόβλημα λοιπόν εδώ είναι ότι κάποιες εγγραφές θα γίνουν πολλαπλές φορές update, αυξάνοντας το μισθό πολλαπλές φορές αντί για μια. Αν και για τους εν λόγω υπαλλήλους αυτό θα ήταν ευχάριστο, δεν ήταν και η επιθυμητή συμπεριφορά ενός DBMS. Είχε λοιπόν εντοπισθεί μια περίπτωση ένα update να επηρεάσει με λάθος τρόπο τα δεδομένα ή ακόμη και να μην τερματίσει ποτέ.
Τα σημερινά DBMS έχουν αναλάβει την προστασία μας από αυτό το πρόβλημα. Ο SQL Server εντοπίζει σε ποιες περιπτώσεις υπάρχει κίνδυνος για Halloween Problem και φροντίζει να διαχωρίσει την φάση εντοπισμού των εγγραφών από την φάση του modification, όπως με το Table Spool παρακάτω:
Όπως είναι εμφανές αυτό δεν αποτελεί «έγνοια» για τους developers και τους χρήστες ενός DBMS αλλά για τους σχεδιαστές των συστημάτων που αποθηκεύουν και διαχειρίζονται δεδομένα. Μπορεί όμως να εξηγήσει γιατί έχει επιλεχθεί ένας πιο αργός τρόπος από τα συστήματα αυτά σε ορισμένα data modifications, που δεν είναι άλλος από το να διασφαλίσουν το σωστό αποτέλεσμα.
Αν και το πρόβλημα αυτό θα μπορούσε να έχει ονομαστεί Halloween Problem λόγω του ότι είναι κατά κάποιο τρόπο τρομακτικό να μπορεί να συμβεί αυτό στα data κάποιου, το όνομά του το πήρε λόγω του ότι εντοπίστηκε τέτοια μέρα. Του δόθηκε προσωρινά το όνομα αυτό από τους ανθρώπους που το εντόπισαν και έμεινε μέχρι και σήμερα έτσι.
Περισσότερα για την ιστορία εντοπισμού του
εδώ
και για λεπτομερή ανάλυση του προβλήματος με διαφορετικά σενάρια μια πολύ καλή σειρά άρθρων από τον Paul White ξεκινώντας από
εδώ.
Trick or treat!