Jump to content

antonch

Administrators
  • Posts

    1030
  • Joined

  • Last visited

  • Days Won

    7

Everything posted by antonch

  1. Ενδιαφέρον link Τελικά υπάρχουν πολλά, πάρα πολλά, που στο τέλος θα χάσουμε το τόπι
  2. πω πω τι μου θυμισες τωρα. κασεττες σε spectum δισκέτες 8,5 ιντσων σε david Θυμάμαι μάλιστα όταν αρχισε να γινεται ντορος με τους ιους μια θειά μου μου έλεγε να προσεχω για να μην κολλήσω, ένας άλλος (πελάτης στην εταιρεία που ημουν τότε) έριχνε κάθε μέρα μέσα στον υπολογιστή 1/4 ασπιρινη για να μην κολλήσει ιο. Αστα να πάνε...
  3. Γιώργο μπορείς να γίνεις πιο συγκεκριμένος όσον αφορά το λάθος που σου εβγαλε. Αυτό μπορείς να το δεις είτε από τα logs του SQL Server Agent είτε από το Job history Δώσε μας περισσότερες λεπτομέρειες για να μπορεσουμε να σε βοηθήσουμε
  4. @Blackman: όχι δα @leo2vt: τα 2-3 λεπτά είναι μικρός χρόνος για να κάνεις κάτι τέτοιο
  5. οπς λάθος μετά προσεξα ότι είναι παλια δημοσιευση
  6. Αφορμή για αυτό το post είναι ο Blackman. Σε μια ωραία συζήτηση που είχαμε μου εξέφρασε την επιθυμία για αυτό επειδή μια εφαρμογή που έχει του αφήνει ανοικτά sessions. Σε αυτό το σημείο θα πρέπει να αναφέρω ότι κάτι τέτοιο μπορεί να συμβεί είτε διότι η εφαρμογή δεν έχει γραφτεί σωστά, είτε έπειδή ο σταθμός εργασίας που έχει ανοίξει το session σταμάτησε να λειτουργεί είτε η εφαρμογή σταμάτησε απότομα. Ο SQL Server βέβαια έχει τους μηχανισμούς για να τα “σκοτώνει” αυτόματα αλλά απαιτείται να πειράξεις registry (http://msdn.microsoft.com/en-us/library/aa275788(SQL.80).aspx) αν θέλεις να γίνεται σε πιο σύντομο διάστημα. Όμως όπως θα δείτε και στο link που σας έδωσα στην ουσία πειράζει το πρωτόκολο επικοινωνίας, και αυτό ίσως να μην το θέλεις αν έχεις και άλλα services. Εαν πάντως δεν θέλεις να κάνεις την παραπάνω αλλαγή σας παρέχω 2 τρόπους για να κάνετε kill τα idle sessions. ΤΡΟΠΟΣ Α. Αυτό ο τρόπος “σκοτώνει” όλα τα idle session σε όλες τις databases εκτός από τις system databases και το session με το οποίο κάνουμε την εκτέλεση της εργασίας. Για να το κάνετε αυτό πρέπει πρώτα να πάρετε τον παρακάτω κώδικα να να τον τρέξετε μέσα από ένα query στον SQL Server με επιλεγμένη βάση την master. Αυτός θα σας φτίαξει μια stored procedure σε αυτή την οποία μπορείτε να την εκτελέσετε ως εξής EXEC dbo.spKillAllIdleSession : είναι ο χρόνος σε λεπτά που το session δεν κάνει τίποτα δηλαδή αν πούμε 20 σημαίνει “σκότωσε όλα τα session που πάνω από 20 λεπτά δεν κάνουν τίποτα. π.χ EXEC dbo.spKillAllIdleSession 20 CREATE PROC dbo.spKillAllIdleSessions @IdleTime int -- Parameter to set your desirable idle time for session in minutes /* This stored procedure kills all idle processes in sql server 2005, 2008 except the current process and all processes on system databases Created by Antonios Chatzipavlis Sep 27, 2009 */ as DECLARE @killCommand varchar(50) DECLARE IdleSessions CURSOR FOR SELECT 'KILL ' + Convert(VARCHAR(5), p.spid) FROM master.sys.sysprocesses AS p WHERE p.spid > 50 AND p.spid @@SPID AND DateDiff(minute, p.last_batch, GetDate()) > @IdleTime AND p.dbid not in (DB_ID('master'),DB_ID('model'),DB_ID('msdb'),DB_ID('tempdb'), DB_ID('ReportServer'),DB_ID('ReportServerTempDB'),DB_ID('distribution')) OPEN IdleSessions FETCH IdleSessions INTO @killCommand WHILE 0 = @@fetch_status BEGIN EXECUTE (@killCommand) -- Actually execute the command FETCH IdleSessions INTO @killCommand END CLOSE IdleSessions DEALLOCATE IdleSessions GO ΤΡΟΠΟΣ Β. Αυτό ο τρόπος “σκοτώνει” όλα τα idle session σε συγκεκριμένη database εκτός από το session με το οποίο κάνουμε την εκτέλεση της εργασίας. Για να το κάνετε αυτό πρέπει πρώτα να πάρετε τον παρακάτω κώδικα να να τον τρέξετε μέσα από ένα query στον SQL Server με επιλεγμένη βάση την master. Αυτός θα σας φτίαξει μια stored procedure σε αυτή την οποία μπορείτε να την εκτελέσετε ως εξής EXEC dbo.spKillAllIdleSessionInDatabase , : είναι ο χρόνος σε λεπτά που το session δεν κάνει τίποτα δηλαδή αν πούμε 20 σημαίνει “σκότωσε όλα τα session που πάνω από 20 λεπτά δεν κάνουν τίποτα. : είναι το όνομα της database. π.χ EXEC dbo.spKillAllIdleSessionInDatabase 20, ‘MyDB’ CREATE PROC dbo.spKillAllIdleSessionsInDatabase @IdleTime int -- Parameter to set your desirable idle time for session in minutes , @DBName varchar(50) -- Parameter to set database name /* This stored procedure kills all idle processes in a specific database Created by Antonios Chatzipavlis Sep 27, 2009 */ as DECLARE @killCommand varchar(50) DECLARE IdleSessions CURSOR FOR SELECT 'KILL ' + Convert(VARCHAR(5), p.spid) FROM master.sys.sysprocesses AS p WHERE p.spid > 50 AND p.spid @@SPID AND DateDiff(minute, p.last_batch, GetDate()) > @IdleTime AND p.dbid =DB_ID(@DBName) OPEN IdleSessions FETCH IdleSessions INTO @killCommand WHILE 0 = @@fetch_status BEGIN EXECUTE (@killCommand) -- Actually execute the command FETCH IdleSessions INTO @killCommand END CLOSE IdleSessions DEALLOCATE IdleSessions GO ΠΑΡΑΤΗΡΗΣΕΙΣ Τόσο κατά την δημιουργία, όσο και κατά την εκτέλεση ο χρήστης με τον οποίο έχετε κάνει login στον SQL Server θα πρέπει να είναι στον system role sysadmins. Εαν θέλετε να το φτιάξετε για SQL Server 2000 απλά αλλάξε το σημείο FROM master.sys.sysprocesses AS p σε FROM master.dbo.sysprocesses AS p
  7. Εδώ έχει ότι θες για licensing http://www.microsoft.com/sqlserver/2008/en/us/licensing.aspx. Ειδικά αυτό το Link θα σε βοηθήσει περισσότερο http://www.microsoftvolumelicensing.com/userights/ProductPage.aspx?pid=356 Οπότε μάλλον για 8 cals πρέπει να πηγαίνεις με την προυπόθεση βέβαια ότι δεν έχεις άλλους που να συνδεόνται στον sql. Αν έχεις τότε θέλεις και για αυτούς cals
  8. Όχι δεν θα σου παίξει αυτό Θα πρέπει να κάνεις 2 άλλαγες στο script Τα παρακάτω declare @weekday varchar(10) select @weekday=upper(datename(dw,getdate())) στην θέση των declare @weekday char(3) select @weekday=upper(left(datename(dw,getdate()),3)) αντίστοιχα
  9. Σωστά! Μόνο που δεν βάζω όλη την λέξη της ημέρας, μόνο τα 3 πρώτα γράμματα
  10. Μόλις έλαβα ένα request από τον συνάδελφο Γιώργο Σίμο να φτιάξω κάτι για να παίρνει schedule backup στο sql server express, μιας και αυτή η έκδοση δεν έχει τον sql server agent. Λοιπόν όποιος θέλει να υλοποιήσει μια τέτοια λύση θα πρέπει να κάνει τα εξής βήματα: BHMA 1o Αποθηκεύω το παρακατώ script σε ένα αρχείο πχ c:\My SQL Scripts\DBBackupPerDay.sql declare @weekday char(3) declare @command varchar(2048) select @weekday=upper(left(datename(dw,getdate()),3)) set @command = 'backup database $(dbname) to disk =''$(backupPath)\$(dbname)_'+@weekday+'.bak' + ''' with init' exec (@command) Εδώ έχω πάρει σαν υπόθεση εργασίας ότι κάθε μέρα θα παίρνουμε ημερήσιο full backup την βάση μας σε ξεχωριστό device, το οποίο στην επόμενη φορά που θα ξαναπάρω backup σε αυτό θα σβήνει το προηγούμενο. Δηλαδή έστω ότι είναι Δευτέρα και παίρνω backup την επόμενη Δευτέρα θα σβηστεί το backup αυτής. Εάν υπάρχει ανάγκη για κάτι διαφορετικό ενημερώστε με να σας δώσω την λύση. ΒΗΜΑ 2ο Ανοίγουμε τον Windows Task Scheduler και φτιάχνουμε ένα νέο Task (Create Task). Δίνουμε όνομα και βάζουμε να τρέχει το συγκεκριμένο με ένα windows account που έχει πρόσβαση στον sql server σαν administrator ( η εύκολη λύση ) ή σαν απλός χρήστης αλλά που το έχουμε δώσει να παίρνει backup databases. Επίσης θα πρέπει να έχει write permissions στο directory στο οποίο πρόκειται να τοποθετήσουμε τα backup μας. ΒΗΜΑ 3ο Πάμε στο Action Tab και φτίαχνουμε ένα νέο action στο οποίο βάζουμε τα εξής στο (1) βάζουμε το SQLCMD.exe μαζί με το full path του λογικά θα είναι το "C:\Program Files\Microsoft SQL Server\90\Tools\binn\SQLCMD.EXE" στο (2) βάζουμε τα εξής /S .\sqlexpress /E /i "c:\My SQL Scripts\DBBackupPerDay.sql" -v dbname=MyDB backuppath=”c:\backups" στις dbname, backuppath βάζουμε αντίστοιχα το όνομα της βάσης μας και το directory στο οποίο θέλουμε να αποθηκεύονται αυτά. ΒΗΜΑ 4ο Τέλος φτιάχνουμε έναν Trigger ( Trigger Tab ) για να πούμε κάθε πότε θέλουμε να γίνεται η εκτέλεση τoυ backup. Καλά backup!!!
  11. Το παρακάτω 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
  12. Βεβαίως καιτον υποστηρίζει δείτε εδω http://support.microsoft.com/?id=956893
  13. Ε1. Παίζει ο SQL Server σε virtualization; Ε2. Τι κερδίσω και τι χάνω από αυτό; Ε3. Να βάζω πάντα τον SQL Server σε virtual environment ή όχι; Ε4. Τι θα με οδηγήσει στο να πάρω την σωστή απόφαση για τον αν θα πάω virtual ή όχι; Ερωτήματα που κατά καιρούς μου έχουν τεθεί είτε από μαθητές μου είτε από συνεργάτες μου. Θα επιχειρήσω να απαντήσω σε όλα αυτά. Ναι ο SQL Server παίζει σε virtual environment. Αυτό με κάνει να κερδίζω σε total cost of ownership (TCO) μιας και είναι χαμηλό αλλά και return of investment (ROI) μιας και αξιοποιώ 100% το hardware μου. Αλλα δεν είναι μόνο αυτά, εξοικονομώ χρήματα διότι καταναλώνω λιγότερη ενέργεια, χρειάζομαι μικρότερους χώρους, αλλά και έχω μια πιο μαζεμένη διαχείριση των server μου. Ακόμα εξοικονομώ χρήματα από τις άδειες χρήσης του SQL Server (Enterprise Editon) μιας και μπορώ να έχω όσες virtual μηχανές θέλω, με SQL Server μέσα σε αυτές, σε μια φυσική μηχανή, αρκεί να έχω αγοράσει άδειες, του SQL Server, για όλους τους φυσικούς επεξεργαστές που υπάρχουν σε αυτή (φυσική μηχανή). Υπάρχουν και άλλα πλεονεκτήματα αλλά και μειονεκτήματα, δεν θα τα αναφέρω όλα. Μπορείτε όμως να τα βρείτε από το http://www.microsoft.com/sqlserver/2008/en/us/virtualization.aspx link. Εκεί που θέλω να δώσω την μεγαλύτερη βαρύτητα είναι στο με πια κριτήρια επιλέγω να πάω τον SQL Server μου σε virtual environment. Ο βασικότερος για μένα είναι το performance. Όλοι ξέρουμε ότι υπάρχει ένα θέμα με αυτό στα virtual enviroments. Αν και στα Windows Server 2008 R2 με Hyper-V τα πράγματα έχουν γίνει αισθητά καλύτερα, εντούτοις παραμένει ένα θέμα, ειδικά για VLDBs (Very Large Databases) και για heavily transactional OLTP databases, και φυσικά καλό είναι να αποφεύγουμε το virtualization σε τέτοιες περιπτώσεις. Ποιες είναι όμως οι περιπτώσεις που θα μπορούσα να έχω το SQL Server σε virtual environment χωρίς να αντιμετωπίσω προβλήματα είτε performance είτε οτιδήποτε άλλο; Μερικές τέτοιες είναι οι παρακάτω: Consolidating underutilized servers BI components όπως Analysis Services και Reporting Services Managing high availability με Hyper-V Live Migration για hardware maintenance Remote site consolidation με Database Mirroring Development and Test environments. Το θέμα είναι μεγάλο. Οι συζητήσεις και οι ερωτήσεις γύρω από αυτό πολλές. Δεν υπάρχει άσπρο ή μαύρο. Όλα είναι θέμα σωστής εκτίμησης η οποία θα βγει μόνο αν είσαι ενημερωμένος σωστά στο θέμα. Εικασίες, φήμες, και μου το είπε ο Μήτσος δεν χωράνε εδώ. Εγώ απλά θέλω να σας τριβελίσω το μυαλό αλλά και να σας δώσω μια σειρά από Links μέσα από τα οποία θα βρείτε πληροφορίες σημαντικές για το θέμα αυτό. Παράλληλα όμως θέλω να σας τονίσω ότι καλό είναι να κρατήσετε σαν μπουσούλα τις παραπάνω περιπτώσεις ένα δεν θέλετε να μπείτε περισσότερο σε βάθος. Τα links είναι http://www.microsoft.com/sqlserver/2008/en/us/virtualization.aspx http://www.microsoft.com/virtualization/solutions/business-critical-applications/default.mspx http://msdn.microsoft.com/en-us/architecture/dd393309.aspx
  14. Το Madison είναι ένας highly scalable data warehouse προσαρμογέας ο οποίος προσφέρει high performance σε χαμηλό κόστος μέσω μιας Massively Parallel Processing (MPP) αρχιτεκτονικής για τον SQL Server. Σε σχέση με τον ανταγωνισμό το Madison προσφέρει “hardware flexibility with configurations from the major hardware vendors and low cost through industry standard hardware”, όπως χαρακτηριστικά λεει η ανακοίνωση. Με αυτό το project η Microsoft μεγαλώνει το μέγεθος των data warehouses από τα περίπου 50GB που είναι σήμερα πάνω από το 1 Petabyte μέσω scaling out, αυτή την στιγμή έχουν φτάσει στα 20 nodes. Μέχρι σήμερα στην δοκιμή αυτή συμμετέχουν 10 πελάτες της Microsoft από 7 διαφορετικές επιχειρηματικές δραστηριότητες. Τα πρώτα αποτελέσματα είναι εντυπωσιακά όπως Data loading rate 1 TB / hour Processing query executions > 1,5 ΤΒ / min Για να συμμετέχει κάποιος σε αυτό το CTP θα πρέπει να έχει κάποιες προϋποθέσεις που έχουν ορισθεί, και ο αριθμός των συμμετεχόντων θα είναι περιορισμένος. Για όσους επιθυμούν να συμμετέχουν σε αυτό θα πρέπει να στείλουν mail στο [email protected] Για περισσότερες πληροφορίες για το Madison Project θα βρείτε εδώ · Madison Website: http://www.microsoft.com/sqlserver/2008/en/us/madison.aspx · SQL Server 2008 Website: http://www.microsoft.com/sqlserver/2008/en/us/default.aspx
  15. Τον Scott Hanselman όλοι τον έχετε ακουστά Στο blog του έχει μια ενδιαφέρουσα λίστα από τα εργαλεία που μέσα στο πέρασμα του χρόνου χρησιμοποιεί. Είναι άκρως ενδιαφέρουσα λίστα http://www.hanselman.com/blog/ScottHanselmans2009UltimateDeveloperAndPowerUsersToolListForWindows.aspx
  16. Καλησπέρα σας. Τι έγινε κουνηθήκαμε λιγάκι σήμερα ε; Λοιπόν αυτό ήταν καλό γιατί μου ήρθε η ιδέα για το post αυτό. Επειδή είναι αδύνατο, τουλάχιστον για μένα, να τα θυμάμαι όλα απ’ έξω, σας δίνω μερικά links στα οποία θα βρείτε cheat sheets για την T-SQL. TSQL Cheatsheet SQL Server TSQL Cheatsheet Dave Pinal or SQL Authority's Cheatsheet Φιλικά Αντώνης
  17. Καλημέρα και καλό μήνα σε όλους. Σήμερα έπεσα πάνω σε ένα μήνυμα λάθους το οποίο με προβλημάτισε αρκετά. Μέσα από ένα CLR Trigger έπαιρνα το παρακάτω μήνυμα λάθους A .NET Framework error occurred during execution of user-defined routine or aggregate "…": System.InvalidOperationException: Data access is not allowed in this context. Either the context is a function or method not marked with DataAccessKind.Read or SystemDataAccessKind.Read, is a callback to obtain data from FillRow method of a Table Valued Function, or is a UDT validation method. Έπειτα από την σχετική έρευνα βρήκα το παρακάτω link το οποίο δίνει λύση στο προβλημα You may not be able to make a remote connection to SQL Server from a CLR trigger
  18. Πολύ καλή πληροφορία Χρήστο. Αλλά ποιος σε ακούει...
  19. Μέσα σε έναν οργανισμό θα συναντήσουμε πολλές batabase οι οποίες περιέχουν business-critical data. Πάνω από αυτές θα βρούμε applications τα οποία διαχειρίζονται τα δεδομένα αυτά. Καθώς ο όγκος των δεδομένων γεωμετρικά αυξάνετε, αλλά και ο αριθμός των χρηστών που ζητούν πρόσβαση σε αυτά μεγαλώνει, είναι κατανοητό σε όλους ότι η διαθεσιμότητα των δεδομένων πρέπει να είναι αδιάλειπτη, όπως επίσης και η ταχύτητα απόκρισης στα ερώτημα και στα transactions των χρηστών πρέπει να είναι μεγάλη και σταθερή. Ο SQL Server 2008 παρουσίασε μια σειρά από εργαλεία τα οποία σκοπό έχουν να βοηθήσουν τον DBA στο να παρέχει τα παραπάνω. Ένα από αυτά τα εργαλεία είναι και ο RESOURCE GOVERNOR με τον οποίο θα ασχοληθώ σε αυτό το post μου. Το πρόβλημα Στις προηγούμενες εκδόσεις του SQL Server όταν ήμασταν σε ώρες αιχμής κάποιες βασικές εφαρμογές βλέπαμε να υποφέρουν κυριολεκτικά σε performance και αυτό διότι υπήρχαν άλλες λιγότερο βασικές εφαρμογές που έτρεχαν παράλληλα εκτελούσαν "βαριές εργασίες". Όμως ακόμα και στην περίπτωση που έχουμε μια βασική εφαρμογή αλλά μεγάλο αριθμό χρηστών, που ο καθένας όμως κάνει εργασία με διαφορετικό βάρος στην παραγωγική διαδικασία της ημέρας, πόσες φορές έχουμε έρθει αντιμέτωποι με προβλήματα όπως η τιμολόγηση ή το λογιστήριο ή ακόμα χειρότερα το αφεντικό να "σέρνονται"; Η αιτία για όλα αυτά είναι ότι όλες οι εφαρμογές και όλοι οι χρήστες έπαιρναν στο μέτρο του δυνατού ισόποσα ποσοστά χρήσης τόσο της μνήμης όσο και της CPU. Την λύση στα παραπάνω ήρθε να δώσει ο Resource Governor. Τί είναι ο Resource Governor? Ταξινομεί τα εισερχόμενα connections και τα βάζει το καθένα σε προκαθαρισμένο workload group. Ομαδοποιεί τα resources σε resource pools, που το κάθε ένα ορίζει όρια όσον αφορά την χρήση της CPU και της μνήμης. Συνδέει τα workload groups σε resource pools. Παρακολουθεί τα resources χρησιμοποιώντας το workload group. Ορίζει την προτεραιότητα μεταξύ των workload groups. Τι είναι τα Resource Pools? Ένα recourse pool συσχετίζεται με τους φυσικούς πόρους που ο server μας έχει. Με την ολοκλήρωση της εγκατάστασης του SQL Server 2008 έχω εκ προοιμίου δύο resource pools, τα default (χρησιμοποιείται για όλα τα groups που δεν τους έχω ορίσει pool) και internal (είναι για τις εσωτερικές εργασίες του SQL Server). Μπορώ να φτιάξω και τα δικά μου και κάθε resource pool μπορώ να ορίσω (δεν μπορώ να το κάνω στα default και Internal) τα εξής: Minimum CPU percentage (0->100) Maximum CPU percentage (100->0) Minimum memory percentage (0->100) Maximum memory percentage (100->0) Τι είναι τα Workload Groups? Είναι ο container για τα session requests τα οποία τα ίδια κριτήρια ταξινόμησης. Με την ολοκλήρωση της εγκατάστασης του SQL Server 2008 έχω εκ προοιμίου δύο workload groups τα default και internal, τα οποία εξ' ορισμού ανήκουν στα default & internal resource pools. Εδώ θα πρέπει να επισημάνω ότι και αυτά που θα φτιάξω εγώ μπορούν να ανήκουν σε ένα και μόνο ένα resource pool. Σε κάθε workload group μπορώ να ορίσω τα εξής: Assign a Priority Ορίζω το priority (Low, Medium, High). Limit Maximum Requests Ορίζω τον αριθμό των ταυτόχρονων requests τα οποία επιτρέπονται να εκτελεστούν στο συγκεκριμένο workload group. Limit CPU Time (Sec) Ορίζω το maximum χρόνο της CPU που ένα request μπορεί να χρησιμοποιήσει. Limit Memory Grant % Ορίζω το maximum ποσοστό μνήμης που ένα request μπορεί να πάρει από το pool. Limit Grant Timeout (Sec) Ορίζω το maximum του χρόνου που ένα query θα περιμένει ένα resource να γίνει διαθέσιμο πριν αποτύχει. Limit Degree of Parallelism Ορίζω τον maximum αριθμό επεξεργαστών που το request μπορεί να χρησιμοποιήσει. Τι είναι τo Classifier Function? Είναι το function αυτό με το οποίο γίνεται η ανάθεση του νέου session/εφαρμογή σε workload group. Αυτό είναι ένα και μόνο ένα κάθε φορά δηλαδή δεν μπορώ να έχω ταυτόχρονα δύο classifier functions. Μετά από κάθε αλλαγή σε αυτό θα πρέπει να κάνω reconfigure τον R.G. Μέσα σε αυτό το function μπορώ να χρησιμοποιήσω system functions για να κατατάξω το session/εφαρμογή στο workload group όπως τα HOST_NAME APP_NAME Προσοχή σε αυτό διότι είναι κάτι το οποίο ορίζεται μέσα στο connection string της εφαρμογής και μπορεί να αλλαχθεί ανά πάσα στιγμή από κάποιον με σκοπό να πάρει καλύτερο workload group. SUSER_NAME SUSER_SNAME IS_SRVROLEMEMBER IS_MEMBER ORIGINAL_DB_ΝΑΜΕ και άλλα Δέστε στα BOL τι κάνει το καθένα. Υπάρχουν περιορισμοί? Βέβαια υπάρχουν και περιορισμοί και αυτοί είναι: Δουλεύει μόνο με το Database Engine. Δηλαδή όχι Analysis, Integration, Reporting Services. Ορίζεται ξεχωριστά για κάθε instance. Δηλαδή δεν έχω κεντρική διαχείριση για όλα τα instances του SQL Server. Δεν έχω την δυνατότητα να ελέγξω IO allocations μόνο MEMORY & CPU (μάλλον στην επόμενη έκδοση) Σε καμία περίπτωση δεν μπορώ να πως σε ένα συγκεκριμένο query να πάει γρηγορότερα. Ο Resource Governor είναι διαθέσιμος μόνο στην Enterprise Edition του SQL Server 2008. Παρατηρήσεις Ο R.G εφαρμόζεται μόνο όταν υπάρχει ανάγκη να εφαρμοστεί. Πχ. έχω μια εφαρμογή η οποία ανήκει σε ένα workload group στο οποίο έχω ορίσει max CPU 40%. Εφόσον την δεδομένη χρονική στιγμή που εκτελείται η εφαρμογή δεν υπάρχει κάποια άλλη που να είναι σε κάποιο άλλο group με μεγαλύτερο ποσοστό, δύναται να χρησιμοποιήσει όλη την CPU. To άθροισμα των μικρότερων (minimum) τιμών δεν μπορεί να περνάει το 100% Ότι πόρους αφήνουν ελεύθερους τα pools αυτά μοιράζονται. DEMO Την υλοποίηση του demo την έκανα με T-SQL. Βέβαια υπάρχει και γραφικό περιβάλλον για να υλοποιήσεις τον Resource Governor όπως θα δείτε και στα παρακάτω screen shoots. To demo θα το βρείτε εδώ Τα σχόλια σας είναι πάντα ευπρόσδεκτα!
  20. Τόσα χρόνια στον χώρο της πληροφορικής έχω μάθει να προσπαθώ να καταλάβω τι γίνεται πίσω από την σκηνή με αυτό που ασχολούμαι. Ο SQL Server είναι ένα από αυτά, και στο οποίο έχω αφιερώσει αρκετές τρίχες της κεφαλής μου. Σήμερα θα σας πάρω λίγο από τον πολύτιμο χρόνο σας για να σας μεταφέρω μια γνώση που θα σας φανεί αρκετά χρήσιμη. Όλοι λίγο ή πολύ έχετε γράψει ένα sql query. Άλλες φορές αυτό λειτούργησε άψογα άλλες φορές όχι. Το μυστικό για να γράψεις ένα καλό sql query είναι να έχεις κατανοήσει πως αυτό λογικά εκτελείται, ιδιαίτερα στην μηχανή που χρησιμοποιείς, στην δικιά μας περίπτωση ο SQL Server. Ένα sql query περιέχει κάποιες εκφράσεις μέσα του, εδώ θα ασχοληθούμε με τι βασικές, Έτσι ένα sql query είναι της μορφής αυτής. Στους αριθμούς μέσα στις παρενθέσεις φαίνεται η σειρά, βήμα, φάση εκτέλεσης. Κάθε βήμα δημιουργεί έναν virtual table ο οποίος είναι το input για το επόμενο βήμα. Αυτά το virtual tables δεν είναι διαθέσιμα σε κανένα πλήν του SQL Server, εκτός του τελευταίου που είναι και αυτό που παίρνουμε σαν απάντηση. Εάν στο sql query μας δεν έχουμε κάποια έκφραση απλά αυτή αγνοείτε και πάει στο επόμενο βήμα. (8) SELECT (9) DISTINCT (11) (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) WITH {CUBE | ROLLUP} (7) HAVING (10) ORDER BY Ας δούμε τα πράγματα λίγο αναλυτικά με ένα παράδειγμα που θα δημιουργήσουμε με το παρακάτω script SET NOCOUNT ON; USE tempdb; GO IF OBJECT_ID('dbo.Orders') IS NOT NULL DROP TABLE dbo.Orders; GO IF OBJECT_ID('dbo.Customers') IS NOT NULL DROP TABLE dbo.Customers; GO CREATE TABLE dbo.Customers ( customerid CHAR(5) NOT NULL PRIMARY KEY, city VARCHAR(10) NOT NULL ); INSERT INTO dbo.Customers(customerid, city) VALUES('ANTON', 'Athens'); INSERT INTO dbo.Customers(customerid, city) VALUES('NASOS', 'Athens'); INSERT INTO dbo.Customers(customerid, city) VALUES('FANIS', 'Athens'); INSERT INTO dbo.Customers(customerid, city) VALUES('CHRIS', 'Salonica'); CREATE TABLE dbo.Orders ( orderid INT NOT NULL PRIMARY KEY, customerid CHAR(5) NULL REFERENCES Customers(customerid) ); INSERT INTO dbo.Orders(orderid, customerid) VALUES(1, 'NASOS'); INSERT INTO dbo.Orders(orderid, customerid) VALUES(2, 'NASOS'); INSERT INTO dbo.Orders(orderid, customerid) VALUES(3, 'FANIS'); INSERT INTO dbo.Orders(orderid, customerid) VALUES(4, 'FANIS'); INSERT INTO dbo.Orders(orderid, customerid) VALUES(5, 'FANIS'); INSERT INTO dbo.Orders(orderid, customerid) VALUES(6, 'CHRIS'); INSERT INTO dbo.Orders(orderid, customerid) VALUES(7, NULL); Μετά από την εκτέλεση του θα έχουμε δύο πίνακες τους Customers, Orders οι οποίοι είναι related μεταξύ τους και τα δεδομένα τους θα είναι τα εξής Customers Table Data customerid city ANTON Athens CHRIS Salonica FANIS Athens NASOS Athens Orders Table Data Orderid customerid 1 NASOS 2 NASOS 3 FANIS 4 FANIS 5 FANIS 6 CHRIS 7 NULL Ας πάρουμε σαν σενάριο ότι θέλουμε να βούμε τους πελάτες της Αθήνας που έχουν κάτω από τρεις παραγγελίες. Έτσι το sql query μας θα είναι σαν αυτό. SELECT C.customerid, COUNT(O.orderid) AS numorders FROM dbo.Customers AS C LEFT OUTER JOIN dbo.Orders AS O ON C.customerid = O.customerid WHERE C.city = 'Athens' GROUP BY C.customerid HAVING COUNT(O.orderid) 3 ORDER BY numorders; Το αποτέλεσμα της εκτέλεσης του είναι το παρακάτω Customerid numorders ANTON 0 NASOS 2 Ποιά είναι όμως η λογική του εκτέλεση; Ας δούμε λοιπόν τα βήματα της εκτέλεσης. Βήμα 1ο - Cross Join FROM dbo.Customers AS C ... JOIN dbo.Orders AS O Εδώ φτιάχνει το καρτεσιανό γινόμενο των δύο πινάκων και το βάζει στο 1ο virtual table (VT1). Το περιεχόμενο του πίνακα αυτού είναι 28 γραμμές ( 4x7). Customerid City Orderid customerid ANTON Athens 1 NASOS ANTON Athens 2 NASOS ANTON Athens 3 FANIS ANTON Athens 4 FANIS ANTON Athens 5 FANIS ANTON Athens 6 CHRIS ANTON Athens 7 NULL CHRIS Salonica 1 NASOS CHRIS Salonica 2 NASOS CHRIS Salonica 3 FANIS CHRIS Salonica 4 FANIS CHRIS Salonica 5 FANIS CHRIS Salonica 6 CHRIS CHRIS Salonica 7 NULL FANIS Athens 1 NASOS FANIS Athens 2 NASOS FANIS Athens 3 FANIS FANIS Athens 4 FANIS FANIS Athens 5 FANIS FANIS Athens 6 CHRIS FANIS Athens 7 NULL NASOS Athens 1 NASOS NASOS Athens 2 NASOS NASOS Athens 3 FANIS NASOS Athens 4 FANIS NASOS Athens 5 FANIS NASOS Athens 6 CHRIS NASOS Athens 7 NULL Βήμα 2ο - Apply Join condition ON Filter ON C.customerid = O.customerid Στο βήμα αυτό εφαρμόζεται το ON που υπάρχει στο Join και μόνο τα rows εκείνα τα οποία ικανοποιούν το βήμα πηγαίνουν στον VT2 που θα είναι το αποτέλεσμα του βήματος αυτού. Έτσι αν πάρω τον VT1 και εφαρμόσω στο παράδειγμα μας το ON θα έχω το εξής αποτέλεσμα Customerid City Orderid customerid ΟΝ Filter ANTON Athens 1 NASOS FALSE ANTON Athens 2 NASOS FALSE ANTON Athens 3 FANIS FALSE ANTON Athens 4 FANIS FALSE ANTON Athens 5 FANIS FALSE ANTON Athens 6 CHRIS FALSE ANTON Athens 7 NULL UNKNOWN CHRIS Salonica 1 NASOS FALSE CHRIS Salonica 2 NASOS FALSE CHRIS Salonica 3 FANIS FALSE CHRIS Salonica 4 FANIS FALSE CHRIS Salonica 5 FANIS FALSE CHRIS Salonica 6 CHRIS TRUE CHRIS Salonica 7 NULL UNKNOWN FANIS Athens 1 NASOS FALSE FANIS Athens 2 NASOS FALSE FANIS Athens 3 FANIS TRUE FANIS Athens 4 FANIS TRUE FANIS Athens 5 FANIS TRUE FANIS Athens 6 CHRIS FALSE FANIS Athens 7 NULL UNKNOWN NASOS Athens 1 NASOS TRUE NASOS Athens 2 NASOS TRUE NASOS Athens 3 FANIS FALSE NASOS Athens 4 FANIS FALSE NASOS Athens 5 FANIS FALSE NASOS Athens 6 CHRIS FALSE NASOS Athens 7 NULL UNKNOWN Δηλαδή ο VT2 θα είναι τελικά ο παρακάτω Customerid City Orderid customerid CHRIS Salonica 6 CHRIS FANIS Athens 3 FANIS FANIS Athens 4 FANIS FANIS Athens 5 FANIS NASOS Athens 1 NASOS NASOS Athens 2 NASOS Βήμα 3ο - Apply OUTER Join FROM dbo.Customers AS C LEFT OUTER JOIN dbo.Orders AS O Στην περίπτωση μας μόνο ένας είναι ο πελάτης από την πίνακα τον πελατών που δεν υπάρχει στον VT2 o ΑΝΤΟΝ οπότε μπαίνει και αυτό στον VT3 που είναι το αποτέλεσμα του βήματος αυτού Customerid City Orderid customerid CHRIS Salonica 6 CHRIS FANIS Athens 3 FANIS FANIS Athens 4 FANIS FANIS Athens 5 FANIS NASOS Athens 1 NASOS NASOS Athens 2 NASOS ΑΝΤΟΝ Athens NULL NULL Βήμα 4ο - Apply WHERE filter WHERE C.city = 'Athens' Το αποτέλεσμα είναι ο VT4 Customerid City Orderid customerid FANIS Athens 3 FANIS FANIS Athens 4 FANIS FANIS Athens 5 FANIS NASOS Athens 1 NASOS NASOS Athens 2 NASOS ΑΝΤΟΝ Athens NULL NULL Βήμα 5ο - Apply Grouping GROUP BY C.customerid Το αποτέλεσμα είναι ο VT5 Customerid City Orderid customerid FANIS Athens 3 FANIS FANIS Athens 4 FANIS FANIS Athens 5 FANIS NASOS Athens 1 NASOS NASOS Athens 2 NASOS ΑΝΤΟΝ Athens NULL NULL Βήμα 6ο - Apply Cube or Rollup Δεν έχουμε κάτι τέτοιο στο query μας οπότε πάει στο επόμενο βήμα. Βήμα 7ο - Apply HAVING Filter HAVING COUNT(O.orderid) 3 Το αποτέλεσμα είναι ο VT7 Customerid City Orderid customerid NASOS Athens 1 NASOS NASOS Athens 2 NASOS ΑΝΤΟΝ Athens NULL NULL Βήμα 8ο - Apply SELECT List SELECT C.customerid, COUNT(O.orderid) AS numorders Το αποτέλεσμα είναι ο VT8 Customerid numorders NASOS 2 ANTON 0 Βήμα 9ο - Apply DISTINCT Δεν έχουμε κάτι τέτοιο στο query μας οπότε πάει στο επόμενο βήμα. Βήμα 10ο - Apply ORDER BY SELECT C.customerid, COUNT(O.orderid) AS numorders Το αποτέλεσμα είναι ο VT10 Customerid numorders ANTON 0 NASOS 2 Βήμα 11ο - Apply TOP Δεν έχουμε κάτι τέτοιο στο query μας οπότε καταλήγουμε στο τελικό μας αποτέλεσμα. ΥΓ. Επίτηδες παρέλειψα κάποια βήματα για να μην σας κουράσω. Αν υπάρχει απαίτηση από εσάς μέσω των σχολίων σας θα προχωρήσω βαθύτερα και σε αυτά
  21. Αρκετοί με ρωτούν όταν μέσα στα μαθήματα που κάνω όταν λέω 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 που ξέρουμε ποιός από τους τρεις ήταν ο ισχυρός.
  22. Τις τελευταίες μέρες κάνω διάφορα πειράματα και δοκιμές στον SQL Server 2008 πάνω σε Windows Server 2008 R2. Έτσι έφτιαξα μια μηχανή στην οποία ήθελα να έχω περισσότερα από ένα instances του SQL Server 2008. Έστησα το πρώτο έκανα και τα απαραίτητα updates & restarts και πήγα να στήσω το δεύτερο. Με το που ξεκίνησε μου βγάζει το μήνυμα “Invoke or BeginInvoke cannot be called on a control until the window handle has been created.” ‘Επειτα από μια έρευνα που έκανα βρήκα ότι αυτό γίνεται εξαιτίας της αλλαγής συμπεριφοράς που έχει το .NET Framework τόσο στον Windows Server 2008 R2, όσο και στα Windows 7, που αφορά το πως γίνεται handle τα UI dialogs με αποτέλεσμα σε κάποιες περιπτώσεις να βγάζει το μήνημα αυτό. Μάλλον είναι bug αλλά για να είμαι σίγουρος θα περιμένω την επιβεβαιώση. Από ότι φαίνεται αυτό θα το συναντήσουμε και στην R2 έκδοση του SQL Server 2008. Το καλό βέβαια είναι ότι δεν δημιουργεί ιδιαίτερο πρόβλημα μιας και αν αμέσως ξαναξεκινήσεις το setup αυτό θα προχωρήσει κανονικά. Φιλικά Αντώνης
  23. Σήμερα αντιμετώπισα ένα μήνυμα λάθους που δεν το είχα ξαναδεί μέχρι τώρα Ο φίλος Νίκος Κοασίδης από την Θεσσαλονίκη προσπαθούσε να στήσει την Express έκδοση του SQL Server 2005 σε windows xp ελληνικά με sp3. Βέβαια αυτό μπορεί να συμβεί και στις άλλες εκδόσεις. Με το που ξεκινούσε την εγκατάσταση εμφάνιζε το μήνυμα λάθους “SQL Server Setup unexpectedly failed. For more information, review the Setup summary log file..." Μετά από μια σύντομη αναζήτηση βρήκα το εξής που λύνει το πρόβλημα αυτό. Πάμε στην registry και κοιτάμε δύο hives τα HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders και HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders Μέσα σε αυτές πρέπει να υπάρχει το entry “ΑppData” με value “%USERPROFILE%\Application Data”. Έαν δεν υπάρχει το δημιουργούμε (String). Στον Νίκο έλειπε από το HKEY_CURRENT_USER\… . Τρέχουμε ξανά το setup και βγάζει ένα μήνυμα για το MSXML αλλα λέμε ΟΚ και όλα πάνε καλά
  24. Με αυτό το post μου σε καμία περίπτωση δεν θέλω να εγείρω ατέρμονες συζητήσεις και διαμάχες απλά να καταγράψω και να σχολιάσω θέλω μια είδηση που βρήκα τυχαία εδώ και αναφέρει ότι η ORACLE έκανε αύξηση στη τιμή της 11g κατά 40%! μέσα σε αυτή την δύσκολη οικονομική συγκύρια. Από την άλλη η "επάρατη" Microsoft συνεχίζει να πουλάει με την ίδια τιμή τον SQL Server 2008 και μην μου πείτε ότι είναι καλύτερη η ORACLE 11g από τον SQL Server 2008 γιατί ξέρουμε όλοι ότι κάτι τέτοιο δεν ισχύει. Για όσους πάντως θέλουν να δουν τι θα πληρώσουν αν αγοράσουν SQL Server 2008 εδώ θα βρείτε ένα calculator που υπάρχει στον site του SQL Server. Εγώ δεν έχω να προσθέσω τίποτα άλλο, τα σχόλια και οι επιλογές είναι δικά σας πλέον.
  25. μάλλον έχεις δίκιο αγαπητέ συνάδελφε
×
×
  • Create New...