Jump to content

antonch

Administrators
  • Posts

    1030
  • Joined

  • Last visited

  • Days Won

    7

Blog Entries posted by antonch

  1. antonch
    Άλλοι περισσότερο άλλοι λιγότερο χρησιμοποιούμε το SQL Server Management Studio στην καθημερινότητα μας.
    Μέσα σε αυτή εκτελούμε και αρκετά queries είτε σε πίνακες της βάσης μας είτε σε metadata tables. Το κάνουμε σχεδόν μηχανικά καθημερινά έτσι δεν είναι;

    Όπως επίσης είναι γνωστό ότι μπορούμε να δούμε τα αποτελέσματα αυτών σε διαφορετικές μορφές όπως grid, text, file.
    περισσότερα
  2. antonch
    Εισαγωγή
    Αρκετό καιρό έχω να γράψω ένα μεγάλο άρθρο, έτσι σήμερα μου ήρθε η όρεξη να το κάνω. Έσπαγα το κεφάλι μου να βρω ένα ωραίο θέμα ώστε να σας κεντρίσει το ενδιαφέρον. Αμέσως στο μυαλό μου ήρθε το θέμα που ο τίτλος περιγράφει.
    Γιατί όμως επέλεξα αυτό; Αφορμή για αυτό είναι κάποια γεγονότα και καταστάσεις που αντιμετώπισα τον τελευταίο διάστημα. Επίσης ένας ακόμα σημαντικός λόγος είναι ότι πλέον η εποχή του virtualization είναι πραγματικότητα και μάλιστα χωρίς να το καταλάβεις βρίσκεσαι με ένα μεγάλο αριθμό από τέτοιες μηχανές.
    Σαν σοβαροί επαγγελματίες που θέλουμε να εξοικονομήσουμε χρόνο συνήθως έχουμε προετοιμάσει κάποια base images των λειτουργικών που θέλουμε με εγκατεστημένα τα προϊόντα που εκ προοιμίου θέλουμε, και με την γνωστή διαδικασία (SysPrep) η δημιουργία μιας νέας virtual machine να είναι υπόθεση μερικών λεπτών.
    Σε αυτή την περίπτωση όμως αν είχαμε εγκαταστήσει SQL Server είχαμε να αντιμετωπίσουμε μερικά προβλήματα. Δεν ήταν άλυτα, δεν ήταν φοβέρα. Απλά σου χάλαγαν λίγο την διάθεση και την ευκολία, αλλά τελικά τι δουλεία σου την έκανες (με λίγο γκρίνια βέβαια).
    Όλα αυτά όμως ανήκουν στο παρελθόν. Στον SQL Server 2008 R2 μας δίνεται η δυνατότητα να εγκαταστήσουμε τον SQL Server στο base image μας χωρίς όμως να τον κάνουμε να λειτουργεί. Στην ουσία στήνονται όλα τα binaries, δεν γίνονται όμως configure θέματα που αφορούν computer, network, account-specific information.
    Αυτό μου δίνει τη δυνατότητα να μπορώ ευκολότερα να φτιάξω μια πλειάδα από μηχανές που περιέχουν ετοιμοπόλεμο SQL Server και μάλιστα με το ίδιο configuration!!!
    Τι μπορώ να έχω
    · Με την συγκεκριμένη διαδικασία μπορώ να έχω έτοιμα μόνο τα Database Engine Service & Reporting Services. Τα SQL Server Browser, SQL Server Writer & SQL Server Native Client γίνονται εγκατάσταση όταν τελικά ενεργοποιώ τον SQL Server
    · Μπορώ μετά την προετοιμασία να προσθέσω ή να αφαιρέσω features του SQL Server.
    · Μπορώ να έχω προετοιμάσει πολλά Instances του SQL Server.
    Τι δεν μπορώ
    · Δεν έχω την δυνατότητα να έχω "ετοιμα" SQL Server Analysis Services.
    · Δεν υποστηρίζεται SQL Server Cluster Installation.
    · Δεν υποστηρίζεται η εγκατάσταση των SQL Server Tools (SSMS κλπ)
    · Δεν υποστηρίζεται ΙΑ-64 εγκατάσταση.
    · Δεν μπορώ να κάνω προετοιμασία ένος SQL Server 2008 R2 Instance σε μηχανή που έχει ήδη προηγούμενες εκδόσεις του SQL Server.
    Η διαδικασία προετοιμασίας (Preparation)
    Ξεκινάμε το setup το SQL Server και επιλέγουμε Advanced > Image preparation of a stand-alone instance of SQL Server

    Ξεκινάει η διαδικασία εγκατάστασης όπως την έχουμε συνηθίσει

    Με την ολοκλήρωση της φάσης Setup Support Rules πατάμε OK

    Ακολουθεί η φάση Setup Support Files στην οποία πατάμε Install.

    Η διαδικασία ξεκινάει

    και με την ολοκλήρωση της

    ακολουθούν ο διάλογος με την License Terms όπου φυσικά και επιλέγουμε τα παρακάτω

    Ο επόμενος διάλογος μας δίνει τη δυνατότητα να επιλέξουμε τα features που θέλουμε να έχουμε διαθέσιμα όταν θα ενεργοποιήσουμε το instance μας. Φυσικά όπως είπα και παραπάνω διαθέσιμα δεν είναι όλα

    Αφού επιλέξουμε ο επόμενος διάλογος μας δίνει την δυνατότητα να ορίσουμε κάποιες βασικές πληροφορίες για το instance μας.

    Η βασικότερη είναι το Instance ID. Αυτό χρησιμοποιείται για να ξεχωρίζει τα installation directories και τα registry key του instance σας. Αυτό βέβαια δεν είναι δεσμευτικό όταν θα γίνει η ενεργοποίηση. Μπορείς πχ να ορίσεις σαν Instance ID κάτι και κατά την επόμενη φάση της ενεργοποίησης να δώσεις κάτι άλλο. Απλά το Instance ID θα παραμείνει το ίδιο ώστε να μην υπάρχει αλλαγή όσα παραπάνω ανάφερω.
    Ακολουθούν μερικοί διάλογοι που μας ενημερώνουν για την εξέλιξη της διαδικασίας μας στους οποίους απαντάμε τα βασικά


    Ώσπου φτάνουμε στο σημείο που είμαστε έτοιμοι για την δημιουργία του image. Στο οποίο βλέπουμε τι έχουμε επιλέξει και πατάμε Prepare

    Η διαδικασία ξεκινάει

    και με την ολοκλήρωση της φτάνουμε στον παρακάτω διάλογο

    πριν φύγετε από εδώ καλό είναι να κάνετε κλικ στο link που σας λέει, όπως επίσης και να πάτε στο directory που δείχνει το link αυτό μιας και σε αυτό θα βρείτε το ConfigurationFile.ini το οποίο και μπορείτε να χρησιμοποιήσετε σαν βάση για εγκατάσταση του SQL Server από configuration file
    Με την ολοκλήρωση της διαδικασίας αυτής έχουμε έτοιμο το instance του SQL Server.
    Μπορούμε να προχωρήσουμε στη διαδικασία του Windows SysPrep και να φτίαξουμε μια νέα μηχανή χρησιμοποιώντας το image αυτό το οποίο περιέχει το λειτουργικό μαζί με τον SQL Server.
    Η διαδικασία ενεργοποίησης (Completion)
    Όταν ανοίξουμε την νέα μηχανή και τελειώσουμε με τα του λειτουργικού πάμε στο Start menu και διαλέγουμε μια από τις παρακάτω επιλογές

    και πάμε

    ακολουθούμε τα βήματα


    ώσπου φτάνουμε στον παρακάτω διάλογο στον οποίο επιλέγουμε το προετοιμασμένο μας instance


    Στον παρακάτω διάλογο μπορείς να επιλέξει αν θα το ενεργοποιήσεις σαν default ή named instance

    Ακολουθούν μερικοί διάλογοι με τους οποίους ορίζεις τα παρακάτω





    και φτάνουμε στο σημείο στο οποίο έχουμε δώσει όλες τις απαραίτητες πληροφορίες ώστε να κάνουμε ενεργοποίηση του Instance μας


    Ακολουθούμε τις οδηγίες και τελικά φτάνουμε στο επιθυμητό μας αποτέλεσμα
  3. antonch
    Καιρό ήθελα να γράψω για αυτή και όλο το ξεχνούσα. Πρόσφατα σε μια εκπαίδευση αναφέρεθηκε το όνομα της και αφού το έβαλα σε χίλια δυο σημεία να το κάνω post και να μην το ξεχάσω τελικά τα κατάφερα και δεν την ξέχασα.
    Αρκετές φορές θέλουμε να μεταφέρουμε τα logins που έχουμε σε ένα SQL Server σε κάποιον άλλον. Ιδιαίτερα χρήσιμη όταν έχουμε database mirroring, replication κλπ.
    Υπάρχει ένα άρθρο το οποίο σου δίνει τον κώδικα αυτής και φυσικά αφού την δημιουργήσεις μπορείς να την εκτελέσεις και να πάρεις στο πιάτο τα logins σε μορφή script ώστε να μπορέσεις να τα δημιουργήσεις με κάποιες παραδοχές σε κάποιον άλλον SQL Server.
    Για καθαρά λόγους ευκολίας σε εσάς μεταφέρω το κώδικα εδώ
    USE master
    GO
    IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
    DROP PROCEDURE sp_hexadecimal
    GO
    CREATE PROCEDURE sp_hexadecimal
    @binvalue varbinary(256),
    @hexvalue varchar (514) OUTPUT
    AS
    DECLARE @charvalue varchar (514)
    DECLARE @i int
    DECLARE @length int
    DECLARE @hexstring char(16)
    SELECT @charvalue = '0x'
    SELECT @i = 1
    SELECT @length = DATALENGTH (@binvalue)
    SELECT @hexstring = '0123456789ABCDEF'
    WHILE (@i BEGIN
    DECLARE @tempint int
    DECLARE @firstint int
    DECLARE @secondint int
    SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
    SELECT @firstint = FLOOR(@tempint/16)
    SELECT @secondint = @tempint - (@firstint*16)
    SELECT @charvalue = @charvalue +
    SUBSTRING(@hexstring, @firstint+1, 1) +
    SUBSTRING(@hexstring, @secondint+1, 1)
    SELECT @i = @i + 1
    END

    SELECT @hexvalue = @charvalue
    GO

    IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
    DROP PROCEDURE sp_help_revlogin
    GO
    CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
    DECLARE @name sysname
    DECLARE @type varchar (1)
    DECLARE @hasaccess int
    DECLARE @denylogin int
    DECLARE @is_disabled int
    DECLARE @PWD_varbinary varbinary (256)
    DECLARE @PWD_string varchar (514)
    DECLARE @SID_varbinary varbinary (85)
    DECLARE @SID_string varchar (514)
    DECLARE @tmpstr varchar (1024)
    DECLARE @is_policy_checked varchar (3)
    DECLARE @is_expiration_checked varchar (3)

    DECLARE @defaultdb sysname

    IF (@login_name IS NULL)
    DECLARE login_curs CURSOR FOR

    SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
    sys.server_principals p LEFT JOIN sys.syslogins l
    ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name 'sa'
    ELSE
    DECLARE login_curs CURSOR FOR


    SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
    sys.server_principals p LEFT JOIN sys.syslogins l
    ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
    OPEN login_curs

    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
    IF (@@fetch_status = -1)
    BEGIN
    PRINT 'No login(s) found.'
    CLOSE login_curs
    DEALLOCATE login_curs
    RETURN -1
    END
    SET @tmpstr = '/* sp_help_revlogin script '
    PRINT @tmpstr
    SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
    PRINT @tmpstr
    PRINT ''
    WHILE (@@fetch_status -1)
    BEGIN
    IF (@@fetch_status -2)
    BEGIN
    PRINT ''
    SET @tmpstr = '-- Login: ' + @name
    PRINT @tmpstr
    IF (@type IN ( 'G', 'U'))
    BEGIN -- NT authenticated account/group

    SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ]'
    END
    ELSE BEGIN -- SQL Server authentication
    -- obtain password and sid
    SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
    EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
    EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

    -- obtain password policy state
    SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
    SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name

    SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ]'

    IF ( @is_policy_checked IS NOT NULL )
    BEGIN
    SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
    END
    IF ( @is_expiration_checked IS NOT NULL )
    BEGIN
    SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
    END
    END
    IF (@denylogin = 1)
    BEGIN -- login is denied access
    SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
    END
    ELSE IF (@hasaccess = 0)
    BEGIN -- login exists but does not have access
    SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
    END
    IF (@is_disabled = 1)
    BEGIN -- login is disabled
    SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
    END
    PRINT @tmpstr
    END

    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
    END
    CLOSE login_curs
    DEALLOCATE login_curs
    RETURN 0
    GO

    Το αποτέλεσμα της εκτέλεσης του παραπάνω κώδικα θα σας δημιουργήσει δύο stored procedures στην master τις sp_hexadecimal και sp_help_revlogin.


    Εκτελώντας την sp_help_revlogin θα έχετε ένα script με όλα τα logins του server που την τρέξατε.


    Λεπτομέρειες μπορείτε να διαβάσετε στο άρθρο.


    antonch
  4. antonch
    Το πρόβλημα
    Σαν DBA και ειδικά σε enterprise environments έχουμε το καθήκον να διαχειριζόμαστε ένα αρκετά σημαντικό αριθμό από SQL Server instances που υπάρχουν διάσπαρτα μέσα στο οργανισμό ή την εταιρεία στην οποία εργαζόμαστε. Αυτό σημαίνει ότι πρέπει καθημερινά να παρακολουθούμε την πορεία αυτών των instances ώστε προληπτικά και όχι πυροσβεστικά να δίνουμε λύσεις σε issues που τυχόν θα εμφανιστούν.
    Για να μπορώ όμως σαν DBA να έχω την εικόνα όλων των instances που διαχειρίζομαι θα πρέπει να τα παρακολουθώ ξεχωριστά και αυτό είναι ένας μεγάλος καθημερινός πόνος. Λύσεις για αυτό υπάρχουν πολλές. Τόσο η Microsoft όσο και third party vendors μας παρέχουν σουίτες εργαλείων που μας βοηθούν στο συγκεκριμένο task. Φυσικά αυτό σημαίνει έξτρα κόστος και αξία έχει να το επωμιστώ εφόσον έχω και αλλά πράγματα που θέλω να παρακολουθώ με την χρήση τους. Αν έχω όμως ή θέλω μόνο να παρακολουθώ SQL Server instances αξίζει να επωμιστώ το κόστος;
    Το εργαλείο
    Κατά την άποψη μου όχι καθώς έχω πληθώρα από εργαλεία που ο SQL Server μου δίνει. Ένα από αυτά που δεν είναι και τόσο δημοφιλές (κακώς κατά την άποψη μου), και είναι διαθέσιμο στις Datacenter και Enterprise εκδόσεις τους SQL Server 2008 R2, είναι το SQL Server Utility (SSU).
    To SSU δίνει την δυνατότητα στο DBA να μοντελοποιήσει όλα τα instances που έχει υπό την προστασία του μέσα στην εταιρεία, ώστε μέσω ενός unified view να μπορεί να έχει μια ολιστική εικόνα των resources που το κάθε instance έχει, συγκεντρωτικά ή αναλυτικά μέσω των SQL Server Utility viewpoints. Όλα αυτά μέσα από το γνώριμο σε αυτόν περιβάλλον που δεν είναι άλλο από το SQL Server Management Studio (SSMS).
    Πως λειτουργεί
    Θεμέλιο στην λειτουργία του SSU είναι η δημιουργία ενός κεντρικού σημείου στο οποίο θα συγκεντρώνονται σε τακτά χρονικά διαστήματα (το default interval είναι κάθε 15 λεπτά) στοιχεία που αφορούν SQL Server instances, Data-tier applications, Database files και Storage volumes. Το σημείο αυτό ονομάζεται Utility Control Point (UCP).
    Στην πραγματικότητα το UCP δεν είναι τίποτα περισσότερο από μια database που δημιουργείται στο instance που έχω επιλέξει σαν σημείο συγκέντρωσης των δεδομένων και παίζει το ρόλο ενός data warehouse.
    Από την στιγμή που ο DBA ορίσει το UCP θα πρέπει να εντάξει σε αυτό τα instance που θέλει να παρακολουθεί ώστε να αρχίσει η συγκέντρωση δεδομένων από αυτά και η αποστολή τους προς το UCP.
    Τα δεδομένα που αποστέλλονται από το κάθε instance προς το UCP αφορούν παράγοντες που είναι σημαντικοί για την λειτουργία ενός SQL Server όπως CPU utilization, Storage space utilization.
    Το σημαντικότερο όμως δεν είναι η απλή καταγραφή που έτσι και αλλιώς έχουμε και άλλους τρόπους με τους οποίους μπορούμε να την υλοποιήσουμε όσο η δυνατότητα να συγκρίνουμε τα καταγεγραμμένα αυτά δεδομένα με polices τις οποίες μπορούμε να ορίσουμε μέσα σε αυτό (SSU) είτε καθολικά για όλα τα instances είτε για το κάθε ένα ξεχωριστά. Αυτά αφορούν τις εξής κατηγορίες:
    Instance CPU utilization policies για SQL Server instances και data-tier applications. File space utilization policies για database και log files. Computer CPU utilization policies για host resources Storage volume utilization policies για host resources H συλλογή, αποστολή, επεξεργασία των δεδομένων γίνεται με την χρήση jobs που δημιουργούνται στο κάθε instance που συμμετέχει και για το λόγο αυτό είναι υποχρεωτική η ενεργοποίηση του SQL Server Agent στο κάθε ένα ξεχωριστά το οποίο μάλιστα θα πρέπει να ξεκινάει με domain account.
    Στην παρακάτω εικόνα (κλεμμένη από τα BOL) βλέπουμε μια επισκόπηση της λειτουργίας-αρχιτεκτονικής που το εργαλείο χρησιμοποιεί ώστε να επιτύχει τον σκοπό του.

    Απαιτήσεις
    Φυσικά για την χρήση του SSU υπάρχουν κάποιες απαιτήσεις για τα instance τα οποία μπορούν να συμμετέχουν στην ενημέρωση των στοιχείων και αυτές είναι
    Τα SQL Server instances πρέπει να είναι έκδοσης 10.50 (SQL Server 2008 R2) ή μεγαλύτερη, μπορούμε όμως να έχουμε και 10.00 (SQL Server 2008) αρκεί σε αυτή να έχουμε το SP2. Καταγράφονται πληροφορίες μόνο για τα Database Engine instance και μόνο αυτά μπορούν να μπουν. Το SSU πρέπει να λειτουργεί με Windows domain account. Τα accounts του SQL Server service στο UCP αλλά και σε όλα τα instances που στέλνουν δεδομένα πρέπει να έχουν read permission στους Users στο Active Directory. Απαιτήσεις όμως έχει και το instance το οποίο θα παίζει το ρόλο του UCP και αυτές είναι:
    Η SQL Server edition πρέπει να είναι Datacenter, Enterprise, Developer, ή Evaluation. Πρέπει να υπολογίζουμε περίπου 2GB χώρου στην UCP database (sysutility_mdw) για κάθε managed instance το χρόνο. Ακόμα
    Εάν το UCP instance είναι σε case-insensitive collation τότε όλα τα managed instances του SQL Server πρέπει και αυτά να είναι σε case-insensitive collation. Προτείνετε το UCP instance είναι σε case-sensitive collation Τέλος FILESTREAM data δεν υποστηρίζονται στο SSU. Επίλογος
    Προσωπικά πιστεύω ότι το συγκεκριμένο εργαλείο θα πρέπει να τύχη της προσοχής σας για αυτό και αξίζει να του δώσετε μια ευκαιρία δοκιμάζοντας το. Δεν σας γράφω λεπτομερείς οδηγίες χρήσης αν και μου ήταν εύκολο και αυτό γιατί όλα όσα θέλετε να μάθετε για την χρήση του υπάρχουν στα BOL στο link αυτό Managing the SQL Server Utility
  5. antonch
    Οι περισσότεροι είστε σε κάποιον παραθαλάσσιο μέρος και καλά κάνετε. Παρόλα αυτά όμως τα SQL Saturday Nights ακόμα δεν έχουν τελειώσει, απλά αντί να σας βάζω σε διαδικασίες να τα παρακολουθήσετε live αποφάσισα να φτιάξω ένα απόψε καθώς θέλω να αναδείξω ένα θέμα το οποίο οι περισσότεροι δεν γνωρίζετε ή το γνωρίζετε λίγο ή ακόμα και για αυτούς που το γνωρίζουν δεν είναι κακό να το ξαναδούν.
    Αφορά τον αριθμό των VLFs (Virtual Log Files) που έχει ένα transaction log σε μία database στον SQL Server και πως όταν αυτός ο αριθμός είναι αρκετά μεγάλος επηρεάζει την απόδοση μιας datatase.
    περισσότερα
  6. antonch
    Πάντα ήθελα να τους συναντήσω από κοντά όλους μαζί και τελικά τα κατάφερα. Είναι φοβέρο συναίσθημα να είσαι ανάμεσα στους θρύλους του SQL Server. Μίλησα αρκετά μαζί τους και είχα την ευκαιρία να βγάλω και φωτογραφίες μαζί τους.

     
    Ανάμεσα στον Paul Nielsen και την Kalen Delaney. RESPECT!
  7. antonch
    Το παρακάτω query είναι πάρα πολύ καλό!!!.
    Το ξαναβρήκα τυχαία μπροστά μου καθώς σκάλιζα τα διάφορα scripts που έχω στην βιβλιοθήκη μου. Αν θυμάμαι καλά, γιατί έχει περάσει καιρός, το έχει φτιάξει ένα παλικάρι από την μαμά εταιρία, νομίζω ότι είναι ο Swapnil Bajaj.
    Κάνει φοβερή εκμετάλευση των dymamic views (DMV)
    sys.dm_db_missing_index_group_stats, sys.dm_db_missing_index_groups, sys.dm_db_missing_index_details. Θα σας συνιστούσα να διαβάσετε το documentation στα BOL του SQL Server γιατί έχουν κάποιες "ιδιοτροπίες" οι συγκεκριμένες DMV.
    Επίσης παράγει και το script για την δημιουργία του index .
    Enjoy it.
     


    Code Snippet


    SELECT   sys.objects.name, (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) as Impact,   cast('CREATE NONCLUSTERED INDEX ~NewNameHere~ ON ' + sys.objects.name + ' ( ' + mid.equality_columns + CASE WHEN mid.inequality_columns IS NULL THEN '' ELSE CASE WHEN mid.equality_columns IS NULL THEN '' ELSE ',' END +     mid.inequality_columns END + ' ) ' + CASE WHEN mid.included_columns IS NULL THEN '' ELSE 'INCLUDE (' + mid.included_columns + ')' END + ';' as xml) AS CreateIndexStatement, mid.equality_columns, mid.inequality_columns, mid.included_columns FROM sys.dm_db_missing_index_group_stats AS migs     INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle     INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle     INNER JOIN sys.objects WITH (nolock) ON mid.object_id = sys.objects.object_id WHERE (migs.group_handle IN(SELECT TOP (500) group_handle                             FROM sys.dm_db_missing_index_group_stats WITH (nolock)                             ORDER BY (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) DESC)) ORDER BY 2 DESC



  8. antonch
    Επειδή στο προηγούμενο μου post είχα βάλει για την MySQL τα αντίστοιχα εργαλεία. Θα ήταν μεγάλη μου παράλειψη να μην βάλω και για την Oracle, μιας και στις μέρες μας υπάρχουν αρκετοί που φεύγουν από Oracle και πάνε σε SQL Server. Έτσι λοιπόν για όποιο θέλει να φέρει μια Oracle database σε SQL Server 2005 είτε 2008 μπορεί να καταβάσει τα αντίστοιχα migration tools από τα παρακάτω links
    SQL Server Migration Assistant 2008 for Oracle V4.0 SQL Server Migration Assistant 2005 for Oracle V4.0
  9. antonch
    Φαντάζομαι ότι σε όλους είναι γνωστό ότι για να εκτελεστεί ένα query στον SQL Server περνάει από τον Query Optimizer. Αυτός για να παράξει το execution plan βλέπει τα index statistics. Αυτό σημαίνει ότι όσο καλύτερα ενημερωμένα είναι αυτά τόσο καλύτερα αποτελέσματα θα δώσει ο Query Optimizer.


    Πότε όμως αυτά έχουν ενημερωθεί τελευταία φορά;

    Αν κάποιος θέλει να δώσει απάντηση στο ερώτημα του αυτό δεν έχει παρά να εκτελέσει το παρακάτω query στην βάση του.
    περισσότερα
  10. antonch
    Είναι γνωστή η τρέλλα μου να έχω το μέγιστο δυνατό 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
  11. antonch
    Πριν μερικές μέρες ανακοινώθηκαν από την Microsoft οι πρώτες αλλαγές που αφορούν τις εκδόσεις και τις άδειες χρήσης του προϊόντος.
    Οφείλω να ομολογήσω ότι ποτέ δεν ήμουν από αυτούς που ασχολούνταν με το θέμα των αδειών, θα μπορούσα να πω ότι ήμουν και είμαι αλλεργικός με το θέμα αυτό. Όμως είδα ότι κάτι πάει να αλλάξει στο θέμα αυτό και μάλιστα προς το καλύτερο.
    Επίσης επειδή είχα την τύχη να παρακολουθήσω ένα live meeting σχετικά με αυτά πήρα την απόφαση να προσθέσω και εγώ το λιθαράκι μου με το post αυτό. Είναι αλήθεια πάντως ότι μου πήρε μερικές μέρες για να καταλάβω πως έχει το θέμα με τις άδειες και είχα αρκετές ερωτήσεις.
    Αυτό πάντως που δεν μου ήταν δύσκολο να καταλάβω με την πρώτη ήταν το ποιες θα είναι οι εκδόσεις του SQL Server 2012.
    [read more]
  12. antonch
    Όλοι ξέρουμε το pagefile του λειτουργικού και την χρηστικότητα του.
    Όμως ποιό είναι το ιδανικό μέγεθος του σε ένα server που έχει εγκατεστημένο SQL Server;
    Πρέπει το Pagefile να είναι 1,5 φορές μεγαλύτερο από την φυσική μνήμη του server.
    Εάν έχω ή πρόκειτε να χρησιμοποιήσω full-text search τότε πρέπει να είναι τουλάχιστον τρεις φορές μεγαλύτερο από την φυσική μνήμη του server.
    Για ακόμα καλύτερα αποτελέσματα καλό θα είναι το pagefile να είναι σε ξεχωριστό φυσικό από αυτό του λειτουργικού.
  13. antonch
    Την προηγούμενη εβδομάδα έγινε το SQL PASS SUMMIT 2011 στο Seattle. Στο keynote o Ted Kummert έκανε διάφορες ανακοινώσεις μία από αυτές ήταν ότι το τελικό όνομα για τα SQL Server Developer Tools με την κωδική ονομασία Juneau θα είναι SQL Server Data Tools (SSDT).
     
    Όμως πέρα από την ονομασία ας δούμε μερικά χαρακτηριστικά των SSDT
    Θα είναι διαθέσιμο σε όλους τους SQL Server users σαν free component!!! Θα παίζει με SQL Server 2005, 2008, 2008 R2, 2012 και Azure! Θα γίνεται update κάθε 4-6 μήνες ακολουθόντας τα updates του SQL Azure. Θα είναι hosted στο Visual Studio 2010 SP1 shell. Θα είναι ο αντικαταστάτης των database tools & projects στην επόμενη έκδοση του Visual Studio. Τέλος η full έκδοση θα είναι διαθέσιμη Online με την χρήση του Web Platform Installer
  14. antonch
    Πριν από λίγο ένας συνεργάτης μου, που έχει πολλούς πελάτες με ERP που είναι σε SQL Server μου ζήτησε να παίρνει backup σε ημερήσια εβδομαδιαία βάση αυτοματοποιημένα. Δηλαδή ένα backup για κάθε database (full βεβαια) κάθε μέρα της εβδομάδας, και την επόμενη εβδομάδα να γράφει πάνω στο προηγούμενο της αντίστοιχης ημέρας.
    Η λύση είναι απλή
    Πάμε και φτιάχνουμε ένα job στον SQL Server Agent, και σε αυτό, στο ένα και μοναδικό step βάζουμε το παρακάτω script:
     




    declare @weekday char(3) declare @dbname varchar(50) declare @backupPath varchar(1024) declare @backupFileName varchar(128) declare @command varchar(2048) set @dbname ='' set @backupPath ='' set @backupFileName='' select @weekday=upper(left(datename(dw,getdate()),3)) set @command = 'backup database ' + @dbname + ' to disk=''' + @backupPath +'\' +upper(@backupFileName)+'_'+@weekday+'.bak' + ''' with init' exec (@command)



    Αλλάζουμε τις τιμές στις μεταβλητές @dbname, @backuPath, @backupFileName, με αυτές που θέλουμε και προγραμματίζουμε το job αυτό να τρέχει κάθε μέρα στην ώρα που θέλουμε.
    Με αυτή την υλοποίηση έχουμε καθημερινό backup για την κάθε ημέρα της εβδομάδας σε ξεχωριστά αν ήμερα devices.
    Καλά database backup!
  15. antonch
    Σήμερα το πρωί σε μια συνάντηση που είχαμε όλοι οι Έλληνες MCTs ένας συνάδελφος μου έκανε μια ερώτηση.
    “Θέλω να καταγράφω τα events που γίνονται σε μια βάση στο Windows Event Log γιατί θέλω να τα βλέπω από το MOM;”
    Η απάντηση σε αυτό είναι η παρακάτω, όμως θα πρέπει να επισημάνω ότι είναι για SQL Server 2005 μιας και στον SQL Server 2008 δεν υπάρχει η ανάγκη να κάνουμε κάτι τέτοιο μιας και υπάρχει build-in δυνατότητα την οποία υπόσχομαι να παρουσιάσω σε ένα άλλο μου post.
    Η προσέγγιση θα μπορούσε να γίνει και αλλιώς πχ με Event Notifications αλλά επέλεξα την παρακάτω λύση λόγο της απλότητας της.
    Για την υλοποίηση της λύσης, η οποία είναι draft και μπορεί με την βοήθεια σας να γίνει καλύτερη, θα αξιοποιήσω δύο πράγματα.
    Το πρώτο είναι οι DDL Triggers και το δεύτερο η extented stored procedure xp_logevent.
    Έτσι σε κάθε database που θέλω τα event της να καταγράφονται στο windows event log δημιουργούμε τον παρακάτω ddl trigger.
    Θα πρέπει να τονίσω ότι καταγράφονται μόνο τα DDL statements και όχι τα DML statements.
    CREATE TRIGGER WriteToEventLog
    ON DATABASE
    FOR DDL_DATABASE_LEVEL_EVENTS
    AS
    DECLARE @ed XML
    DECLARE @logmsg char(255)

    SELECT @ed = EVENTDATA()

    -- ΕΠΕΛΕΞΑ ΝΑ ΦΕΡΝΩ ΜΟΝΟ ΤΟ T-SQL COMMAND
    -- ΑΛΛΑ ΜΠΟΡΕΙΤΕ ΝΑ ΔΕΙΞΕΤΕ ΚΑΙ ΑΛΛΑ ΣΤΟΙΧΕΙΑ
    -- ΠΟΥ ΥΠΑΡΧΟΥΝ ΣΤΟ XML ΠΟΥ ΕΠΙΣΤΡΕΦΕΙ Ο TRIGGER
    -- ΜΕΣΩ ΤΗΣ EVENTDATA FUNCTION

    SET @logmsg =
    @ed.VALUE('(/EVENT_INSTANCE/TSQLCommand/CommandText[1]','char(255)')

    EXEC xp_logevent 50001,@logmsg,'WARNING'
    go





    Περιμένω τα σχόλια σας.









  16. antonch
    Αρκετοί με ρωτούν όταν μέσα στα μαθήματα που κάνω όταν λέω SQL Server τον προφέρω "sequel server", ενώ όταν αναφέρομαι στην γλώσσα Transact SQL λέω "transact ess kyoo ell".
    Θα σας δώσω λοιπόν την εξήγηση, την οποία εχω υιοθετήσει. Την έχω διαβάσει σε αρκετά sites και βιβλία, αλλά έχω ρωτήσει και αρκετά άτομα από το SQL Server Development Team της Microsoft στο τελευταίο μου ταξίδι στο Microsoft Campus στο Redmond πέρσι.
    Υπάρχουν δύο βασικοί λόγοι. Ο ένας είναι ιστορικός και ο άλλος γλωσσολογικός.
    Ο ιστορικός λόγος είναι γιατί το 1970 η IBM ανέπτυξε μια γλώσσα την οποία ονόμασε SEQUEL σαν απόρροια ακρωνυμίου από το Structured English QUEry Language. Η γλώσσα αυτή φτιάχτηκε για να κάνει maniplulate data τα οποία ήταν αποθηκευμένα στην database System R η οποία βάση, ήταν βασισμένη πάνω στο RDBMS μοντέλο του Dr. Edgar F. Codd (εαν βρείτε το βιβλίου του διαβάστε το αξίζει ).
    Το 1986 το ANSI υιοθέτησε σαν standard την γλώσσα αυτή και το 1987 την έκανε ISO κόβοντας ταυτόχρονα το όνομα σε SQL και δηλώνοντας και τον τρόπο προφοράς της σε "ess kyoo ell".
    Ο γλωσσολογικός λόγος είναι η απλότητα που δίνεται στην προφορά για όλους τους αγγλόφωνους.
    Τώρα γιατί έχει "καθιερωθεί" ο Microsoft SQL Server να προφέρετε Microsoft Sequel Server; Για να δείξουν ότι είναι RDBMS και όχι γλώσσα δεδομένων υιοθέτησαν την αρχική ονομασία.
    Και για να προλάβω μερικούς...
    Την ονομασία αυτή δεν την έδωσε η Microsoft αλλά οι εταιρίες που αρχικά έφτιαξαν τον SQL Server, για την ιστορία ήταν οι Sybase, Ashton Tale (dBase) και Microsoft, και αυτό έγινε το 1987 που ξέρουμε ποιός από τους τρεις ήταν ο ισχυρός.
  17. antonch
    Σήμερα βγήκε η παρακάτω ανακοίνωση
    Today, SQL Server 2008 R2 received an official release date. It will be listed on Microsoft’s May price list, and will be available by May 2010.
    SQL Server 2008 R2 showcases Microsoft’s continued commitment to business intelligence and mission-critical workloads. Since we made this release available as a Community Technology Preview (CTP) in August 2009, it has been well-received by the community with more than 150,000 downloads. Key customer benefits include:
    · A trusted and scalable platform with high availability, Master Data Services supporting data consistency across heterogeneous systems, StreamInsight enabling high-scale complex event processing, and support for high scale applications with up to 256 logical processors.
    · IT and developer efficiency through central management of multiple database applications, instances or servers, accelerating the development and deployment of applications and providing improved support for virtualization and Live Migration through Hyper-V™ in Windows Server 2008 R2.
    · Managed self-service business intelligence empowering a new class of business users to build and share powerful BI solutions with little to no IT support, while still enabling IT to monitor and manage end-user generated BI solutions with the new PowerPivot for Excel and PowerPivot for SharePoint
    “SQL Server 2008 R2 is freeing up our IT departments to focus on bigger challenges while keeping control of our most valuable asset, our information,” said Fabio Catassi, CTO Mediterranean Shipping Company. “Using Excel and PowerPivot as an interface for Self-Service BI, we are modeling, analyzing and pivoting millions of records in memory and publishing our BI solutions to SharePoint in few minutes. This also allows our geographically remote office branches to access them from a URL at a fraction of the time, and our IT department to centrally manage and monitor information.”
    Customers with Software Assurance can upgrade to SQL Server 2008 R2 and take advantage of the new features without incurring additional licensing costs.
    There’s still time to download, preview, and provide feedback!
    Go to http://www.microsoft.com/sqlserver/2008/en/us/R2Downloads.aspx to get more information and to download the November CTP of SQL Server 2008 R2. And let us know what you think: connect with the SQL Server 2008 R2 Development Team and provide feedback.
  18. antonch
    At the PASS Summit 2009 last week, Ted Kummert announced the soon-to-be-delivered November SQL Server 2008 R2 Community Technology Preview. We’re happy to announce that it is available today for MSDN and TechNet subscribers and it will be available to the general public on November 11th. Go to http://www.microsoft.com/sqlserver/2008/en/us/R2.aspx to get more information and to download!
  19. antonch
    Μια πρωινή ερώτηση που ένας συνάδελφος μου έθεσε ήταν η αφορμή για αυτό το tip of the day. Η ερώτηση του ήταν:

    Πως μπορώ να αλλάξω το schema σε ένα object μέσα σε μια database;


    Η απάντηση είναι απλή και φαίνεται στο παρακάτω παράδειγμα
    περισσότερα
  20. antonch
    Αν ποτέ κατα την διάρκεια που σχεδιάζετε ένα report μέσα στο BIDS χαθεί ξαφνικά το Report Data window το οποίο εμφανίζει τα datasets τα οποία χρησιμοποιούνται στο report που φτιάχνετε μην σας πιάσει πανικός, αλλα ούτε να ψάξετε στα menus.
    Απλά πατήστε Ctrl+Alt+D
  21. antonch
    Όπως αρκετές φορές έχω αναφέρει, τρεις είναι οι παράγοντες που επηρεάζουν την λειτουργία ενός SQL Server και αυτοί είναι: Memory, CPU, I/O.
    Αρκετοί συνάδελφοι δηλώνουν λάτρεις των Dynamic Management Views (DMV) μεταξύ αυτών είμαι και εγώ , όμως το μυστικό σε αυτές είναι να τις χρησιμοποιείς έτσι ώστε να παίρνει από αυτές συνδυαστικά τις περισσότερες φορές τη μέγιστη δυνατή πληροφορία που αυτές μπορούν να σου σώσουν.
    Σε αυτό το post θα σας δείξω πως χρησιμοποιώντας μια εξ αυτών θα μπορέσουμε να αποφανθούμε αν έχουμε IO πρόβλημα στον SQL Server μας γενικά, αλλά και ειδικά σε ποια ή ποιες database(s).
    Δεν θα σας απασχολήσω με την γενική σύνταξη της DMV αυτής ούτε και το τι δείχνει, καθώς είναι εύκολο να το κάνει κάποιος τα BOL.
    Για λόγους καθαρά πρακτικούς όμως θα αναφέρω ότι η sys.dm_io_virtual_file_stats επιστρέφει Ι/Ο στατιστικά για τα database files.
    Εκτελώντας απλά ένα
    Query 1 select * from sys.dm_io_virtual_file_stats(null,null) θα πάρουμε ένα αρκετά μεγάλο, ανάλογα πάντα με τον αριθμό των βάσεων και τα αρχεία που έχουμε σε αυτές.
    Επίσης αρκετά μεγάλος είναι και ο αριθμός των πληροφοριών που μας επιστέφει η dmv αυτή. Έτσι κάπως εύκολα χάνεται κάποιος και δεν μπορεί να βγάλει το επιθυμητό αποτέλεσμα. Αν όμως αρχίσει να φιλτράρει το τι πληροφορία θα χρησιμοποιήσει από την DMV αυτή τότε πραγματικά θα πάρει το αποτέλεσμα που επιθυμεί. Αφού έχουμε διαβάσει από τα BOL το τι μας επιστρέφει αυτή εύκολα μπορούμε να υπολογίσουμε το I/O για κάθε database χρησιμοποιώντας τα num_of_bytes_read και num_of_bytes_written πεδία αυτής. Αυτό μπορεί να γίνει με το παρακάτω query
    Query 2 SELECT     DB_NAME(database_id) AS database_name,     CAST(SUM(num_of_bytes_read + num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB FROM     sys.dm_io_virtual_file_stats(NULL, NULL)-- AS d GROUP BY     database_id ORDER BY     2 DESC  
    Όμως θα ήθελα να έχω ακόμα μία στήλη που να μου δείχνει το ποσοστό Ι/Ο σε κάθε βάση σε σχέση με το συνολικό Ι/Ο που έχω. Έτσι το παραπάνω query διαμορφώνεται ως εξής:
    Query 3 WITH DB_IO_STATISTICS AS (   SELECT     DB_NAME(database_id) AS database_name,     CAST(SUM(num_of_bytes_read + num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB   FROM     sys.dm_io_virtual_file_stats(NULL, NULL)   GROUP BY     database_id ) SELECT   database_name,   db_IO_in_MB,   CAST(db_IO_in_MB / SUM(db_IO_in_MB) OVER() * 100  AS DECIMAL(5, 2)) AS [% IO] FROM     DB_IO_STATISTICS ORDER BY     [% IO] desc;  
    Στις περισσότερες περιπτώσεις το παραπάνω query και το αποτέλεσμα του μας κάνει, και μπορούμε να εντοπίσουμε αυτές τις databases που έχουν πρόβλημα Ι/Ο. Όμως ποιο ή ποια είναι τα αρχεία από αυτή ή αυτές που πραγματικά έχουν πρόβλημα Ι/Ο, ώστε να τα μεταφέρουμε σε άλλο disk array; Απάντηση στο ερώτημα αυτό δίνει το παρακάτω query
    Query 4 WITH DB_IO_STATISTICS AS (   SELECT     DB_NAME(fs.database_id) AS database_name,     mf.name as logical_file_name,     CAST(SUM(fs.num_of_bytes_read + fs.num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB   FROM     sys.dm_io_virtual_file_stats(NULL, NULL) as fs   INNER JOIN     sys.master_files as mf on fs.database_id=mf.database_id and fs.file_id = mf.file_id   GROUP BY     fs.database_id,mf.name ) SELECT   database_name,   logical_file_name,   db_IO_in_MB,   CAST(db_IO_in_MB / SUM(db_IO_in_MB) OVER() * 100  AS DECIMAL(5, 2)) AS [% IO] FROM     DB_IO_STATISTICS ORDER BY     [% IO] desc;  
    Από το παραπάνω εύκολα βλέπουμε ποιο file και σε ποια database έχει I/O issues. Όμως και αυτό δεν είναι αρκετό. Αν για παράδειγμα δούμε ότι κάποιο file έχει 80% Ι/Ο δεν σημαίνει απαραίτητα ότι είναι και προβληματικό. Για να μπορέσουμε να αποφανθούμε θα πρέπει να ελέγξουμε το πόσο περιμένει ή περιμένουν ο χρήστης ή οι χρήστες μέχρι να εκτελέσουν ένα read ή ένα write και αυτό διότι άλλο να είναι ένας χρήστης στην βάση και άλλο πολλοί.
    Για να γίνει αυτό θα πρέπει να δούμε τα στοιχεία που τα πεδία io_stall_read_ms και io_stall_write_ms της DMV μας δίνουν και να τα συνδυάσουμε με τα μέχρι τώρα διαμορφωμένα στοιχεία. Αυτά δείχνουν πόσο περιμένουν οι χρήστες για να κάνουνε ένα read ή write. Βέβαια υπάρχει και το io_stall που δείχνει το σύνολο που οι χρήστες περιμένουν για read και write. Εδώ επειδή δεν μας ενδιαφέρει να το αναλύσουμε περισσότερο αν και είναι εύκολο σαν άσκηση να το κάνετε θα πάρουμε το σύνολο και το παραπάνω query μετατρέπεται ως εξής
    Query 5 WITH DB_IO_STATISTICS AS (   SELECT     DB_NAME(fs.database_id) AS database_name,     mf.name as logical_file_name,     CAST(SUM(fs.num_of_bytes_read + fs.num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB,     SUM(fs.io_stall) as io_stall   FROM     sys.dm_io_virtual_file_stats(NULL, NULL) as fs   INNER JOIN     sys.master_files as mf on fs.database_id=mf.database_id and fs.file_id = mf.file_id   GROUP BY     fs.database_id,mf.name ) SELECT   database_name,   logical_file_name,   db_IO_in_MB,   CAST(db_IO_in_MB / SUM(db_IO_in_MB) OVER() * 100  AS DECIMAL(5, 2)) AS [% IO],   CAST(io_stall / 1000. as DECIMAL(10,2)) as io_stall_in_seconds,   CAST(100. * io_stall / SUM(io_stall) OVER() AS DECIMAL(10, 2)) AS [% IO stall] FROM     DB_IO_STATISTICS ORDER BY     [% IO stall] desc  
    Και επειδή πιθανότατα κάποιος να θελήσει να δει όλα τα παραπάνω αλλά σε επίπεδο drive στο οποίο φυσικά έχει database files ώστε να δει που μπορεί να μεταφέρει database files ώστε να εξομαλύνει το I/O πρόβλημα του, υπάρχει και αυτό σαν δυνατότητα χρησιμοποιώντας την ίδια dmv όπως παρακάτω
    Query 6 WITH DB_IO_STATISTICS AS (   SELECT     left(mf.physical_name,1) as drive,     CAST(SUM(fs.num_of_bytes_read + fs.num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB,     SUM(fs.io_stall) as io_stall   FROM     sys.dm_io_virtual_file_stats(NULL, NULL) as fs   INNER JOIN     sys.master_files as mf on fs.database_id=mf.database_id and fs.file_id = mf.file_id   GROUP BY     left(mf.physical_name,1) ) SELECT   drive,   db_IO_in_MB,   CAST(db_IO_in_MB / SUM(db_IO_in_MB) OVER() * 100  AS DECIMAL(5, 2)) AS [% IO],   CAST(io_stall / 1000. as DECIMAL(10,2)) as io_stall_in_seconds,   CAST(100. * io_stall / SUM(io_stall) OVER() AS DECIMAL(10, 2)) AS [% IO stall] FROM     DB_IO_STATISTICS ORDER BY     [% IO] desc /*antonch*/
  22. antonch
    Οι περισσότεροι σχεδόν χρησιμοποιούν τα SSRS στην καθημερινότητα τους καλύπτοντας τις ανάγκες τους σε reporting. Πρόσφατα είχα μια ενδιαφέρουσα ερώτηση από έναν εκλεκτό φίλο και συνάδελφο σχετικά με αυτά, έτσι μου γεννήθηκε η ιδέα να γράψω το post αυτό.
    SSRS και IIS
    Ένα από τα πρώτα πράγματα που κάνει εντύπωση ειδικότερα σε όσους έχουν προγενέστερη εμπειρία από τον SSRS 2005 είναι το γεγονός ότι από την έκδοση των SSRS 2008 δεν υπάρχει η ανάγκη του IIS. Αν και αυτό μπορεί να είναι κάπως περίεργο, εντούτοις είναι μια σωστή απόφαση ώστε τα SSRS να απαγκιστρωθούν από τον IIS. O IIS είχε μεγάλη επίδραση στα SSRS ιδιαίτερα στην εγκατάσταση τους και αυτό διότι αρκετά IT περιβάλλοντα δεν θέλουν στην ίδια μηχανή να έχουν IIS και SQL Server. Επίσης θα πρέπει να τονισθεί ότι πράγματα όπως το web.config hierarchy μπορεί να έχει, άθελα του, επίδραση στα SSRS επειδή στις περισσότερες περιπτώσεις οι Web Server δεν είναι σωστά configured. Επίσης κατά την γνώμη αρκετών το να έχεις τα SSRS delivery components μέσα στον IIS δεν είναι ότι καλύτερο μιας και δεν σου δίνεται καλύτερο resource governance.
    Στις εκδόσεις μέχρι και τα SSRS 2005 ο IIS χρησιμοποιούταν σαν HTTP server για τα SSRS. Από τα SSRS 2008 και μετά αυτά χρησιμοποιούν απευθείας το HTTP.SYS από το λειτουργικό σύστημα. Έτσι το λειτουργικό πλέον κάνει την δουλειά και όχι ο IIS. Έτσι και αλλιώς θα πρέπει να γίνει κατανοητό ότι τα SSRS δεν είναι ένας γενικού σκοπού web server.
    Εξαιτίας ότι πλέον ο IIS είναι παρελθόν ο Report Server κάνει φυσικά μόνος του url registration και management τόσο για τον Report Manager όσο και για τον Report Server SOAP endpoints κάνοντας χρήση του HTTP.SYS
    Χρησιμοποιώντας το RS Configuration Tool έχουμε την δυνατότητα να settαρουμε αυτά τα URLs μαζί με τις πληροφορίες τους όπως πρωτόκολλο, path, port, virtual directory. Οι πληροφορίες αυτές αποθηκεύονται στο rsreportserver.config στο tag.
    Εδώ μου δίνεται η ευκαιρία να κάνω μια μικρή αλλά σημαντική παρατήρηση . Εξαιτίας ότι δεν υπάρχει εξάρτηση από τον IIS ο Report Manager καθώς και το Report Server web service έχουν ενσωματωθεί στο SQL Server Reporting Services Web Service.
    Συνεχίζοντας μετά την παρατήρηση μου θα πρέπει να αναφερθεί ότι τα ποιο common IIS settings τα οποία υπήρχαν στα SSRS 2005 υποστηρίζονται και στα SSRS 2008 και SSRS 2008 R2. Τέτοια είναι IP address, host headers, multiple ports, SSL certifications, IIS Security modes( NTLM, Kerberos, Negotiate, Basic, Custom). Δεν υποστηρίζονται anonymous, digest και passport authentication ή client certificates.
    Αρκετοί θεωρούν ότι η μεγαλύτερη απώλεια από την ανεξαρτητοποίηση των SSRS από τον IIS είναι τα ISAPI filters. Αν για παράδειγμα είχες single sign-on θα πρέπει να πας με τον ISA πλέον ή αν θέλεις κάποιο άλλο functionality εναλλακτική είναι να πας με ASP.NET HTTP custom modules.
    Φυσικά θα ήταν παράλειψη μου να μη τονίζω ότι μπορείς να έχεις εγκατεστημένο τον IIS και να στήσεις και τα SSRS στον ίδιο server. Αλλά θα πρέπει να γίνει κατανοητό ότι ακόμα και έτσι μιλάμε για δύο διαφορετικά services. Ακόμα και αν φτιάξει ένα virtual directory που έχει το ίδιο όνομα και port στον IIS αυτό δεν πρόκειται ποτέ να δεχθεί τα αιτήματα μιας και το HTTP.SYS πρώτο βλέπει τα αιτήματα αυτά και τα δρομολογεί στα SSRS.
    SSRS Windows Service και Memory Management
    Όλα πλέον στα SSRS είναι ενσωματωμένα σε ένα windows service το οποίο περιέχει τα Report Manager, Report Service Web Service, Scheduling service, Notification service, Event Service.
    Αυτό δεν είναι άλλο από το ReportingServicesService.exe. Το service αυτό κάνει host πολλαπλά application domains. Κάθε ένα από τα παραπάνω ενσωματωμένα services χρησιμοποιεί ξεχωριστό application domain. Αυτό μας δίνει την δυνατότητα να τα ενεργοποιούμε ή απενεργοποιούμε ξεχωριστά αν και υπάρχει εξαρτήσεις μεταξύ τους.
    Παρόλο που έχουμε ξεχωριστά application domains η διαχείριση της μνήμης είναι κοινή για κάθε service μέσα σε αυτό. Tα SSRS χρησιμοποιούν components από το SQL OS για να κάνουν διαχείριση μνήμης. Έτσι ενώ στις προηγούμενες εκδόσεις δεν μπορούσαμε να ελέγξουμε αυτή, εξαιτίας ότι όλα ήταν κάτω από την σκεπή του IIS, τώρα έχουμε την δυνατότητα να ελέγξουμε αυτή ορίζοντας τα πάνω και κάτω όρια αυτής. Επίσης υπάρχουν memory thresholds με αποτέλεσμα όταν ένας από αυτούς εμφανιστεί τα SSRS αλλάζουν συμπεριφορά ώστε να είναι πάντα διαθέσιμα στον τελικό χρήστη.
    Κάθε application domain το οποίο φιλοξενείται μέσα στο SSRS Windows Service όταν ξεκινάει παίρνει το ελάχιστο ποσό μνήμης που χρειάζεται για να ξεκινήσει. Από εκεί και μετά αρχίζει να αναφέρει το τι μνήμη χρησιμοποιεί και φυσικά ακούει τα notification που ο memory manager στέλνει σε αυτό και αφορούν το πόσο μνήμη χρησιμοποιεί και πόση θα πρέπει να απελευθερώσει. Όλα αυτά γίνονται με βάση έναν αλγόριθμο ο οποίος είναι βασισμένος στο χαμηλό κόστος και στο μεγαλύτερο memory consumption.
    Εάν δεν υπάρχει διαθέσιμη μνήμη τότε ο Report Server γυρίζει HTTP 503 error.
    Εάν θέλω να ορίσω το μέγεθος της μνήμης υπάρχουν διαθέσιμα τέσσερεις νέες επιλογές μέσα (ναι δεν είναι γραφικό) στο rsreportserver.config. Αυτές είναι:
    1. WorkingSetMinimum
    Ορίζουμε το ελάχιστο ποσό μνήμη που θέλουμε τα SSRS να χρησιμοποιούν
    2. WorkingSetMaximum
    Ορίζουμε το μέγιστο ποσό μνήμη που θέλουμε τα SSRS να χρησιμοποιούν
    3. MemorySafetyMargin
    Ορίζει το μέγιστο επιτρετό για το low-memory section
    4. MemoryThreshhold
    Ορίζει το μέγιστο επιτρεπτό για το medium-memory pressure section.
    Σε αυτό το σημείο θα πρέπει να σας εξηγήσω λίγο περισσότερο την διαχείριση της μνήμης ώστε να γίνουν κατανοητές οι επιλογές 3 και 4.
    Όταν έρχεται ένα αίτημα για μείωση της μνήμης που χρησιμοποιείται, ο server υπολογίζει το ελάχιστο μέγεθος της μνήμης που θα ελευθερωθεί και λαμβάνει από τα application domains πληροφορίες τέτοιες ώστε να μπορεί να ξέρει πόση μνήμη θα ελευθερώσει και πόσο εύκολα μπορεί να γίνει αυτό γιατί όπως έχω αναφέρει και ποιο πάνω ο αλγόριθμος αυτό κοιτάζει επειδή όταν προσπαθεί να μειώσει την μνήμη ο Report Server κάνει serialize κάποια state information στο δίσκο. Αυτό σημαίνει ότι θα πρέπει να γίνει παύση σε κάποια μεγάλα reports και αυτό το κάνει με το να κάνει serialize και να αφήσει τα μικρά. Έτσι έχουμε τρεις memory pressure καταστάσεις.
    1. Low
    Σε αυτή όλα τα request γίνονται processed και φυσικά νέα γίνονται αποδεκτά. Requests τα οποία απαιτούν background processing συνεχίζουν με χαμηλή προτεραιότητα.
    2. Medium
    Αυτά τα request που είναι σε εξέλιξη συνεχίζουν να εκτελούνται, ενώ τα νέα γίνονται αποδεκτά ανά περίπτωση. Το memory allocation σε όλα τα application domains αρχίζει να μειώνεται με μεγάλη μείωση στα background processing application domains (πχ Scheduling). Tα requests στο web service και στο URL access μπαίνουν στην υψηλή προτεραιότητα ώστε να μην υπάρχει επίπτωση στον τελικό χρήστη.
    3. High
    Δεν γίνονται αποδεκτά νέα request όπως επίσης requests για μνήμη απορρίπτονται. Σε αυτή την περίπτωση αρχίζει και το serialization στο δίσκο όπου φυσικά έχουμε σαν απόρροια να πέφτει η απόδοση των τρεχόντων request.
    Στην παρακάτω εικόνα συνοψίζονται όλα τα παραπάνω

  23. antonch
    Αφορμή για αυτό το post είναι ένα ερώτημα από ένα φίλο της κοινότητα μας (autoexec.gr). Είναι για τον SQL Server 2005 αλλά μπορείτε να το εφαρμόσετε και στις επόμενες εκδόσεις
    Για να εγκαταστήσουμε το database mail θα πρέπει να ακολουθήσουμε τα παρακάτω βήματα. Μια βασική προυπόθεση είναι να έχουμε ένα smtp server με ένα mail account.
    Ανοίγουμε το SSMS και πάμε

    δεξί κλικ Configure Database Mail

    όπου ο Database mail configuration wizard ξεκινάει
     



     
    Στο ερώτημα αυτό απαντάμε Yes στην ουσία ενεργοποιεί το database mail στον SQL Server. Aν πούμε όχι μετά τα πρέπει να πάμε στο Surface Area Configuration για να το ενεργοποίησουμε

    Δίνουμε ένα αναγνωριστικό στο Profile name και πατάμε Add

     
    Συμπληρώνουμε τα στοιχεία που ζητάει η συγκέκριμένη φόρμα με τα στοιχεία του mail account και του smtp server που αυτό υπάρχει, και πατάμε ΟΚ. Θα γυρίσουμε στην προηγούμενη φόρμα και η εικόνα μας θα είναι κάπως έτσι

    Πατάμε Next κάνουμε τα παρακάτω ανάλογα το πως θέλουμε να είναι το profile μας. Εγώ εδώ ορίζω και τα δύο.


    και πατάμε Next

     
     
     
    Πατάμε Next

    Πατάμε Finish

    Πατάμε Close

    και για να ελέγουμε ότι όλα είναι εντάξει επιλέγουμε Send Test E-Mail

    Αφού βεβαιώθουμε ότι όλα είναι ΟΚ πατάμε ΟΚ

    Έαν στον διάλογο που μας ρωτούσε για το αν θέλουμε να ενεργοποιήσουμε το database mail δεν είχαμε απαντήσει καταφατικά θα πρέπει να πάμε στα configuratio tools του SQL Server και να ανοίξουμε το SQL Server Surface Area Configuration Tool, επιλέγοντας το Surface Area Configuration for Features

    και έπειτα πάμε database mail και κάνουμε κλικ στο Enable Database Mail Stored procedured όπως στη παρακάτω εικόνα

    Εάν τώρα θέλουμε μέσα απο τον SQL Server να στέλνουμε mails τότε θα πρέπει αυτό να γίνει με την χρήση της stored procedure sp_send_dbmail. Ένα παράδειγμα έχω στην παρακάτω εικόνα το οποιο εκτελεί ένα query και στέλνει τα αποτελέσματα στους παραλήπτες που έχουμε ορίσει. Αυτοί μπορεί να είναι πολλοί απλά θα πρέπει στην αντίστοιχη παράμετρο να βάλω τα emails τους χωριζόμενα με semicolon (. Για περισσότερες πληροφορίες για την sp αυτή στα books online.
    Ανοίγουμε ένα νέο query window και εκτελούμε την stored procedure sp_send

     
     
     
     
     
     
     
     
     
    Το αποτέλεσμα θα είναι ο παραλήπτης να δει στο mail box του την παρακάτω εικόνα

×
×
  • Create New...