Jump to content

antonch

Administrators
  • Posts

    1030
  • Joined

  • Last visited

  • Days Won

    7

Everything posted by antonch

  1. Για να κάνω monitoring το μέγεθος της buffer cache αρκεί μέσα από το Performance Monitor Tool των Windows να ορίσω τους μετρητές: SQLServer: Memory Manager \ Total Server Memory (KB) Δείχνει το τρέχων μέγεθος της buffer cache. SQLServer: Memory Manager \ Target Server Memory (KB) Δείχνει το πάνω όριο της μνήμης που έχει εκείνη την στιγμή έχει ορίσει ο SQL Server ότι μπορεί να χρησιμοποιήσει για την buffer cache. Το νούμερο αυτό μπορεί να αλλάξει δυναμικά και αυτό γίνεται στις περιπτώσεις που ο SQL Server διαπιστώσει ότι το σύστημα είναι σε memory pressure (μειώνει την μνήμη) ότι το σύστημα δεν είναι σε memory pressure (αυξάνει την μνήμη αλλα δεν θα γίνει μεγαλύτερη από ότι έχω ορίσει στην Max Memory) Προσοχή. Σε καμία περίπτωση αυτοί οι μετρητές δεν δείχνουν την συνολική μνήμη του SQL Server, αλλά μόνο την μνήμη που αφορά την buffer cache. SQLServer: Buffer Manager \ Page Life Expectancy Δείτε εδώ
  2. Καθαρίζει την connection cache των distributed queries που γίνονται σε ένα SQL Server instance.
  3. Αχα μου αρέσεις και έψαχνα να βρω το θέμα για το event του Μαίου. To βράδυ βγάζω ανακοίνωση Κουρής θέμα licensing, piracy, compliance είσαι;
  4. Καθαρίζει όλα τα μη ενεργά/χρησιμοποιούμενα περιεχόμενα (cache entries) από όλες τις cache. Αν και ο SQL Server ενεργεί προκαταβολικά ώστε να γίνει αυτό, εντούτοις μπορώ χειροκίνητα να το κάνω αυτό εκτελώντας την DBCC FREESYSTEMCACHE ('ALL') Φυσικά το παραπάνω θα πρέπει να το κάνουμε μόνο εφόσον θέλουμε να καθαρίσουμε τα πάντα και φυσικά λαμβάνοντας υπόψη τα Remarks από τα BOL. Καλό είναι να εστιάζουμε την προσοχή μας σε συγκεκριμένο pool και να σβήνουμε αυτό εφόσον έχουμε δει ότι μας δημιουργεί πρόβλημα το μέγεθος του. Αυτό μπορεί να γίνει με την DBCC FREESYSTEMCACHE ('pool name') Μπορείς να δεις τα pools που υπάρχουν εκτελώντας το SELECT DISTINCT name FROM sys.dm_os_memory_clerks Σε αρκετές περιπτώσεις καθαρίζοντας τα παρακάτω pools βελτιώνω αρκετά το performance. SQL Plans : σε περίπτωση που δεν έχω κάνει optimize τον SQL Server για plan cache bloat. TokenAndPermUserStore : εάν είμαι σε SQL Server 2005 SP2 και πίσω με την οποία καθαρίζουμε την μνήμη που έχει καταναλωθεί από την Security Cache για την δημιουργία objects στην tempdb. DBCC FREESYSTEMCACHE('SQL Plans') DBCC FREESYSTEMCACHE('TokenAndPermUserStore')
  5. Διαγράφει από την στοιχεία από την plan cache. Αυτό μπορεί να γίνει είτε για όλα τα στοιχεία, είτε για συγκεκριμένο plan, είτε για όλα όσα αφορούν συγκεκριμένο resource pool. Πρέπει να την χρησιμοποιούμε με σύνεση καθώς μπορεί να σβήσουμε πχ το πλάνο μιας stored procedure κατά λάθος. Αυτό σημαίνει ότι την επόμενη φορά που αυτή θα ζητηθεί να εκτελεστεί αυτή θα περάσει όλα τα στάδια (Parse,Optimize....) ώστε να μπει το πλάνο της ξανά μέσα στην plan cache και να εκτελεστεί και φυσικά να επαχρησιμοποιηθεί αυτό στις επόμενες εκτελέσεις της. Για περισσότερες πληροφορίες μπορείτε να δείτε τα BOL.
  6. Η λατρεία μου για τα poster είναι γνωστή. Ειδικά για αυτά που αφορούν τον SQL Server. Αν μάλιστα αυτά είναι χαριτωμένα, έξυπνα και λένε πολλά μου αρέσουν περισσότερο. Γενικά είμαι poster hunter. Χθες τυχαία ανακάλυψα αυτό που ακολουθεί το οποίο το έχει φτιάξει η Kendra Little (blog|twitter) το οποίο εξηγεί αρκετά όμορφα τα SQL Server Isolations Levels. Μπορείτε να το κατεβάσετε από το original link ή και από εδώ.
  7. Για να ορίσω το πόσο θα είναι ο χώρος που θα καταλαμβάνει η buffer cache αρκεί να ορίσω το Min και Μax Server Memory. Αυτά τα settings ορίζουν μόνο την buffer cache και όχι όλη την μνήμη που θα καταλαμβάνει ο SQL Server.
  8. Η DBCC DROPCLEANBUFFERS καθαρίζει την buffer cache μόνο από τις σελίδες που είναι χαρακτηρισμένες ως clean. Σε καμία περίπτωση δεν πειράζει όσες είναι dirty.
  9. Σε τακτά χρονικά διαστήματα ή σε περιπτώσεις που υπάρχει στέρηση σε μνήμη, ένα thread αναλαμβάνει να κάνει τον καθαρισμό της buffer cache από τις σελίδες που δεν έχουν πρόσφατα χρησιμοποιηθεί. Το thread αυτό ονομάζεται Lazywriter και ο τρόπος με τον οποίο αποφασίζει ποιες είναι αυτές που θα φύγουν από την buffer cache είναι και ονομάζεται Least Recently Used (LRU) policy. Least Recently Used policy Στο header της κάθε σελίδας όταν αυτή είναι στη μνήμη αποθηκεύονται πληροφορίες που κρατάνε τις τελευταίες δύο φορές (time) που αυτή έχει χρησιμοποιηθεί. Επίσης υπάρχει ένας μετρητής ο οποίος κάθε φορά που γίνεται ο περιοδικός έλεγχος (Lazywriter) αυτός μειώνεται. Έτσι στην περίπτωση που χρειάζεται να ελευθερωθεί χώρος στη buffer cache οι σελίδες με τη μικρότερη τιμή στο μετρητή είναι αυτές που φεύγουν από αυτή. Αν θέλουμε να δούμε πόσο χρόνο (μέση τιμη) οι σελίδες μένουν στην buffer cache μπορούμε να το δούμε με την χρήση του Page Life Expectancy performance counter. Lazywriter operation Είναι ένα thread το οποίο τακτικά ελέγχει το μέγεθος του free buffer list. O SQL Server προσπαθεί να συντηρήσει ένα αριθμό από ελεύθερες σελίδες στην buffer cache με σκοπό να μπορεί να ανεβάζει σε αυτή γρηγορότερα σελίδες, αυτός ο αριθμός ελέγχεται από το free buffer list. Όποτε γίνεται ο συγκεκριμένος έλεγχος (ή γίνεται checkpoint ή read operation που χρειάζεται να διαβάσει σελίδες από το δίσκο και να τις ανεβάσει στην buffer cache) και δει ότι ο αριθμός αυτός είναι μικρότερος από αυτό που έχει το free buffer list τότε με βάση το LRU policy οι σελίδες αυτές φεύγουν από την buffer cache. Στην περίπτωση που μια σελίδα είναι dirty και εμπίπτει στο LRU policy τότε αυτή γράφεται στο δίσκο (data file) πριν χαρακτηριστεί σαν σελίδα που μπορεί να φύγει από την buffer cache.
  10. Η διαδικασία αυτή όταν γίνεται μεταφέρει τις χαρακτηρισμένες ως dirty pages από την μνήμη (buffer cache) στο δίσκο (data file(s)) και αλλάζει στο header τους το status από dirty σε clean. Δεν αδείαζει-καθαρίζει την buffer cache από αυτές.
  11. Όταν μια σελίδα διαβάζεται από τον δίσκο και μπαίνει στην buffer cache θεωρείται ότι είναι μια Clean Page. Όταν όμως κάνω ένα transaction το οποίο την επηρεάζει (πάντα στην μνήμη) αυτή είναι μια Dirty Page (μπαίνει ένα mark στον header της) καθώς η εικόνα στην μνήμη είναι διαφορετική από αυτή στο δίσκο. Για να δω πόσες dirty pages έχω ανά βάση αρκεί να εκτελέσω το παρακάτω query που χρησιμοποιεί την sys.dm_os_buffer_descriptors SELECT db_name(database_id) AS 'Database',count(page_id) AS 'Dirty Pages' FROM sys.dm_os_buffer_descriptors WHERE is_modified =1 GROUP BY db_name(database_id) ORDER BY count(page_id) DESC
  12. Όπως γνωρίζουμε ο SQL Server διαβάζει τις σελίδες από το δίσκο και τις βάζει στην buffer cache. To πόσο χρόνο (σε δευτερόλεπτα) αυτές μπορούν να μείνουν κατά μέσο όρο στην buffer cache χωρίς να ζητηθούν/χρησιμοποιηθούν μπορούμε να το δούμε από τον SQL Server\Buffer Manager\Page Life Expectancy performance counter. O μετρητής αυτός σύμφωνα με τα recommendations πρέπει να είναι πάνω από 300 sec για να έχουμε ένα καλό PLE. Φυσικά σε σύστήματα που έχουν προβλήματα με την μνήμη αυτός θα είναι μικρότερος καθώς οι σελίδες θα κατεβαίνουν γρηγορότερα στον δίσκο και αυτό δεν μας αρέσει. Αντίθετα σε συστήματα με άπλετη μνήμη θα έχει μεγαλύτερη τιμή και αυτό μας αρέσει.
  13. Η DMV αυτή δείχνει μια γράμμη για κάθε data page η οποία είναι στην buffer cache. Με το παρακάτω script μπορείς να δεις το ποσό σε MB που έχει δεσμευτεί από τις σελίδες που υπάρχουν για κάθε βάση μέσα στην buffer cache SELECT CASE database_id WHEN 32767 THEN 'ResourceDB' ELSE DB_NAME(database_id) END AS 'Database', COUNT(*)*8/1024 AS 'Cached Size (MB)' FROM sys.dm_os_buffer_descriptors GROUP BY DB_NAME(database_id),database_id ORDER BY 2 DESC
  14. Δεν έχει να κάνει με το αν έχεις συνδεθεί με τον ένα ή τον άλλο τρόπο. Σύμφωνα με τα BOL Conditions That Affect IntelliSense The following conditions might affect the behavior of IntelliSense: There is a code error above the cursor.If there is an incomplete statement or other coding error above the location of the insertion point, IntelliSense may be unable to parse the code elements, and therefore will not work. You can comment out the applicable code to enable IntelliSense again. The insertion point is inside a code comment.IntelliSense options are not available when the insertion point is within a comment in your source file. The insertion point is inside a string literal.IntelliSense options are not available when the insertion point is inside the quotation marks around a string literal, for example: WHERE FirstName LIKE 'Patri%|' The automatic options are turned off.Many IntelliSense features work automatically by default, but you can disable any feature. Even when automatic statement completion is disabled, you can use an IntelliSense feature. For more information, see How to: Modify IntelliSense Options. Database Engine Query IntelliSense The following issues apply to the Database Engine Query Editor: The IntelliSense functionality of the Database Engine Query Editor does not support all Transact-SQL syntax elements. Parameter help does not support the parameters in some objects, such as extended stored procedures. For more information, see Transact-SQL Syntax Supported by IntelliSense. Intellisense is only available when the Database Engine Query Editor is connected to an instance of the SQL Server 2008 Database Engine. IntelliSense is not available when the Query Editor is connected to earlier versions of the Database Engine. IntelliSense is turned off in the Database Engine Query Editor when the SQLCMD mode is set on. Completion lists do not include database objects for which you do not have permissions. IntelliSense flags references to objects for which you do have permissions. For example, if you open a script that is written by someone else, any references to objects for which that person has permissions and you do not are flagged as incorrect. Completion lists might stop working if you lose the connection to the instance of the SQL Server Database Engine. Reconnect to the instance. Completion lists do not include database objects that are created by using another instance of SQL Server Management Studio after the instance that you are using has connected to the database. To see the objects, disconnect the instance of Management Studio that you are using from the database and reconnect.
  15. Δεν έχει να κάνει με αυτό. Έχω πολλους servers στους οποίους συνδέομαι και είναι ακριβώς σε αυτή την κατάσταση στο εικονίδιο και έχω τα πάντα κανονικά. Περίεργο...
  16. δoκίμασες να κάνεις Ctrl+Shift+R? και στα Τools>Options>Text Editor>Transact-SQL>Intellisence είναι ενεργοποιημένος?
  17. Το PAGEIOLATCH wait type δείχνει το χρόνο που χρειάστηκε για να διαβαστεί μια σελίδα από το δίσκο και να μπει στην μνήμη (buffer cache)
  18. Αν ήμουν 12 χρόνια νεότερος και ήξερα όσα ξέρω τώρα ίσως το σκεφτόμουν
  19. Καιρό ήθελα να γράψω για αυτή και όλο το ξεχνούσα. Πρόσφατα σε μια εκπαίδευση αναφέρεθηκε το όνομα της και αφού το έβαλα σε χίλια δυο σημεία να το κάνω 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
  20. Όπως είναι γνωρίζουμε στον SQL Server υπάρχει μια διαδικασία η οποία σκοπό έχει να μεταφέρει από την Buffer Cache τις αλλαγμένες σελίδες στο δίσκο, γίνεται σε όλες τις βάσεις εκτός από την tempdb (αν και αυτό δεν είναι και τόσο αλήθεια αλλά δεν θα το αναλύσουμε εδώ). Σκοπός του είναι να είναι όσο το δυνατό πιο ενημερωμένα τα data files με τις αλλαγές είναι γραμμένες στο log. Αυτό μπορεί να γίνει είτε εκτελώντας την εντολή CHECKPOINT είτε το κάνει o SQL Server αυτόματα. Το αυτόματο μπορεί να ορίστει αν το επιθυμούμε και αυτό γίνεται ορίζοντας το Recovery Interval στο SQL Server. H default τιμή είναι μηδέν που σημαίνει ότι ο SQL Server αποφασίζει για το πότε θα την κάνει αυτή την διαδικασία. Πρόσφατα άκουσα ότι αυτή αν δεν ορίσεις τιμή γίνεται κάθε 2 sec. Αυτό με έβαλε σε σκέψεις και αποφάσισα να το ψάξω ενδελεχώς. Σύμφωνα με τα BOL http://msdn.microsoft.com/en-us/library/ms189573.aspx στην παράγραφο για τα Automatic Checkpoints αναφέρει The SQL Server Database Engine generates automatic checkpoints. The interval between automatic checkpoints is based on the amount of log space used and the time elapsed since the last checkpoint. The time interval between automatic checkpoints can be highly variable and long, if few modifications are made in the database. Automatic checkpoints can also occur frequently if lots of data is modified. Αυτό όμως δεν μου έφτασε και άρχισα να κοιτάζω περισσότερα. Έφτασα σε ένα σημείο να ρωτήσω και ανθρώπους που τον έχουν φτιάξει (δεν αναφέρω τα ονόματα τους για μην θεωρηθεί ότι πουλάω μούρη ότι μιλάω μαζί τους). Τελικά οι ερωτήσεις μου και οι αναζητήσεις μου είχαν αποτέλεσμα και ανακάλυψα ότι μπορείς να χρησιμοποιήσεις τα trace flags 3502 και 3605 τα οποία γράφουν μέσα στο error log το κάθε πότε γίνεται checkpoint. Επίσης είναι αρκετά εύκολο να το δεις κάνοντας monitor τον Buffer Manager\Checkpoint Pages per Sec perfmon counter. Με ποιά όμως λογική γίνεται trigger η αυτόματη διαδικασία? Η απάντηση δια στόματος του Paul Randal είναι η παρακάτω A checkpoint is triggered automatically under a variety of conditions. The most common condition is that enough transaction log has been generated that SQL Server estimates that if the server was to crash, it would take about one minute for crash recovery to complete. This is calculated based on the number of log records that have been generated since the last checkpoint and is known as the recovery interval. The next most common condition that triggers a checkpoint is when the log becomes 70% full. @antonch
  21. antonch

    tempdb

    Αν όλα αυτά ισχύουν τότε μπορείς να το προχωρήσεις όπως λεει εδώ. Αν και θα πρέπει να ξέρεις ότι γενικά το shrink δεν το συνιστούν σε καμία βάση παρά μόνο σε έσχατες περιπτώσεις. Αν δεν έχεις πρόβλημα χώρου θα σου έλεγα να πας και να πεις στην βάση να μην μεγαλώνει αυτόματα και άστην όπως είναι
  22. antonch

    tempdb

    Αυτό σημαίνει ότι ουσιαστικά είναι άδεια. Το ερώτημα μου είναι, πριν κάνεις shrink, το μέγεθος αυτό το έχει βάλει κάποιος, είναι σίγουρο πλέον, για αυτό και κάθε φορά που κάνεις restart το service γινεται τόση, εξυπηρετεί κάποιο σκοπό; Διερεύνησε αυτό και μιλάμε ξάνα. Επίσης πες μας λίγο τι άλλες databases έχεις σε αυτό τον server και τι είδους εφαρμογές εξυπηρετούν. Και μάθε αν μπορείς από την κατασκευάστρια εταιρία να κάνουν χρήση temporay objects
  23. Υγεία, Υγεία, Υγεία, αυτό και μόνο φτάνει αγαπητοί φίλοι τα άλλα ή θα έρθουν ή θα προσπεράσουν, και όπως έλεγε και ο παππούς μου να και αν έρθουν να και αν προσπεράσουν τι υγειά μας να έχουμε.
  24. Καθώς έχουν ήδη γίνει δέκα SQL Saturday Nights θα ήθελα την γνώμη σας για την ποιότητα αυτών. Θα παρακαλούσα αν θέλετε να μου πείτε όσοι τα έχετε παρακολουθήσει είτε ζωντάνα είτε μαγνητοσκοπημένα την γνώμη σας για αυτά. Αυτό μπορείτε να το κάνετε μπαίνοντας στο www.sqlschool.gr και στη δημοσκόπηση που υπάρχει εκεί να επιλέξετε την άποψη σας. Σας ευχαριστώ εκ των προτέρων antonch
  25. Θα ρωτήσω και θα απαντήσω. Δεν έχω κάποια ενημέρωση μέχρι τώρα παρά μόνο ότι για τα μέλη θα υπάρξει έκπτωση.
×
×
  • Create New...