go backarticles

Articles of SQLschool.gr Team

Adding new field in a table with default value is an online operation in SQL Server 2012 (another not popular feature)

Antonios Chatzipavlis

Αν και πριν λίγες μέρες σας έγραφα για κάποια από τα νέα χαρακτηριστικά που έρχονται στον SQL Server 2014, δεν θα πρέπει να ξεχνάμε ότι έχουμε αυτή την στιγμή διαθέσιμα και τα οποία μας λύνουν ήδη τα χέρια στο SQL Server 2012.

Ένα από αυτά που είναι διαθέσιμο στην Enterprise Edition του SQL Server 2012 (μόνο) και δεν έχει σχεδόν καθόλου πάρει την δημοσιότητα που του αρμόζει αν και λύνει αρκετά θέματα τόσο διαχείρισης όσο και απόδοσης είναι ότι όταν βάζουμε ένα νέο field σε ένα πίνακα στο οποίο θέλουμε να έχει default value αυτό είναι ένα απλό metadata operation.

Για να εκτιμηθεί αυτό το πραγματικά όχι τόσο δημοφιλές χαρακτηριστικό θα σας φέρω ένα παράδειγμα.

Έστω ότι έχω ένα πίνακα μεγάλο ή πολύ μεγάλο. Μέχρι πριν τον SQL Server 2012 όταν πήγαινα και προσέθετα ένα νέο field, θα είχατε παρατηρήσει αρκετοί,  ότι αυτό μέχρι να υλοποιηθεί έπαιρνε χρόνο και όχι μόνο αυτό αλλά ο πίνακας γίνονταν locked και πρακτικά μη διαθέσιμος. Αυτό όπως γίνεται εύκολα κατανοητό έπρεπε να γίνει σε χρόνο που δεν υπήρχε χρήση της βάσης (συνήθως το βράδυ), αν όμως ήσουν σε ένα περιβάλλον 24x7 ήταν πολύ δύσκολο να βρεις το σημείο για να κάνεις κάτι τέτοιο.

Αυτό γίνονταν διότι ο SQL Server έπρεπε σε κάθε εγγραφή να προσθέσει το default value. Στην περίπτωση όμως που το record δεν χωρούσε στο data page (σελίδα)  τότε έπρεπε να γίνει page splitting με αποτέλεσμα να οδηγούμεθα σε μεγάλο IO με συνέπεια μεγάλο χρόνο εκτέλεσης αλλά και φυσικά table locking.

Πλέον αυτό δεν γίνεται και μάλιστα δεν χρειάζεται να κάνουμε κάτι ιδιαίτερο ή να χρησιμοποιήσουμε κάποιο επιπλέον διακόπτη στην σύνταξη της ALTER COLUMN. Αντίθετα το default value απλά αποθηκεύεται στα metadata του πίνακα και απλά κάθε φορά που ζητείται το record διαβάζεται.

Για να γίνει όμως αυτό θα πρέπει το default value να είναι ένα runtime constant ή deterministic function. Δηλαδή μπορεί να είναι κάτι σταθερό πχ ‘My value’ ή 0, αλλά δεν μπορεί να είναι πχ ή GETDATE() function καθώς αυτή είναι non-deterministic. Στην ίδια κατηγορία με την GETDATE() είναι και η NEWID(), NEWSEQUENTIALID(). Επίσης  η συγκεκριμένη διαδικασία δεν ισχύει εφόσον το data type του πεδίου είναι VACRCHAR(MAX), NVARCHAR(MAX), XML, TEXT, NTEXT, IMAGE, HIERARCHYID, GEOMETRY, GEOGRAPHY, ή κάποιο δικό μας CLR User Defined Data Type.

Πραγματικά ένα καλό feature που λύνει τα χέρια σε πολλούς από εμάς. Enjoy it!

/*antonch*/


Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.


Comments

user-gravatar

On 11 Jun 2013 @ 11:58 AM Dimitris Papadimitriou wrote:

Δεν το ήξερα αυτό! Πράγματι έχω κάνει κάτι τέτοιο σε παλαιότερες εκδόσεις και το γεγονός ότι γινόταν update σε όλες τις εγγραφές του πίνακα ήταν φανερό από την ώρα που έπαιρνε για να τρέξει.Οπότε πλέον δεν χρειάζεται να το φοβόμαστε τόσο πολύ. Δυο ερωτήσεις:1) ισχύει ακόμα κι αν το column που προσθέτουμε είναι NOT NULL;2) αυτό δεν έχει έστω και κάποια επίπτωση στην απόδοση αργότερα;

user-gravatar

On 11 Jun 2013 @ 12:09 PM Antonios Chatzipavlis wrote:

Μα ακριβώς για τα πεδία που είναι not null γίνεται όλη η φασαρία, εξάλλου ποτέ δεν μπορούσες να βάλεις νεο πεδίο σε πίνακα με δεδομένα που ήταν not null αν δεν έβαζες default value.Το μέγεθος κάποια στιγμή θα αλλάξει καθώς όταν αλλάξεις την default τιμή θα πρέπει να μπει στην εγγραφή, αλλά κατά την αρχικοποίηση δεν θα έχεις αλλαγές σε αυτό τουλάχιστον όχι εμφανείς

Leave your comment

COMMENT

FULL NAME

EMAIL ADDRESS

We use Gravatar

WEB SITE



captcha


 

Newsletter

If you want to receive updates from us subscribe below with your email.
Follow us in
PASS chapter logo

The Official PASS Local Group for Greece

About us Contact us Terms of Use Privacy Sing in Register
sql school greece logo
© 2010-2020 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.