środa, 10 listopada 2010
Egzamin 70-433
Wczoraj udało mi się zdać kolejny egzamin z SQL. Tym razem był to egzamin numer 70-433 Microsoft SQL Server 2008, Database Development.
środa, 26 maja 2010
Klauzula TOP.
Jakiś czas temu miałem dziwny przypadek podczas kasowania rekordów. Z uwagi na fakt, że w tabeli było kilkaset tysięcy rekordów, algorytm kasujący nie usuwał ich wszystkich od razu, ale robił to paczkami po 100 000. Na początek wyliczał sobie ile razy ma się wykonać DELETE aby skasować wszystkie rekordy. Jeżeli w tabeli było 500 000 rekordów to DELETE wykonywał się 5 razy. Polecenie DELETE było napisane następująco :
DELETE FROM TABELA
WHERE TABELA_ID IN (SELECT TOP 100000 TABELA_ID
FROM TABELA)Na jednym z serwerów (tylko na jednym) algorytm nie kasował wszystkich danych. Nie dlatego, że polecenie DELETE wykonywało się za mało razy, ale dlatego, że powyższe polecenie nie kasowało 100 000 rekordów tylko mniej. Raz 30 000, raz 5000, raz 70 000, ale nigdy 100 000. Powodowało to, że na koniec zostawały dane w tabeli. Do tej pory nie wiem dlaczego tak się to zachowało. Na innych instancjach DELETE kasował po 100 000.
Problem rozwiązaliśmy dodając do SELECT TOP 100000 ... klauzulę ORDER BY. Po jej dodaniu DELETE zachowywał się zgodnie z oczekiwaniami. Co prawda osobiście uważam, że zawsze przy TOP powinno być ORDER BY (no chyba, że rzeczywiście chcemy wyciągnąć przypadkowe dane).
Można było oczywiście przepisać tego DELETE inaczej np. kasując przedziałami, tzn. TABLA_ID BETWEEN ... AND ..., ale to i tak nie rozwiązuje zagadki dlaczego pierwotny DELETE nie zadziałał tak jakby się tego można było po nim spodziewać.
Czy ktoś z Was zna może rozwiązanie tej zagadki ?
wtorek, 6 kwietnia 2010
Automatyzacja zadań czyli SQL Agent w wersji Express.
Narzędzie SQL Agent pozwalana na automatyzację zadań serwerowych. Za jego pomocą można np. zdefiniować plan backupów bazy danych. Zadania zdefiniowane w planie, będą wykonywać się zgodnie z harmonogramem.
SQL Agent nie jest dostępny w wersji Express. Jak zatem zautomatyzować pewne działania administracyjne? Do tego celu wykorzystamy narzędzie SQLCMD i Harmonogram Zadań Windows.
Wykorzystanie SQLCMD i Harmonogramu Zadań pokaże na przykładzie backupu bazy danych. Do tego celu przygotowałem sobie testową bazę danych o nazwie BAZA_TESTOWA oraz skrypt za pomocą którego wykonam backup mojej bazy.
-----------------------------------------
-- PEŁNY BACKUP BAZY DANYCH BAZA_TESTOWA
-----------------------------------------
BACKUP DATABASE BAZA_TESTOWA
TO DISK = 'D:\MSSQL\BACKUPDB\BAZA_TESTOWA_FULL_BACKUP.BAK';
Taki skrypt umieszczamy sobie w jakimś repozytorium na dysku.
Teraz możemy przejść do Harmonogramu Zadań. Tworzymy sobie nowe zadanie.
Dodajemy wyzwalacz. Czyli kiedy ma się wykonywać nasze zadanie.
Jak widać powyżej nasze zadanie będzie wykonywać się raz dziennie o godzinie 01:00.
Teraz możemy dodać zadania jakie mają się wykonać.
Moje zadania wyglądają następująco :
SQLCMD -S VAIO\SQLEXPRESS -i D:\MSSQL\SKRYPTY\BACKUP_DB.SQL
-o D:\MSSQL\BACKUPDB\BACKUP_DB_OUTPUT_FILE.TXT
-S VAIO\SQLEXPRESS - loguję się do mojej instancji serwera;
-i D:\MSSQL\SKRYPTY\BACKUP_DB.SQL - odpalam skrypt przygotowany wcześniej do backupu bazy;
-o D:\MSSQL\BACKUPDB\BACKUP_DB_OUTPUT_FILE.TXT - generuję plik z wynikami wykonania skryptu.
2. Przenoszę zrobiony backup i wygenerowany plik do innego katalogu dodając jednocześnie datę wykonania do nazwy plików :
CMD /C MOVE D:\MSSQL\BACKUPDB\BAZA_TESTOWA_FULL_BACKUP.BAK D:\MSSQL\BACKUPDB\ARCHIWUM\BAZA_TESTOWA_FULL_BACKUP_%DATE%.BAK
CMD /C MOVE D:\MSSQL\BACKUPDB\BACKUP_DB_OUTPUT_FILE.TXT
D:\MSSQL\BACKUPDB\ARCHIWUM\BACKUP_DB_OUTPUT_FILE_%DATE%.TXT
Na tym właściwie koniec. Nasz backup został wykonany i przeniesiony do archiwum.
Jest to oczywiście tylko prosty przykład. Pewien zarys w jaki sposób można automatyzować zadania administracyjne. Można to oczywiście skomplikować pisząc bardziej zaawansowane skrypty i/lub bardziej wykorzystywać Harmonogram Zadań. Ale to pozostawiam Wam.
Subskrybuj:
Posty (Atom)




