Jump to content

antonch

Administrators
  • Posts

    1030
  • Joined

  • Last visited

  • Days Won

    7

Everything posted by antonch

  1. τι εννοείς προς τα μέσα, μου φαίνεται ότι είναι χαρακτηριστικό ή ρύθμιση στο παντίκι σου, αλλά για αυτό που θες δεν είναι απαραίτητο δεξι κλικ μπορείς να κάνεις τα εξής Ctrl+Click on link = ανοίγει σε νέο tab Shift+Click on link = ανοίγει σε νέο παράθυρο
  2. Είναι γνωστή η τρέλλα μου να έχω το μέγιστο δυνατό user experience στα virtual machines μου. Περίμενα με αγωνία το RemoteFX το οποίο είναι άψογο. Αν παρόλα αυτά δεν έχετε το ReportFX να ένας απλός τρόπος να έχετε Aero σε αυτές όταν όμως συνδέεστε με Remote Desktop Βάλετε το Desktop Experience feature από τον Server Manager. Ενεργοποιήστε το themes service σε autostart, και ξεκινήστε το. Ενεργοποιήστε το “Allow desktop composition for remote desktop sessions” policy από το Edit Group Policy. Αυτό είναι στο path “ComputerConfiguration\AdministrativeTemplates\WindowsComponents\Remote Desktop Services\Remote Desktop Session Host\Remote Session Environment” Ορίστε το “Limit Maximum Color Depth” στο να παίρνει ότι έχει ο client. Αυτό ήταν έχετε Aero Theme
  3. Αρκετοί, ιδιαίτερα όσοι είναι μερακλήδες και κάνουν estimated capacity plan πριν δημιουργήσουν την βάση τους παραπονούνται ότι η δημιουργία μιας μεγάλης βάσης παίρνει αρκετό χρόνο. Το web cast αυτό δείχνει την λύση. Για να το δείτε πατήστε εδώ /*antonch*/
  4. Για ακόμα μια φορά θα πρέπει να ασχοληθούμε με το transaction log. Καθημερινά αντιμετωπίζω περιστατικά τα οποία μου δείχνουν ότι υπάρχει θέμα κατανόησης με την αξία, την λειτουργία αλλά και την χρήση του transaction log. Η βασική ερώτηση που μου έχει τεθεί αρκετές φορές και έχω γράφει αρκετά άρθρα για αυτή είναι γνωστή πλέον και αφορά το μέγεθος του transaction log file. Αν έχετε έρθει για πρώτη φορά στο blog αυτό μια απλή αναζήτηση εδώ θα σας φέρει αρκετά άρθρα για το θέμα αυτό. Αλλά αν ψάξετε και στον internet θα βρείτε ακόμα περισσότερα. Αρκετές φορές έχω περιγράψει την φυσική δομή μιας βάσης τόσο μέσα από τα μαθήματα που κάνω όσο και από εδώ ή τα SQL Server Saturday Nights. Σε όλες αυτές τις περιπτώσεις έχω τονίσει ότι το transaction log εσωτερικά δομείται σε virtual log files (VLFs). Επίσης αρκετές φορές έχω αναφέρει ότι το transaction log γίνεται truncate μόνο όταν παίρνουμε transaction log backup (εφόσον είμαστε σε full ή bulk recovery model). Και ακόμα αρκετές φορές έχω αναφέρει ότι σε αυτή την περίπτωση γίνεται truncate το μη ενεργό κομμάτι αυτού το ή τα οποίο(α) δεν είναι άλλο(α) από τα VLFs που δεν έχουν ενεργό(α) transaction(s). Για όσους λοιπόν αναρωτιούνται τι γίνεται με το transaction log τους και πώς θα συμπεριφερθεί στο επόμενο transaction log backup ή ακόμα καλύτερα θέλουν να βάλουν το δάκτυλο επί τον τύπο τον ήλο, υπάρχει ένα undocumented αλλά ευρέως γνωστό και φυσικά χρησιμοποιούμενο dbcc command και δεν είναι άλλο από το DBCC LOGINFO. Το command αυτό μας δίνει πληροφορίες για τα VLFs που υπάρχουν μέσα στο transaction log της βάσης μας Η εκτέλεση του είναι αρκετά απλή καθώς η μόνη παράμετρος που παίρνει το όνομα της βάσης. dbcc loginfo (AdventureWorks2008R2) Το αποτέλεσμα που βγάζει έχει την παρακάτω μορφή FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 458752 8192 46 2 64 0 2 458752 466944 43 0 128 0 2 458752 925696 44 0 128 0 2 712704 1384448 45 0 128 0 Ας δούμε όμως λίγο τι είναι το κάθε πεδίο που μας εμφανίζεται από την εκτέλεση της dbcc loginfo. FileID : To ID του αρχείου στην συγκεκριμένη βάση FileSize : Το μέγεθος του VLF σε bytes StartOffset : Το σημείο αρχής του VLF FSeqNo : Το sequence number του VLF Status: Η κατάσταση του VLF 0=Inactive, 2=Active Parity : Parity info για το VLF CreateLSN : To Log Sequence Number με το οποίο ξεκινάει το VLF Ας δούμε λίγο τα πράγματα με ένα απλό παράδειγμα Δημιουργώ μια βάση use master go create database DemoDB on primary ( name='demodb_data', filename='c:\temp\demodb_data.mdf', size=10MB ) log on ( name='demodb_log', filename='c:\temp\demodb_log.ldf', size=5MB ) go Με αυτό έχω φτιάξει μια βάση με μέγεθος data file 10MB και log file 5ΜΒ Εκτελώ την dbcc loginfo (demodb) και έχω το εξής FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 28 2 64 0 2 1245184 1253376 0 0 0 0 2 1245184 2498560 0 0 0 0 2 1499136 3743744 0 0 0 0 Από το αποτέλεσμα καταλαβαίνω ότι έχω ένα transaction log το οποίο έχει τέσσερα VLFs, από τα οποία χρησιμοποιείται το πρώτο καθώς το Status=2. Το μέγεθος των VLFs είναι περίπου 1,2 ΜΒ. Δημιουργώ έναν πίνακα create table T ( id int identity(1,1) primary key, data char(8000) default 'abcdefghijklmnopqrstuvwxyz' ) go Και τον γεμίζω με 1000 εγγραφές insert into T default values go 1000 Εκτελώντας την DBCC LOGINFO έχω το εξής αποτέλεσμα FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 32 0 128 0 2 1245184 1253376 33 0 128 0 2 1245184 2498560 34 2 128 0 2 1499136 3743744 35 2 128 0 Παρατηρόντας το βλέπουμε ότι έχουν γεμίζει σειριακά το VLFs (FSeqNo) και ότι τα ενεργά είναι τα δύο τελευταία (Status=2). Αν κάνω checkpoint και μετά δω ξανά το log με την dbcc θα έχω το εξής αποτέλεσμα FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 32 0 128 0 2 1245184 1253376 33 0 128 0 2 1245184 2498560 34 0 128 0 2 1499136 3743744 35 2 128 0 Παρατηρώ ότι μόνο το τελευταίο VLF είναι πλεόν ενεργό Βάζω ακόμα 1000 εγγραφές στον πίνακα μου και έχω το εξής αποτελεσμα μετά από την εκτέλεση της dbcc FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 40 0 128 0 2 1245184 1253376 41 2 128 0 2 1245184 2498560 42 2 128 0 2 1499136 3743744 39 0 64 0 Παρατηρώ ότι τα δύο μεσαία είναι ενεργά. Παίρνω το πρώτο full backup και το πρώτο log backup backup database demodb to disk='c:\temp\demodb.bak' go backup log demodb to disk='c:\temp\demodb.bak' go Eκτελώ την dbcc το αποτέλεσμα είναι το παρακάτω FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 40 0 128 0 2 1245184 1253376 41 0 128 0 2 1245184 2498560 42 2 128 0 2 1499136 3743744 39 0 64 0 Βάζω μια εγγραφή που δεν την κάνω commit στο transaction BEGIN TRAN insert into T default values και παράλληλα από ένα άλλο session βάζω ακόμα 1000 εγγραφές, εκτελώ την dbcc από την οποία έχω το εξής απότελεσμα FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 44 2 64 0 2 1245184 1253376 45 2 64 0 2 1245184 2498560 42 2 128 0 2 1499136 3743744 43 2 128 0 2 253952 5242880 46 2 64 45000000203100009 2 270336 5496832 47 2 64 45000000203100009 2 253952 5767168 48 2 64 47000000014000009 2 335872 6021120 49 2 64 47000000014000009 2 253952 6356992 50 2 64 49000000026900009 2 401408 6610944 51 2 64 49000000026900009 2 253952 7012352 52 2 64 51000000038300009 2 466944 7266304 53 2 64 51000000038300009 2 253952 7733248 54 2 64 53000000052200013 2 253952 7987200 55 2 64 53000000052200013 2 278528 8241152 56 2 64 53000000052200013 2 253952 8519680 57 2 64 56000000014100015 2 253952 8773632 58 2 64 56000000014100015 2 344064 9027584 59 2 64 56000000014100015 2 253952 9371648 60 2 64 59000000028700003 2 253952 9625600 61 2 64 59000000028700003 2 475136 9879552 62 2 64 59000000028700003 2 253952 10354688 63 2 64 62000000054000009 2 253952 10608640 0 0 0 62000000054000009 2 253952 10862592 0 0 0 62000000054000009 2 286720 11116544 0 0 0 62000000054000009 Χωρίς άλλη σκέψη παίρνω transaction log backup και εκτελώ την dbcc FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 44 2 64 0 2 1245184 1253376 45 2 64 0 2 1245184 2498560 42 2 128 0 2 1499136 3743744 43 2 128 0 2 253952 5242880 46 2 64 45000000203100009 2 270336 5496832 47 2 64 45000000203100009 2 253952 5767168 48 2 64 47000000014000009 2 335872 6021120 49 2 64 47000000014000009 2 253952 6356992 50 2 64 49000000026900009 2 401408 6610944 51 2 64 49000000026900009 2 253952 7012352 52 2 64 51000000038300009 2 466944 7266304 53 2 64 51000000038300009 2 253952 7733248 54 2 64 53000000052200013 2 253952 7987200 55 2 64 53000000052200013 2 278528 8241152 56 2 64 53000000052200013 2 253952 8519680 57 2 64 56000000014100015 2 253952 8773632 58 2 64 56000000014100015 2 344064 9027584 59 2 64 56000000014100015 2 253952 9371648 60 2 64 59000000028700003 2 253952 9625600 61 2 64 59000000028700003 2 475136 9879552 62 2 64 59000000028700003 2 253952 10354688 63 2 64 62000000054000009 2 253952 10608640 0 0 0 62000000054000009 2 253952 10862592 0 0 0 62000000054000009 2 286720 11116544 0 0 0 62000000054000009 Κανω commit το transaction που είχα αφήσει πριν και ξαναπαίρνω log backup και εκτελώ την dbcc FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 44 0 64 0 2 1245184 1253376 45 0 64 0 2 1245184 2498560 42 0 128 0 2 1499136 3743744 43 0 128 0 2 253952 5242880 46 0 64 45000000203100009 2 270336 5496832 47 0 64 45000000203100009 2 253952 5767168 48 0 64 47000000014000009 2 335872 6021120 49 0 64 47000000014000009 2 253952 6356992 50 0 64 49000000026900009 2 401408 6610944 51 0 64 49000000026900009 2 253952 7012352 52 0 64 51000000038300009 2 466944 7266304 53 0 64 51000000038300009 2 253952 7733248 54 0 64 53000000052200013 2 253952 7987200 55 0 64 53000000052200013 2 278528 8241152 56 0 64 53000000052200013 2 253952 8519680 57 0 64 56000000014100015 2 253952 8773632 58 0 64 56000000014100015 2 344064 9027584 59 0 64 56000000014100015 2 253952 9371648 60 0 64 59000000028700003 2 253952 9625600 61 0 64 59000000028700003 2 475136 9879552 62 0 64 59000000028700003 2 253952 10354688 63 2 64 62000000054000009 2 253952 10608640 0 0 0 62000000054000009 2 253952 10862592 0 0 0 62000000054000009 2 286720 11116544 0 0 0 62000000054000009 Βάζω ακόμα 1000 εγγραφές και εκτελώ την dbcc FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 69 2 128 0 2 1245184 1253376 70 2 128 0 2 1245184 2498560 67 2 64 0 2 1499136 3743744 68 2 64 0 2 253952 5242880 71 2 128 45000000203100009 2 270336 5496832 72 2 128 45000000203100009 2 253952 5767168 73 2 128 47000000014000009 2 335872 6021120 74 2 128 47000000014000009 2 253952 6356992 75 2 128 49000000026900009 2 401408 6610944 76 2 128 49000000026900009 2 253952 7012352 77 2 128 51000000038300009 2 466944 7266304 78 2 128 51000000038300009 2 253952 7733248 79 2 128 53000000052200013 2 253952 7987200 80 2 128 53000000052200013 2 278528 8241152 81 2 128 53000000052200013 2 253952 8519680 82 2 128 56000000014100015 2 253952 8773632 58 0 64 56000000014100015 2 344064 9027584 59 0 64 56000000014100015 2 253952 9371648 60 0 64 59000000028700003 2 253952 9625600 61 0 64 59000000028700003 2 475136 9879552 62 0 64 59000000028700003 2 253952 10354688 63 2 64 62000000054000009 2 253952 10608640 64 2 64 62000000054000009 2 253952 10862592 65 2 64 62000000054000009 2 286720 11116544 66 2 64 62000000054000009 Από όλα τα παραπάνω βλέπω παρατηρώντας τα FSeqNo και Status ποια VLF είναι ενεργά και ποια όχι έτσι βλέπω πως γίνεται η ανακύκλωση του transaction log εσωτερικά και ποια είναι αυτά το VLFs τα οποία έχουν γίνει truncate. Αυτό μου είναι χρήσιμο ακόμα όταν θέλω να κάνω shrink το log file καθώς όπως έχουμε πει αρκετές φορές για να γίνει shrink θα πρέπει τα μην ενεργά VLFs να είναι στο τέλος όχι όπως στο παραπάνω δείγμα όπου αν είμαι σε αυτή την περίπτωση θα πρέπει να παίρνω ανεπάληλα transaction log backups ώστε να φτάσω σε μια μορφή όπως αυτή FileId FileSize StartOffset FSeqNo Status Parity CreateLSN ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 2 1245184 8192 44 2 64 0 2 1245184 1253376 45 2 64 0 2 1245184 2498560 42 2 128 0 2 1499136 3743744 43 2 128 0 2 253952 5242880 46 2 64 45000000203100009 2 270336 5496832 47 2 64 45000000203100009 2 253952 5767168 48 2 64 47000000014000009 2 335872 6021120 49 2 64 47000000014000009 2 253952 6356992 50 2 64 49000000026900009 2 401408 6610944 51 2 64 49000000026900009 2 253952 7012352 52 2 64 51000000038300009 2 466944 7266304 53 2 64 51000000038300009 2 253952 7733248 54 2 64 53000000052200013 2 253952 7987200 55 2 64 53000000052200013 2 278528 8241152 56 2 64 53000000052200013 2 253952 8519680 57 2 64 56000000014100015 2 253952 8773632 58 2 64 56000000014100015 2 344064 9027584 59 2 64 56000000014100015 2 253952 9371648 60 2 64 59000000028700003 2 253952 9625600 61 2 64 59000000028700003 2 475136 9879552 62 2 64 59000000028700003 2 253952 10354688 63 2 64 62000000054000009 2 253952 10608640 0 0 0 62000000054000009 2 253952 10862592 0 0 0 62000000054000009 2 286720 11116544 0 0 0 62000000054000009 SQL Server ‘Denali’ Επειδή αρκετοί από εσάς φαντάζομαι ότι ήδη έχετε αρχίσει και βλέπετε την επόμενη έκδοση του SQL Server με την κωδική ονομασία Denali, πιθανότατα να έχετε εκτελέσει ή να εκτελέσετε την dbcc αυτή. Σε κάθε περίπτωση θα βρεθείτε σε μια έκπληξη καθώς σε αυτή υπάρχει νέα κολώνα και δεν είναι άλλη από την πρώτη με την ονομασία RecoveryUnitID όπου σε όλες τις γραμμές που θα εμφανιστούν έχει την τιμή μηδέν (0). Για την ενημέρωση σας χωρίς να έχω την εξουσιοδότηση να μπω σε περισσότερες λεπτομέρειες λόγω NDA, η κολώνα αυτή θα έχει πρακτική αξία στην μετά Denali έκδοση του SQL Server. RecoveryUnitId FileId FileSize StartOffset FSeqNo Status Parity CreateLSN -------------- ----------- -------------------- -------------------- ----------- ----------- ------ --------------------------------------- 0 2 253952 8192 49 2 128 0 0 2 253952 262144 44 0 64 0 0 2 270336 516096 45 0 64 43000000003000331 0 2 262144 786432 46 0 64 44000000013600398 0 2 262144 1048576 47 0 64 44000000038000359 0 2 262144 1310720 48 0 64 45000000025400069
  5. Δύο μέρες ΔΩΡΕΑΝ SQL Server Training Σήμερα ξεκινάμε το διήμερο free SQL Server training με 24ώρα live webcasts όπου θα δείτε στιγμιότυπα από το PASS Summit 2011. Με την υποστήριξη της Dell, το μέρος αυτό του 24 Hours of PASS θα σας παρουσιάσει τα σημαντικότερα νέα του SQL Server κατευθείαν στον υπολογιστή σας σε δύο 12ωρα, 7-8 Σεπτ., όπου κάθε 12ωρο ξεκινά στις 15:00 ώρα Ελλάδας. Εγγραφείτε εδώ για να παρακολουθήσετε τα αγαπημένα σας θέματα! Δείτε τι λένε γνωστοί ομιλητές για το 24 Hours of PASS: More Free Training from PASS - Rob Farley Watch Me (and 23 Others!) During 24 Hours of PASS: Summit Preview - Jes Schultz Borland Register for 24 Hours of PASS NOW! - Tim Radney Presenting Hardware 301 at 24 Hours of PASS on September 7 - Glenn Berry Βιαστείτε – Οι θέσεις είναι περιορισμένες! Δείτε το #24hop στο Twitter για τις τελευταίες συζητήσεις κ’ ενημερώσεις!
  6. Πριν τις καλοκαιρινές μου διακοπές είχα ένα τμήμα στο οποίο έκανα μάθημα όλη την σειρά σεμιναρίων του SQL Server 2008 R2. Το τμήμα αυτό είχε συναδέλφους που ήταν αποκλειστικά Oracle DBAs και Devs. Κατά την διάρκεια των σεμιναρίων είχα αρκετές ερωτήσεις του στυλ στην Oracle κάνουμε αυτό στο SQL το κάνουμε και πώς το κάνουμε. Από μια σύμπτωση η σειρά το σεμιναρίων ήταν πρώτα το administration, και μετά το programming και μετά το σεμινάριο με την T-SQL. Μια ερώτηση που τέθηκε από την πρώτη μέρα από όλους αλλά ειδικά από τον Τ (ας τον πούμε έτσι για λόγους ανωνυμίας) ήταν αν ο SQL Server έχει cursors. Επειδή το θέμα θα το βλέπαμε διεξοδικά στο τελευταίο σεμινάριο, αλλά είναι και ένα θέμα που χωράει μεγάλη κουβέντα και ανάλυση του απάντησα όπως απαντώ όταν δεν έχω αρκετό χρόνο στην διάθεση μου ότι ναι έχει αλλά προσπαθούμε να τους αποφύγουμε. Φυσικά η απάντηση μου αυτή δεν άρεσε σε κανένα συμμετέχοντα καθώς παιδιά της Oracle τα κάνουν όλα με cursors. Εξήγησα ότι θα το εξετάσουμε το θέμα όταν έρθει ή ώρα του. Το δέχθηκαν και συνεχίσαμε ομαλά. Φυσικά ο φίλος Τ πάντα ρωτούσε με cursor μπορώ να κάνω αυτό ή αυτό το κάνω πανεύκολα με ένα cursor όταν έδειχνα κάτι. Για να μην πλατειάσω στην εισαγωγή η απάντηση μου ήταν σταθερά η ίδια και φυσικά αυτό έκανε τον φίλο T έξαλλο (μέχρι που ήρθε η στιγμή και τους εξηγήσαμε αναλυτικά και ηρέμησε). Αν ψάξουμε στο internet ή ρωτήσουμε ανθρώπους που ασχολούνται με τον SQL Server το σύνηθες είναι να διαβάσετε ή να ακούσετε ότι δεν είναι καλό στον SQL Server να χρησιμοποιούμε cursors γιατί καταναλώνουν αρκετή μνήμη, έχουν μεγάλο I/O, είναι αργοί σε απόκριση/ταχύτητα είναι κακός προγραμματισμός. Τελικά ισχύουν όλα αυτά; Είναι τόσο κακοί οι cursors που δεν πρέπει να τους χρησιμοποιούμε; Η αλήθεια είναι ότι οι cursors έχουν την φήμη αυτή γιατί έχουν κακοχρησιμοποιηθεί από junior devs ή από ανθρώπους που αγνοούν παντελώς την T-SQL γλώσσα και απλά κάποιος τους έδειξε τυχαία αυτό και το χρησιμοποιούν σαν ευαγγέλιο. Αν για παράδειγμα πούμε ότι είναι κακός προγραμματισμός τότε όλοι οι devs του SQL Server στην Microsoft είναι κακοί προγραμματιστές καθώς αν κάνουμε το παρακάτω query use master go select distinct id from sys.syscomments where text like '%cursor%' go θα δούμε πάνω από 200 system stored procedures και functions να κάνουν την χρήση cursor. Είναι όλοι αυτοί κακοί προγραμματιστές; Δεν το νομίζω… Πολλοί, μέσα σε αυτούς και εγώ, πιστεύουν ότι οι cursors υπάρχουν καλώς μέσα στον SQL Server αρκεί να γνωρίζουμε το πως δουλεύουν καθώς είναι απαραίτητοι για εργασίες όπως dynamic operations που δεν μπορούν να υλοποιηθούν με set-based operations, είναι εύκολοι στην κατανόηση και εύχρηστοι, προσφέρουν την γραμμή-γραμμή επεξεργασία, είναι ιδανικοί για scrolling ενός μέρους από ένα μεγάλο result set. Όμως έχουν και μειονεκτήματα όπως προσφέρονται για quick & dirty προγραμματισμό ειδικά από junior developers αλλά και από αυτούς που έμαθαν κάτι τυχαία και το έχουν κάνει ψωμοτύρι, εξαιτίας του ότι είναι memory resident set of pointers καταναλώνουν μνήμη, είναι γρηγορότεροι από ένα while loop αλλά έχουν περισσότερο overhead, όταν δεν ξέρεις πώς να τους χρησιμοποιήσεις τους χρησιμοποιείς με λάθος τρόπο και γράφει και λάθος τον κώδικα σε αυτούς. Δόξα το Θεό τα BOL του SQL Server περιγράφουν λεπτομερέστατα του cursors και δεν χρειάζεται να κάνω μια διεξοδική αναφορά σε αυτό το post. Αυτό που θα κάνω όμως είναι να εστιάσω την προσοχή σας στο πως δηλώνω ένα cursor με την παρατήρηση ότι υπάρχουν δύο συντάξεις η ISO και η T-SQL Extended, σας προτείνω να το διαβάσετε αναλυτικά και με προσοχή ιδιαίτερα την T-SQL Extended εκδοχή. Γνωρίζοντας τα παραπάνω θα είστε σε θέση την επόμενη φορά να χρησιμοποιήσετε σωστά τους cursors δηλώνοντας το σωστό cursor option με το οποίο θα χρησιμοποιηθεί ιδανικά τόσο η tempdb όσο και η μνήμη του συστήματος σας χωρίς να υπάρχουν performance penalties. Είναι τόσο απλό…. /*antonch*/
  7. Ένα query δεν το κρίνουμε αν είναι καλό ή κακό από το πόσο μεγάλο ή περίπλοκο είναι. Το κρίνουμε από το πόσο αποτελεσματικά κάνει τη δουλειά για την οποία έχει γραφτεί όπερ αν έχει το ιδανικό execution plan σε σχέση με το περιβάλλον που τρέχει. Για τους φίλους μου τους developers που όταν βλέπουν ένα query πάνω από 2 γραμμές το θεωρούν άσχημο.
  8. Καλό φθινόπωρο σε όλες και σε όλους. Μετά από μια αποχή αρκετών μηνών τα SQL Saturday Night είναι πάλι εδώ!!!. Θα ξεκινήσουμε με ένα απλό αλλά ουσιαστικό θέμα το οποίο δεν είναι άλλο από να δούμε τι μπορούμε να κάνουμε με τον SQL Server Agent service. Αρκετά χρήσιμος για κάθε DBA αλλα και Developer. Σας περιμένω στην συντροφιά μας αλλά για να γίνει αυτό θα πρέπει πρώτα να κάνετε register με μία απλή κίνηση, κάνοντας click στο banner παραπάνω. Φιλικά /*antonch*/
  9. Πριν από ένα μήνα είχα αναρτήσει μια δημοσκόπηση στο site του SqlSchool.gr με την εξής ερώτηση: Έχετε ενεργοποιήσει το "Optimize for Ad Hoc Workloads" στα instances του SQL Server 2008 & R2 που έχετε; Η συγκεκριμένη δημοσκόπηση έγινε με αφορμή κάποιες συζητήσεις που είχα με κάποιους συναδέλφους σχετικά με θέματα performance πάνω στον SQL Server. Αν και γενικά έχουν γραφτεί στο παρελθόν αρκετά για το συγκεκριμένο θέμα πίστευα ότι το συγκεκριμένο ήταν αρκετά γνωστό. Από τις συζητήσεις όμως διαπίστωσα ότι στην χώρα μας δεν ήταν και τόσο. Θέλησα να μετρήσω περισσότερο το συγκεκριμένο έτσι και έβαλα την συγκεκριμένη δημοσκόπηση. Τα αποτελέσματα μετά από ένα μήνα που ήταν ενεργή η συγκεκριμένη δημοσκόπηση ήταν τα παρακάτω Ναί 23,08% Όχι 7,69% Εξαρτάται 0% Δεν ξέρω τι είναι αυτό 69,23% Η έκπληξη ήταν αρκετά μεγάλη βλέποντας το αποτέλεσμα και έτσι αποφάσισα να δω και τον αριθμό συμμετοχών στην δημοσκόπηση αυτή ώστε να εξασφαλίσω την εγκυρότητα του δείγματος. Ο αριθμός αυτό δεν ήταν καθόλου μικρός (173 μοναδικές συμμετοχές). Βλέποντας τον αριθμό και τα αποτελέσματα μου διαπίστωσα ότι καλά έκανα και μέτρησα το συγκεκριμένο θέμα. Ας πάρουμε τα πράγματα όμως με την σειρά ώστε στο τέλος να έχουμε βγάλει μια άκρη σχετικά με το τι τελικά είναι το Optimize for Ad Hoc Workloads και αν πρέπει ή όχι να το έχουμε ενεργοποιημένο . Τι είναι το Optimize for Ad Hoc Workloads; Σήμερα όλο και περισσότερες εφαρμογές χρησιμοποιούν ORMs για να διαβάσουν δεδομένα από τις databases πχ Entity Framework , Linq to SQL, NHibernate κλπ. Είναι τα αγαπημένα εργαλεία των devs που θέλουν να γράφουν σε αυτό που ξέρουν πχ C# και object oriented programming. Γενικά είναι αγαπημένα εργαλεία σε αυτούς που θέλουν να βλέπουν την βάση σαν ένα κουβά (αυτό είναι κάτι το οποίο με κάνει να εξοργίζομαι). Μέσα από τα εργαλεία αυτά ο κάθε dev χωρίς να το βασανίσει ιδιαίτερα κάνει ad hoc queries χρησιμοποιώντας τα εργαλεία αυτά. Για κάθε ένα από αυτά ο SQL Server αποθηκεύει το execution plan του στην plan cache που είναι μέρος της buffer cache που είναι και στην ουσία αυτή που καταναλώνει memory στην μηχανή που είναι εγκατεστημένος ο SQL Server. Πολλά από αυτά το πιθανότερο είναι να μην χρησιμοποιηθούνε ποτέ ξανά, αυτό σημαίνει ότι μνήμη που έχει δεσμευτεί για τα execution plans τους παραμένει κατειλημμένη. Βέβαια το ίδιο ισχύει και για εφαρμογές που δεν είναι γραμμένες χρησιμοποιώντας τα εργαλεία αυτά αλλά είναι κακογραμμένες ή ο dev δεν έχει ανακαλύψει ακόμα την χρήση των stored procedure. Σημασία όμως έχει ότι είτε έτσι είτε αλλιώς έχω αυτό που ονομάζεται plan cache bloat όπως έχει καθιερωθεί να λέγεται τα φαινόμενο αυτό στην κοινότητα των SQL Server experts. Plan Cache bloat means that much of your plan cache is wasted by execution plans that will never be used again. Το φαινόμενο αυτό μπορεί να εξαλειφθεί όταν ενεργοποιήσω το option optimize for ad hoc workloads, το οποίο by default είναι off. Με ενεργοποιημένο το option αυτό ο SQL Server αντί να αποθηκεύσει το full execution plan του ad hoc query αποθηκεύει ένα μικρό compiled plan stub όπως λέγεται κατά την πρώτη του εκτέλεση. Το full execution plan θα αποθηκευτεί όταν θα υπάρχει και επόμενη εκτέλεση του ίδιου ad hoc query. Πώς βρίσκω αν πρέπει να ενεργοποιήσω το Optimize for Ad Hoc Workloads; Για να εντοπίσω, σαν DBA, αν έχω το φαινόμενο του plan cache bloat o τρόπος είναι ένας και αυτός δεν είναι άλλος από το να χρησιμοποιήσω την DMV sys.dm_exec_cached_plans. Για καλύτερα όμως αποτελέσματα καλό είναι να εκτελέσετε το παρακάτω script στο οποίο γίνεται με την χρήση της sys.dm_exec_cached_plans declare @TotalPlanCacheSizeInMBs decimal(18,2), @TotalSingleUsedPlansInMBs decimal(18,2) select @TotalPlanCacheSizeInMBs = (sum(cast(size_in_bytes as decimal(18,2)))/1024)/1024 , @TotalSingleUsedPlansInMBs = (sum(cast((case when usecounts = 1 and objtype in ('Adhoc','Prepared') then size_in_bytes else 0 end) as decimal(12,2)))/1024)/1024 from sys.dm_exec_cached_plans select @TotalPlanCacheSizeInMBs AS [Total Plan Cache Size In MBs] , @TotalSingleUsedPlansInMBs AS [Total Single Used Plans In MBs] , cast((@TotalSingleUsedPlansInMBs * 100 ) / @TotalPlanCacheSizeInMBs as decimal(18,2)) AS [% of Wasted space from single used plans] go Αν το % of Wasted space from single used plans είναι πάνω από το 20% (αν και το ποσοστό αυτό μπορεί να αλλάξει ανάλογα με το περιβάλλον) τότε καλό είναι να ενεργοποιηθεί το option αν και βέβαια αυτή είναι μια εκτίμηση γίνεται σε βάση την σχέση του χαμένου χώρου και του συνολικό μέγεθος της plan cache. Αν θέλουμε μπορούμε να δούμε πόσο χώρο χάνουμε σε σχέση με την γενικότερη μνήμη που ο SQL Server καταναλώνει με το παρακάτω script declare @SQLConfiguration table ( [name] nvarchar(35) , [minimum] int , [maximum] int , [config_value] int , [run_value] int ); insert @SQLConfiguration exec ('sp_configure ''max server memory'''); DECLARE @ConfiguredMemory decimal(19,3) , @PhysicalMemory decimal(19,3) , @InUseMemory decimal(19,3) SELECT @ConfiguredMemory = (run_value/1024)/1024 FROM @SQLConfiguration WHERE name = 'max server memory (MB)' SELECT @PhysicalMemory = total_physical_memory_kb/1024 FROM sys.dm_os_sys_memory SELECT @InUseMemory = physical_memory_in_use_kb/1024 FROM sys.dm_os_process_memory declare @TotalSingleUsedPlansInMBs decimal(18,2) select @TotalSingleUsedPlansInMBs = (sum(cast((case when usecounts = 1 and objtype in ('Adhoc','Prepared') then size_in_bytes else 0 end) as decimal(12,2)))/1024)/1024 from sys.dm_exec_cached_plans select @ConfiguredMemory AS [sql Configured Memory] , @PhysicalMemory AS [Physical Memory] , @InUseMemory AS [used Memory by SQL Server] , cast((@InUseMemory * 100 ) / @ConfiguredMemory as decimal(18,2)) AS [% of SQL Server used memory on Configured Memory] , @TotalSingleUsedPlansInMBs AS [Total Single Used Plans In MBs] , cast((@TotalSingleUsedPlansInMBs * 100 ) / @ConfiguredMemory as decimal(18,2)) AS [% of Wasted space from single used plans on Configured Memory] , cast((@TotalSingleUsedPlansInMBs * 100 ) / @InUseMemory as decimal(18,2)) AS [% of Wasted space from single used plans on Used Memory] go Εάν έχουμε [% of SQL Server used memory on Configured Memory] πάνω από το 50% και δούμε το [% of Wasted space from single used plans on Used Memory] να είναι πάνω από το 10-15% τότε είναι ένα καλό σημάδι να ενεργοποιήσουμε option. Τέλος υπάρχει ακόμα και περίπτωση που αν θέλουμε μπορούμε να κοιτάξουμε σε σχέση όμως αυτή την φορά με την Plan Cache Pressure Limit . Για να το γίνει αυτό θα πρέπει να γνωρίζουμε πως δουλεύει το plan caching στον SQL Server. Για αυτό υπάρχει ένα εξαιρετικό white paper από τον Greg Low με τίτλο Plan Caching in SQL Server 2008 από το οποίο ιδιαίτερη μνεία θα πρέπει να δοθεί στην παράγραφο με τίτλο Memory Allocated To Plan Caching την οποία και μεταφέρω αυτούσια για την ευκολία στο διάβασμα του post. Most memory used by SQL Server is allocated to the Buffer Pool, which is used to store data pages. SQL Server steals a proportion of this memory for use in caching query plans. The overall amount of memory available to SQL Server depends upon the amount of memory installed on the server, the architecture of the server, the version and edition of SQL Server and the amount of memory pressure being experienced by SQL Server. This pressure can be internal (SQL Server resources need memory) or external (operating system needs memory). SQL Server is designed to respond to memory pressure when necessary. Four types of object are stored in the Plan Cache: Object Plans, SQL Plans, Bound Trees and Extended Stored Procedures. SQL Server decides the appropriate allocation of memory to the Plan Cache from the Buffer Pool. The algorithm used for this has been improved in successive service packs since SQL Server 2005 was introduced. SQL Server Version Cache Pressure Limit SQL Server 2008 and SQL Server 2005 SP2 75% of visible target memory from 0-4GB + 10% of visible target memory from 4Gb-64GB + 5% of visible target memory > 64GB SQL Server 2005 RTM and SQL Server 2005 SP1 75% of visible target memory from 0-8GB + 50% of visible target memory from 8Gb-64GB + 25% of visible target memory > 64GB SQL Server 2000 SQL Server 2000 4GB upper cap on the plan cache Table 1: Plan cache memory allocation by SQL Server version While 32-bit systems may use AWE (Address Window Extensions) memory to extend the available memory beyond the 4G virtual address space limit of the 32-bit architecture, this additional memory can only be used for data pages in the Buffer Pool, not by pages in the Plan Cache. It is not considered visible memory. No such limitation applies to 64-bit systems. Για την ευκολία σας θα αναφέρω το παρακάτω από το βιβλίο της Kalen Delaney SQL Server Internals όπου ορίζονται με εξαιρετικό τρόπο τα παρακάτω: When discussing memory pressure, we refer to the term visible memory—that is, the directly addressable physical memory available to the SQL Server buffer pool. On a 32-bit SQL Server instance, the maximum value for visible memory is either 2GB or 3GB, depending on whether you have the /3GB flag set in your boot.ini file. Memory with addresses greater than 2GB or 3GB is available only indirectly, through AWE-mapped memory. On a 64-bit SQL Server instance, “visible” memory has no special meaning, as all the memory is directly addressable. If I refer to visible memory greater than 3GB, keep in mind that this is possible only on a 64-bit SQL Server system. The term target memory means the maximum amount of memory that can be committed to the SQL Server process. Target memory refers to the physical memory committed to the buffer pool and is the lesser of the values you’ve configured for “max server memory” and the total amount of physical memory available to the OS. Thus, visible target memory is the visible portion of the target memory. Query plans can be stored only in the non–AWE-mapped memory, which is why the concept of visible memory is important. Από το ίδιο βιβλίο θα πάρω και ένα παράδειγμα Assume you’re on SQL Server 2008 on a 64-bit SQL Server instance with 28GB of target memory. Per the formula in Table 1, the plan-cache pressure limit would be 75 percent of 4GB plus 10 percent of the target memory over 4GB (or 10 percent of 24GB)—that is, (.75 × 4GB) + (.10 × 24GB) = 3GB + 2.4GB = 5.4GB. Αφού εφαρμόσουμε τον παραπάνω αλγόριθμο βρίσκουμε το plan cache pressure limit και το συσχετίζουμε με τον αποτελέσματα από τον πρώτο τρόπο. Αν το ποσοστό που θα βρούμε είναι μεγάλο τότε όχι μόνο θα πρέπει να ενεργοποιήσουμε το option αλλά να κάνουμε καθαρισμό της plan cache. Βέβαια αυτό θα πρέπει να γίνει και για τι άλλες περιπτώσεις που έχω αναφέρει παραπάνω. Πώς καθαρίζω την Plan Cache Ο εύκολος τρόπος για να γίνει αυτό είναι να χρησιμοποιήσω την DBCC FREESYSTEMCACHE('SQL Plans') Το θέμα όμως με αυτή την σύνταξη είναι ότι καθαρίζει όλη την plan cache. Αυτό σημαίνει ότι θα φύγουν και αυτά που χρησιμοποιούνται πολλές φορές. Αν θέλω να καθαρίζω αυτά που έχουν χρησιμοποιηθεί μόνο μια φορά θα πρέπει να δράσω κάπως διαφορετικά όπως παρακάτω select plan_handle from sys.dm_exec_cached_plans where usecounts=1 go DECLARE clearplancache CURSOR READ_ONLY FOR select plan_handle from sys.dm_exec_cached_plans DECLARE @plan_handle varbinary(8000) OPEN clearplancache FETCH NEXT FROM clearplancache INTO @plan_handle WHILE (@@fetch_status -1) BEGIN IF (@@fetch_status -2) BEGIN DBCC FREEPROCCACHE (@plan_handle) END FETCH NEXT FROM clearplancache INTO @plan_handle END CLOSE clearplancache DEALLOCATE clearplancache GO select plan_handle from sys.dm_exec_cached_plans where usecounts=1 go Πώς ενεργοποιώ το Optimize for Ad Hoc Workloads; Για να ενεργοποιήσω το συγκεκριμένο option μπορώ να το κάνω με το εξής script sp_configure 'show advanced options',1 go reconfigure go sp_configure 'optimize for ad hoc workloads',1 go reconfigure go
  10. όπως σωστά κάποιος έχει πει κάθε χρόνο εδώ και μια δεκαετία διαβάσουμε το ίδιο πράγμα ότι τα pc πέθαναν, θα το πιστέψω μόνο όταν το δω
  11. Ένα νέο γκάλοπ έχει αναρτηθεί στον www.sqlschool.gr με την παρακάτω ερώτηση Εάν είστε αυτός που πρέπει να επιλέξει ένα νέο server για τον βασικό database server στην εταιρία σας, αλλά έχετε περιορισμένο budget, σε τι από τα παρακάτω δεν θα κάνετε «εκπτώσεις» στα χαρακτηριστικά του και στις δυνατότητες του; Παρακαλώ θερμά για την συμμετοχή σας. /*antonch*/
  12. Συχνά έχω την ερώτηση από μαθητές μου αλλά και από συνεργάτες που ήταν συνηθισμένοι με τα SQL Server 2000 DTS όπου υπήρχε η δυνατότητα να κάνουν export αυτά σε VB code module και να τα καλούν μέσα από τις εφαρμογές τους, πως μπορούν να κάνουν το ίδιο ή σχεδόν το ίδιο με τα SSIS packages. Η απάντηση είναι σχετικά απλή και θα σας την παρουσιάσω σε αυτό το post. Όμως θα πρέπει εξ αρχής να επισημάνω ότι απαιτούνται γνώσεις προγραμματισμού σε .net περιβάλλον άνω του μετρίου. Επίσης κατά την άποψη μου πρέπει να υπάρχει μια αρκετά καλή εξοικειώσει με το object model των SSIS καθώς αυτό είναι λίγο περίεργο σε σχέση με άλλα, και αυτό πάλι είναι μια προσωπική άποψη που ίσως να μην σας βρει σύμφωνους. Όπως και να έχει όμως η δουλεία μας γίνεται. Το SSIS Πακέτο Ας πάρουμε τα πράγματα από την αρχή και ας φτιάξουμε ένα απλό SSIS πακέτο (με το όνομα ThePackage) το οποίο θα κάνει κάτι αρκετά απλό. Θα έχει ένα Data Flow Task το οποίο θα έχει ένα OLEDB Data Source που θα διαβάζει τον πίνακα Products από την Northwind database και θα κάνει export τα δεδομένα του πίνακα σε ένα semicolon( delimited flat file. Για να γίνει το παραπάνω θα έχω δύο Connection Managers, ένα Flat File Connection Manager με το όνομα FlatFile που θα έχει τα στοιχεία για το flat file που θα κάνουμε export και έναν OLEDB Connection Manager που θα συνδέεται στην Northwind database από την οποία θα διαβάζουμε τον πίνακα Products. Το όνομα αυτού είναι Northwind. Για εκπαιδευτικούς λόγους βάζω ένα variable το οποίο δεν θα το χρησιμοποιήσω πουθενά καθώς το πακέτο που φτιάχνω δεν έχει κάποια απαίτηση τέτοια, αλλά θέλω να σας δείξω πως μπορώ να την γεμίσω από την εφαρμογή μου. Το όνομα της variable είναι AVar. Το σενάριο μου είναι ότι θέλω να ορίζω κατά την εκτέλεση, από την εφαρμογή μου, του SSIS πακέτου τα connection strings των connection managers αλλά και να θέτω τιμή στην variable. Η εγκατάσταση του στον SQL Server Αφού το έχω φτιάξει και το έχω δοκιμάσει ότι δουλεύει μέσα από το BIDS (BI Development Studio aka Visual Studio) θέλω να βγάλω deployment manifest ώστε να μπορώ να το κάνω deploy στο SQL Server που θέλω. Για να γίνει αυτό πάω πάνω στο SSIS Project στον Solution Explorer και κάνω δεξι κλικ και επιλέγω Properties όπου και μου εμφανίζεται το Property Pages Window. Επιλέγω Deployment Utility από τα Configuration Properties και στα δεξιά εμφανίζονται οι επιλογές αυτού όπου επιλέγω να κάνω true το CreateDeploymentUtility property. Με την ολοκλήρωση τις διαδικασίας αυτής και αφού κάνω Build to SSIS Project μου, στο φάκελο Deployment ο οποίος υπάρχει μέσα στο Bin folder του folder που έχω φτιάξει το SSIS Project θα έχω τα παρακάτω αρχεία Παίρνω τα περιεχόμενα του φακέλου αυτού και τα πάω στον SQL Server στον οποίο και θέλω να στήσω το πακέτο που. Αφού γίνει αυτό απλά κάνω double click στο αρχείο με το extention SSISDeploymentManifest και ο SSIS Package Installation Wizard ξεκινάει. Στο βήμα που ακολουθεί επιλέγω να κάνω εγκατάσταση στον SQL Server και όχι στο file system και πατώ Next. Στο επόμενο βήμα μιας και είμαι πάνω στο SQL Server που θέλω να γίνει η εγκατάσταση κάνω τις εξής επιλογές και πατώ Next. Στα επόμενα βήματα πατάω απλά Next μέχρι που θα γίνει η εγκατάσταση στον SQL Server. Αφού αυτή ολοκληρωθεί επιτυχώς τότε μέσα από τον SSMS συνδέομαι στα SSIS και θα δω το πακέτο να είναι εγκατεστημένο. To Application που θα εκτελεί το SSIS Package Ας έρθουμε να φτιάξουμε τώρα το application το οποίο θα καλεί το πακέτο που μόλις βάλαμε στον SQL Server. Με το Visual Studio φτιάχνω ένα console application σε C# στο οποίο για να μπορέσω να χρησιμοποιήσω τον SSIS Runtime θα πρέπει να κάνω reference το Microsoft.SQLServer.ManagedDTS assembly. Ο κώδικας που χρειάζεται να έχω γράψει για να μπορέσω να καλέσω μέσα από την εφαρμογή μου είναι ο παρακάτω using System; using System.Collections.Generic; using System.Text; using Microsoft.SqlServer.Dts.Runtime; namespace CallingSSISPackage { class Program { static void Main(string[] args) { Application app = new Application(); Package pkg = new Package(); pkg = app.LoadFromSqlServer(@"\ThePackage", "SQL2008R2", null, null, null); Variables vars2 = pkg.Variables; vars2["AVar"].Value = "20"; ConnectionManager filemgr = pkg.Connections["FlatFile"]; filemgr.ConnectionString = @"c:\temp\products4.txt"; Console.WriteLine(pkg.Connections["FlatFile"].ConnectionString); ConnectionManager NWDB = pkg.Connections["Northwind"]; NWDB.ConnectionString = @"Data Source=SQL2008R2; Initial Catalog=Northwind; Provider=SQLNCLI10.1; Integrated Security=SSPI;"; Console.WriteLine(pkg.Connections["Northwind"].ConnectionString); DTSExecResult rv = pkg.Execute(); Console.WriteLine("Package Execution results: {0}",rv.ToString()); Console.Read(); } } } Ας εξηγήσουμε λίγο τι κάνει αυτός. Δημιουργούμε ένα νέο instance του SSIS Application object. Application app = new Application(); Φορτώνουμε το πακέτο από τον SQL Server συνδεόμενοι στο SQL Server με Windows integration όσον αφορά το security Package pkg = new Package(); pkg = app.LoadFromSqlServer(@"\ThePackage", "SQL2008R2", null, null, null); Θέτουμε τιμή στις διάφορες μεταβλητές (αυτό είναι για εκπαιδευτικούς σκοπούς, δεν κάνει τίποτα η μεταβλητή αυτή μέσα στο πακέτο) Variables vars2 = pkg.Variables; vars2["AVar"].Value = "20"; Και το επόμενο είναι ορίσουμε τις τιμές στα connection strings των connection managers που έχω μέσα στο πακέτο μου. ConnectionManager filemgr = pkg.Connections["FlatFile"]; filemgr.ConnectionString = @"c:\temp\products4.txt"; Console.WriteLine(pkg.Connections["FlatFile"].ConnectionString); ConnectionManager NWDB = pkg.Connections["Northwind"]; NWDB.ConnectionString = @"Data Source=SQL2008R2; Initial Catalog=Northwind; Provider=SQLNCLI10.1; Integrated Security=SSPI;"; Console.WriteLine(pkg.Connections["Northwind"].ConnectionString); Τέλος απλά κάνω την εκτέλεση του SSIS πακέτου και δείχνω το status της εκτέλεσης. DTSExecResult rv = pkg.Execute(); Console.WriteLine("Package Execution results: {0}",rv.ToString()); Εγκαθιστώντας την εφαρμογή πάνω στον SQL Server και εκτελώντας την όλα θα δουλέψουν μια χαρά εφόσον έχω κάνει login στον server με ένα account το οποίο είναι στους local admins της μηχανής και είναι και sysadmin στον SQL Server. H εκτέλεση της εφαρμογής από έναν σταθμό εργασίας To ίδιο ισχύει και αν εκτελέσω την εφαρμογή από έναν άλλο σταθμό εργασίας, εφόσον σε αυτόν έχω συνδεθεί με το ίδιο account που χρησιμοποίησα παραπάνω. Στην περίπτωση όμως που πάω σε ένα σταθμό εργασίας στο οποίο έχω συνδεθεί με ένα απλό χρήστη που δεν είναι admin και απλά έχει δικαιώματα πρόσβασης στον SQL Server και δικαιώματα read στην Northwind database τότε αρχίσει μια μικρή περιπέτεια. Δοκιμάζοντας να εκτελέσω το πακέτο εμφανίζεται το πρώτο μήνυμα λάθους Αποφασίζω να πάω και να δώσω πρόσβαση στο συγκεκριμένο χρήστη στην msdb database βάζοντας τον ταυτόχρονα να είναι μέλος του database role που υπάρχει στην msdb db_ssisltduser. Στην επόμενη εκτέλεση που θα κάνω θα πάρω το επόμενο διαφορετικό μήνυμα λάθους Η επόμενη κίνηση είναι το συγκεκριμένο χρήστη να του δώσω περισσότερα δικαιώματα όσον αφορά την εκτέλεση των SSIS πακέτων και αυτό γίνεται βάζοντας τον στον msdb database role db_ssisoperator. Αυτό έχει σαν αποτέλεσμα όλα να δουλέψουν ομαλά. Όλα τα παραπάνω δουλεύουν εφόσον είμαι σε domain environment. Σε διαφορετική περίπτωση θα πρέπει τα accounts να υπάρχουν και στις δύο μηχανές με το ίδιο password. Υπάρχουν όμως και άλλες περιπτώσεις που πιθανότατα δεν θα μπορείτε να συνδεθείτε στα Integrations Services για μερικές από αυτές μπορείτε να δείτε αυτό, αλλά γενικά αυτές είναι σπάνιες. Εάν πάντως πέσετε σε κάποια από αυτές θα μπορούσα να σας βοηθήσω εφόσον μου αναφέρεται όλες τις λεπτομέρειες για το πώς προσπαθείτε να κάνετε την εκτέλεση αυτή. Αυτή είναι σε γενικές γραμμές η λύση για το πώς εύκολα μπορείτε να καλέσετε ένα SSIS πακέτο μέσα από την εφαρμογή σας. /*antonch*/
  13. Από χθες είναι πλέον διαθέσιμο ένα αξιολογότατο download για όσους λατρεύουν τον SQL Server και αφορά την επόμενη έκδοση του με την ονομασία Denali και συγκεκριμένα την CTP 3 που πριν λίγες εβδομάδες έγινε διαθέσιμη σε όλο τον κόσμο. Όπως χαρακτηριστικά αναφέρει το email το οποίο έλαβα από άνθρωπο του product group The SQL Server Code Name “Denali” CTP3 Product Guide includes useful resources and demos that will help IT Professionals better evaluate of CTP3. This includes: 14 Product Datasheets 8 PowerPoint Presentations 5 Technical White Papers 13 Hands-On Lab Preview Documents 6 Click-Through Demonstrations 13 Self-Running Demonstrations 26 Links to On-Line References 44 Links to On-Line Videos including 26 Presentations from North America TechEd 2011 Αξίζει το κόπο κάποιος να το κατεβάσει από εδώ και να ασχοληθεί μαζί του ιδιαίτερα αν δεν έχει να κάνει κάτι άλλο τώρα στις διακοπές του. Υ.Γ για να μην ξεχνιόμαστε. 150 θέσεις σε super τιμή σας περιμένουν για το επόμενο IT PRO|DEV Connections 2011. Βιαστείτε γιατί εξαντλούνται γρήγορα.
  14. Δεν υπάρχει κανένα bug, έτσι δουλεύει η shrink. Δηλαδή με απλά ελληνικά για να δουλέψει πρέπει ο ελεύθερος χώρος να είναι στο τέλος του αρχείου για να μπορέσει να το κάνει shrink. To λέω εδώ και χρόνια αυτό αλλά δεν με πιστεύται έτσι προς επίρρωση των όσων λέω εδώ και χρόνια δείτε και αυτό http://jmkehayias.blogspot.com/2008/11/database-transaction-log-part-2-how.html και αυτό http://technet.microsoft.com/en-us/library/ms189085.aspx. Επίσης χρόνια φωνάζω ότι εφόσον έχετε βάση με full recovery model απαραίτητα πρέπει να παίρνουμε σε τακτά χρονικά διαστήματα transaction log backup δείτε πόσες φορές το έχω πει το έχω γράψει αυτό. http://sqlschoolgr.wordpress.com/2010/01/24/why-truncate_log-discontinued-answer-to-mr-kladakis/ http://sqlschoolgr.wordpress.com/2010/03/09/%cf%8c-%cf%8c-transaction-log/ http://sqlschoolgr.wordpress.com/2010/11/03/%ce%ac-transaction-log-%ce%ad-%cf%8e-%ce%ad/ http://sqlschoolgr.wordpress.com/2010/03/14/lesson-backuprestore-in-sql-server-2008/ Τέλος όσον αφορά την shrink αφού δεν θέλετε να με ακούτε ότι δεν κάνουμε shrink (εξαίρεση σε ειδικές περιπτώσεις είναι το log) ακούστε τουλάχιστον την άποψη κάποιου που έφτιαξε τον SQL Server. http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(930)-data-file-shrink-does-not-affect-performance.aspx http://www.sqlskills.com/BLOGS/PAUL/post/Why-you-should-not-shrink-your-data-files.aspx
  15. http://msdn.microsoft.com/en-us/library/ms345414.aspx ρίξε μια ματιά σε αυτο και τρέξει το query που λέει για να δούμε τι τελικά φταίει
  16. Ουσιαστικά είναι άδειο το log. Το ερώτημα μου τώρα είναι πως κανείς shrink το log. Μπορείς να μου δώσεις την εντολή η να μου περιγράψεις την διαδικασία που κανείς;. Βέβαια υπάρχει και ο εύκολος τρόπος για να κανείς shrink σε αυτη την βάση που κανείς πειράματα , να γυρίσεις σε simple recovery model, αλλα δεν παίζει αυτο στην άλλη που έχει mirror γιατί θα το χαλάσει. Περιμένω να μου πεις την εντολή ή την διαδικασία που κανείς shrink
  17. Παράξενο... Για δώσε dbcc sqlperf(logspace) όπου με αυτη θα δεις πόσο χρησιμοποιείται το log.Απο εκεί και πέρα θα πρέπει να κάνει dbcc shrinkfile είτε με το command είτε απο το γραφικό περιβάλλον. Ξαναλέω ότι σε περιπτώσεις που είναι ενεργό το τελευταίο virtual log θα χρειαστεί να πάρεις περισσότερα απο ένα log backups...
  18. Σωστά. Αλλά δεν χρειάζεται να κανείς συνέχεια shrink.Πάρε το log backup κανε shrink και μετα βάλε schedule να παίρνεις log backup κάθε μια ώρα για παράδειγμα. Έτσι θα γίνετε πάντα επαναχρησιμοποιηση του καθαρισμενου μέρους του log
  19. Να ξεκαθαρίσουμε πρώτα απο όλα ότι όταν λέμε στην γλώσσα του SQL server ότι γίνεται truncate το log σε καμμιά περίπτωση δεν εννοούμε ότι μικραίνει σαν μέγεθος το φυσικό αρχείο στο δίσκο. Αν θα πας στο sqlschool.gr και ψάξεις για το web cast με τίτλο ο θαυμαστος κόσμος του transaction log δεις τι ακριβώς γίνεται. Το άλλο που πρέπει να γίνει και αυτο αντιληπτό είναι ότι το database mirroring παίζει μόνο με full recovery model.Οποιαδήποτε αλλαγή κανείς σε αυτό αυτη την στιγμή θα έχει σαν αποτέλεσμα να σταματήσει το mirroring. Aρα δεν το πειραζουμε Τώρα όσον αφορά το γιατί ενώ έκανες backup το log και μετα έκανες shrink και δεν έγινε τίποτα, απλά επεσες πιθανότητα στην περίπτωση που ήταν με active transaction το τελευταίο virtual log του transaction log. Σε αυτή την περίπτωση η Μονή λύση είναι να κάνουμε την διαδικασία ξανά απο την αρχή δλδ backup log και shrink μετα.
  20. Η μαγική ενέργεια είναι transaction log backup τότε και μόνο τότε καθαρίζει εσωτερικά το log και φυσικά μετα απο αυτο μπορείς να κανείς και shrink αυτο αν και δεν χρειάζεται εφόσον παίρνεις καθημερινά και τακτικά log backup
  21. Εάν έχετε βαρεθεί να περιμένετε να ανοίξει το SQL Server Management Studio υπάρχει λύση. Απλά ανοίξτε τον Internet Explorer και πηγαίνεται στα Tools>Internet Options. Στα παράθυρο που θα εμφανιστεί διαλέξτε και το Advanced Tab και εκει βρείτε και κάνετε uncheck το Check for server certificate revocation, κάνετε Apply και restart τον IE. Την επόμενη φορά που θα ανοίξετε τον SSMS θα δείτε την διαφορά .
  22. Με αφορμή την ενασχόληση μου με την επιμέλεια των ελληνικών μηνυμάτων λαθών στον SQL Server DENALI, διαπίστωσα ότι έχουν γίνει αρκετά ενδιαφέρουσες αλλαγές σε αυτά. Μια τέτοια η οποία είναι αρκετά ενδιαφέρουσα και πρωτίστως χρήσιμη είναι ότι όταν πλέον έχει λάθος το οποίο παραβιάζει τον primary key constraint δηλαδή πάμε να βάλουμε ένα pk το οποίο ήδη υπάρχει ενώ μέχρι τώρα απλά είχα το μήνυμα λάθους τώρα έχω και την τιμή . Cool!!! Ας δούμε ένα παράδειγμα για αυτό create table X (id int not null primary key, data nvarchar(100)) insert into X(id,data) values (1,'A'),(2,'B'),(3,'C') insert into X(id,data) values (1,'A'),(4,'B'),(5,'C') set language 'greek' insert into X(id,data) values (1,'A'),(4,'B'),(5,'C') Πλέον το μήνυμα λάθους είναι Msg 2627, Level 14, State 1, Line 1 Violation of PRIMARY KEY constraint 'PK__X__3213E83F7B68C891'. Cannot insert duplicate key in object 'dbo.X'. The duplicate key value is (1). Και στα ελληνικά Msg 2627, Level 14, State 1, Line 4 Παραβίαση του περιορισμού PRIMARY KEY 'PK__X__3213E83F7B68C891'. Δεν είναι δυνατή η εισαγωγή διπλότυπου κλειδιού στο αντικείμενο 'dbo.X'. Η τιμή του διπλότυπου κλειδιού είναι (1).
  23. Ακόμα ένα χαρακτηριστικό το οποίο δεν έχει διαφημιστεί στον SQL Server DENALI είναι ότι πλέον υπάρχουν όλα τα μηνύματα των λαθών που έχει ο SQL Server στην Ελληνική γλώσσα!!!. Άλλη μια απαίτηση χρόνων έγινε πραγματικότητα . Εάν ρωτήσετε τον sys.messages και τον sys.sysmessages θα δείτε πλέον ότι υπάρχει και ελληνική γλώσσα μέσα σε αυτούς (language id = 1032). Έτσι πλέον αν στο χρήστη έχετε βάλει default language Greek εκτός από το ότι θα μπορεί να εισάγει ημερομηνίες σύμφωνες με το ελληνικό format ΗΗ/ΜΜ/ΕΕΕΕ θα μπορεί να βλέπει και τα λάθη στην ελληνική γλώσσα. Αυτό βέβαια μπορείτε να το κάνετε και στο session του χρήστη όπου ανά πάσα στιγμή μπορείτε να αλλάξετε την γλώσσα με την χρήση της SET LANGUAGE ‘Greek’ Έτσι αν πχ εκτελέσουμε την εντολή DROP TABLE X όπου ο πίνακας Χ δεν υπάρχει και αφού έχουμε αλλάξει την γλώσσα στα ελληνικά με την SET LANGUAGE θα δούμε το παρακάτω μήνυμα λάθους Msg 3701, Level 11, State 5, Line 1 Δεν είναι δυνατή η απόρριψη της πίνακας 'X', επειδή δεν υπάρχει ή επειδή δεν έχετε δικαιώματα. Ξέρω τώρα ότι θα αρχίσετε την γκρίνια αλλά θα τα διορθώσουμε όλα αυτά τα χαζά όπως «της πίνακας». Ήδη ετοιμάζω τις διορθώσεις να τις στείλω στο product group. /*antonch*/
  24. Ένα ενδιαφέρον video όπως παρουσιάστηκε στην WPC11 σχετικό με το “Crescent” το οποίο έχει σχεδιαστεί όπως λέει η Microsoft Project "Crescent" is designed with end users in mind to quickly, easily, and visually explore their data and answer ad-hoc questions in just a few clicks. Μπορείτε να το δείτε εδώ
  25. Όταν για πρώτη φορά εμφανίστηκε το συγκεκριμένο feature στον SQL Server 7.0 ίσως να ήμουν ο πρώτος στην Ελλάδα που το χρησιμοποίησα σε παραγωγικό περιβάλλον. Παρόλα αυτά όμως δεν υπήρχε η υποστήριξη της ελληνικής γλώσσας και αυτό με είχε στεναχωρίσει ιδιαίτερα. Αυτό σήμαινε ότι δεν μπορούσα να ψάξω με την ρίζα της λέξης. Από τότε προσπαθούσα εγώ και ακόμα ένας συνάδελφος ο Παναγιώτης ο Καναβός να πείσουμε την Microsoft να υποστηρίξει την ελληνική γλώσσα. Οι προσπάθειες μας όμως ήταν άκαρπες. Παρόλα αυτά όμως δεν το έβαλα κάτω. Από το 2010 που έγινα MVP στο SQL Server άρχισα να γίνομαι, στο μέτρο του δυνατού, τσιμπούρι στο product group ώστε να υποστηριχθεί η ελληνική γλώσσα. Κάθε λίγο και λιγάκι έστελνα emails και ζητούσα την υποστήριξη της γλώσσα μας. Το τελευταίο μου email ήταν στις 4/6/2011. Με χαρά, (πάρτυ θα κάνω) ανακοινώνω ότι στο CTP3 του Denali πλέον υπάρχει η υποστήρξη της ελληνικής. Έτσι πλέον μπορείς να ψάξεις με την ρίζα της λέξης Προσέξτε ότι δουλεύει περίφημα καθώς κάνει ορθογραφική υλοποίηση. Αν παρατηρήσετε στην παραπάνω εικόνα θα δείτε ότι την μετοχή της λέξης που έχω γράψει λάθος στη γραμμή 6 δεν την φέρνει, ενώ στην γραμμή 9 που είναι σωστή την φέρνει. Ε Ξ Α Ι Ρ Ε Τ Ι Κ Α !!!!!!!!!!!!!!!!!!!!!! @antonch
×
×
  • Create New...