Sunday, March 18, 2012

sql - σκέψου το αλλιώς

Πριν 2-3 χρόνια υλοποιήσαμε (εγώ και η συνάδελφος) μια διαδικασία στον  SQL Server με πολλά Insert, Update, Delete statements - με σκοπό να συντονίζουμε τα δεδομένα σε δύο ανεξάρτητες βάσεις δεδομένων (και οι δύο σε SQL Server). Στην πρώτη απόπειρα χρησιμοποιήσαμε cursors.

Για να τρέξει με ένα μικρό αριθμό δεδομένων έπαιρνε περίπου 45 λεπτά. Απαράδεκτος χρόνος! Κάτσαμε και μελετήσαμε πώς θα μπορούσαμε να μειώσουμε τον χρόνο αυτό και καταλήξαμε στα set based queries. Ο χρόνος εκτέλεσης της διαδικασίας μειώθηκε στο 1 λεπτό για ένα αρκετά μεγάλο όγκο δεδομένων! (ήταν διαδικασία που έτρεχε στο background έτσι ήταν καλός χρόνος).

Από τότε δεν ξαναχρησιμοποίησα cursors και μυήθηκα εντελώς στα set based queries!


Για χάρη του παραδείγματος, ας επινοήσουμε κάποιους πίνακες

1. Student(StudentId, Name, YearOfAdmission, TakesClassE001)
2. Class (ClassId, Code, Description, HasStudents)
3. StudentClass(StudentId, ClassId)


set based insert:

Ζητούμενο:  Όλοι οι μαθητές της χρονιάς 2011, θα παρακολουθούν το μάθημα με κωδικό E001.

Insert into StudentClass(StudentId, ClassId)
Select StudentId, ClassId
from
Student
cross join Class
where Student.YearOfAdmission = 2011 and Class.Code='E001'

και καθάρισες!

set based update:
(Οικτρό παράδειγμα, απολογούμαι για την έλλειψη φαντασίας - συμβαίνει)
Έστω ότι θέλουμε να ενημερώσουμε τον πίνακα Student, και συγκεκριμένα να βάλουμε Student.TakesClassE001=1, για οποιοδήποτε Student που εμφανίζεται εγγραφή στον πίνακα StudentClass, με Class.Code = 'E001'. (ελπίζω να μην σας έχασα εδώ).

Αυτό είναι λίγο πιο παράξενο από ότι θα περίμενες:
Update
Student
set
TakesClassE001 = 1
from
StudentClass inner join Student on Student.StudentID = StudentClass.StudentId
inner join Class on Class.ClassId = StudentClass.ClassId
where Class.Code = 'E001'


Ελπίζω να βοηθήσει κάποιο κάποτε, υπάρχουν και πολλά άλλα παραδείγματα στο διαδύκτιο. Απλά να θυμάστε ότι εάν πρέπει να κάνεις insert, ή update για πολλές εγγραφές, να σκέφτεσαι set based! :)

No comments:

Post a Comment