Archive

Archive for July, 2011

SQL Server Denali– PARSE() and TRY_PARSE() conversion functions

30/07/2011 Leave a comment

SQL Server Denali introduced new conversion functions: PARSE() and TRY_PARSE().

PARSE() function

PARSE() function converts expression (string value) to date/time and number data types if conversion is possible. If conversion isn’t possible it raises an error.

-- Parse to datetime specifying culture in which string value is formatted
SELECT PARSE('Monday, 13 December 2010' AS datetime USING 'en-US') AS Result
SELECT PARSE('28. srpnja 2011. četvrtak' AS datetime USING 'hr-HR') AS Result

Result
———————–
2010-12-13 00:00:00.000
Result
———————–
2011-07-28 00:00:00.000

-- If the culture argument isn't provided, the language of current session is used.
SELECT PARSE('Monday, 13 December 2010' AS datetime) AS Result

Result
———————–
2010-12-13 00:00:00.000

-- Language for this session is English:
SELECT PARSE('28. srpnja 2011. četvrtak' AS datetime) AS Result

It raise an error:
Msg 9819, Level 16, State 1, Line 1
Error converting string value ’28. srpnja 2011. četvrtak’ into data type datetime using culture ”.

Language for session is set either implicitly or explicitly by using SET LANGUAGE statement.

SET LANGUAGE Croatian
SELECT PARSE('28. srpnja 2011. četvrtak' AS datetime) AS Result

Result
———————–
2011-07-28 00:00:00.000

-- Parse with currency symbol
SELECT PARSE('$345.56' AS money USING 'en-US') AS Result
SELECT PARSE('345,56 kn' AS money USING 'hr-HR') AS Result

Result
———————
345,56
Result
———————
345,56

-- Parse to numeric data type
SELECT PARSE('345,58' AS numeric(8,1) USING 'hr-HR') AS Result
SELECT PARSE('345,58' AS numeric(8,2) USING 'hr-HR') AS Result

Result
—————————————
345.6
Result
—————————————
345.58

TRY_PARSE() function

TRY_PARSE() function converts expression (string value) to date/time and number data types or return NULL if conversion isn’t possible.

SELECT TRY_PARSE('$345.56' AS money USING 'hr-HR') AS Result
SELECT TRY_PARSE('$345.56' AS money USING 'en-US') AS Result

First value returns NULL, since ‘$’ is not a valid currency symbol according to Croatian language.

Result
———————
NULL
Result
———————
345,56

DECLARE @Table table (Datum varchar(100))
INSERT INTO @Table
VALUES('Monday, 13 December 2010'),('28. srpnja 2011. četvrtak')
SELECT Datum FROM @Table
/*
Datum
-------------------------
Monday, 13 December 2010
28. srpnja 2011. četvrtak
*/

-- Convert to datetime with English culture
SELECT TRY_PARSE(Datum AS datetime USING 'en-US') AS Datum
FROM @Table

-- Second value returns NULL, since '28. srpnja 2011. četvrtak' is
-- not a valid datetime formatting according to us_english
/*
Datum
-----------------------
2010-12-13 00:00:00.000
NULL
*/

-- Convert to datetime with English or Croatian language
SELECT
CASE WHEN TRY_PARSE(Datum AS datetime USING 'en-US') IS NULL
THEN PARSE(Datum AS datetime USING 'hr-HR')
ELSE PARSE(Datum AS datetime USING 'en-US')
END AS Datum
FROM @Table

/*
Datum
-----------------------
2010-12-13 00:00:00.000
2011-07-28 00:00:00.000
*/

Categories: Denali, TSQL

SQL Server 2008 Backup Compression Performance

18/07/2011 Leave a comment

U prethodnom postu pisala sam o kompresiji backupa, novoj funkcionalnosti SQL Servera. Tu su date osnove vezane za kompresiju backupa, kako uključiti kompresiju backupa na nivou instance, za svaki pojedinačni backup kao i neke karakteristike vezane za media set prilikom kompresije. U ovom postu pokazati ću usporedne rezultate performansi do kojih sam došla testiranjem backup i restore operacija kompresovanog/nekompresovanog backupa.

Testiranje backup operacije AdventureWorks2008R2 baze

Prvi test sam napravila korištenjem AdventureWorks2008R2 baze na klijentskoj mašini. Rezultat je sljedeći:

Nekompresovani backup je urađen za 5.442 sekunde, veličina backupa je 213MB a CPU je bio zauzet oko 16%.

Kompresovani backup je urađen za 2.849 sekundi, veličina backupa je 49MB a CPU je bio zauzet oko 29%.

Vidljivo je, da su performanse kompresovanog backup daleko bolje. Kompresovani backup je 4.34 puta manji od nekompresovanog backupa. Za očekivati je i da je vrijeme izvršenja kompresovanog backupa kraće (zbog mnogo manje količine IO operacija) što se i pokazalo testom. Ali opterećenost CPU-a je bila veća.

Testiranje restore operacije AdventureWorks2008R2 baze

Prije testa očekivala sam i da će restore operacije kompresovanog backupa biti bolje što se i pokazalo u testu. Rezultat je sljedeći:

Verifikacija backupa:

Baza

Vrsta backupa Vrijeme (sekundi)
AdventureWorks2008R2

Nekompresovani

1.703

AdventureWorks2008R2 Kompresovani

0.403

Restore baze (baza je već postojala na serveru):

Baza

Vrsta backupa Vrijeme (sekundi) CPU %
AdventureWorks2008R2

Nekompresovani

4.649

5.5

AdventureWorks2008R2

Kompresovani 2.663

9.5

Testiranje TestDB baze (26GB) na serveru

Sljedeći test je rađen na serveru s bazom veličine oko 26 GB. Rezultat je sljedeći.

Baza

Vrsta backupa Veličina backupa Vrijeme (mm:ss)

Omjer kompresije

TestDB

Nekompresovani

25.8 GB 03:36

1

TestDB

Kompresovani

5.97 GB 02:03

4.32

Opterećenost CPU-a prilikom kreiranja kompresovanog backupa veća je za 5-6%.

Verifikacija backupa za nekompresovani backup završena je za 1 minutu i 15 sekundi dok je za kompresovani backup završena za 41 sekundu.

Kompresija podataka i kompresija backupa

Kako SQL Server 2008 omogućava kompresije podataka na nivou reda (row) ili stranice (page), zanimalo me je kako kompresija backupa radi u kombinaciji sa kompresijom podataka (row or page compression).

Napravila sam test na mojoj klijentskoj mašini, i to tako da sam prilikom testiranja koristila bazu kod koje sam izvršila kompresiju svih tabela i indeksa. Rezultat je sljedeći:

Baza

Veličina baze

Veličina Backupa

Omjer kompresije

Backup Time (sekundi)

Vrsta backupa

Bez kompresije podataka

TestDb 168 MB 168 MB

1

4.453

Nekompresovani backup
TestDb 168 MB 48 MB

3.49

2.787

Kompresovani backup

Row Compression

TestDb 115 MB 115 MB

1

3.034

Nekompresovani backup
TestDb 115 MB 44 MB

2.61

2.237

Kompresovani backup

Page Compression

TestDb 72 MB 72 MB

1

2.195

Nekompresovani backup
TestDb 72 MB 41 MB

1.75

1.903

Kompresovani backup

Iz rezultata je vidljivo, da kompresija backupa komprimira i baze kod kojih su sve tabele i indeksi kompresovani row ili page kompresijom iako je omjer kompresije kompresovanog/nekompresovanog backupa manji nego kod baze kod koje nije uključena kompresija podataka. Vrijeme izvršenja kompresovanog backupa je kraće. Opterećenost CPU-a je veća prilikom kreiranja kompresovanog backupa.

TDE (Transparent Data Encryption) i kompresija backupa

Zanimalo me je i kakve su performanse kompresije backupa za baze kod kojih je uključen TDE. Rezultat je sljedeći:

Baza Veličina baze Veličina Backup

Omjer
kompresije

Backup Time
(sekundi)

Komentar
Test (TDE on) 222 MB 222 MB

1

4.199

Nekompresovani backup
Test (TDE on) 222MB 221 MB

1

4.218

Kompresovani backup

Kompresija backupa baza kod koje je uključen TDE rezultira visokim korištenje CPU-a, izvršenje kompresovanog backupa traje neznatno duže a gotovo da i nema razlike između veličine kompresovanog i nekompresovanog backupa.
Kompresija enkriptiranih podataka nije baš dobar izbor, tako da kompresiju backupa treba izbjegavati ukoliko imate bazu kod koje je uključen TDE.

Zaključak:
Vidljivo je da kreiranjem kompresovanog bakupa štedimo i prostor i vrijeme ali je CPU malo više opterećen prilikom izrade kompresovanog backupa. Ukoliko je CPU na serveru dosta opterećen a radite kompresovani backup tokom radnog vremena i ne želite da vam on ometa ostale operacije na serveru, korištenje CPU-a prilikom kompresije backupa moguće je ograničiti s Resource Governor-om.
Kompresija backupa je odlična izbor i za baze koje imaju uključenu kompresiju podataka (row ili page) dok bi se trebala izbjegavati za baze kod kojih je uključen TDE.
Oni koji koriste Log Shipping dobro mogu osjetiti poboljšanje performansi ukoliko uključe backup kompresiju, jer Log Shipping radi na principu kreiranja backupa, kopiranja backupa na network share lokaciju (obično na sekundarni server) i nakon toga restore backupa na sekundarnom serveru. Treba jedino obratiti pažnju na CPU, a ukoliko se primijeti  bottleneck ograničiti korištenje CPU-a za backup korištenjem Resource Governor -a.

SQL Server 2008 R2 SP1 i SQL Server “Denali” CTP3

13/07/2011 3 comments

Jučer je bio dan pun novosti za sve one koji koriste SQL Server. Svjetlo dana ugledao je Service Pack 1 za SQL Server 2008 R2 kao i SQL Server „Denali“ CTP3.

SQL Server 2008 R2 SP1

SP1 sadrži sve zakrpe koje se nalaze u CU1 (Cumulative Update) – CU6. CU7 i CU8 nije uključen u SP1. Informacije o ostalim zakrpama koje se nalaze u SP1 možete naći na: http://support.microsoft.com/kb/2528583
Više informacija o novim funkcionalnostima i poboljšanjima koje donosi SP1 možete naći u članku:
http://social.technet.microsoft.com/wiki/contents/articles/microsoft-sql-server-2008-r2-sp1-release-notes.aspx

SQL Server 2008 R2 SP1 možete preuzeti na sljedećem linku:
http://www.microsoft.com/download/en/details.aspx?id=26727

Za SQL Server 2008 R2 SP1 Express:
http://www.microsoft.com/download/en/details.aspx?id=26729

Ukoliko koristite SQL Server 2008 R2 SP1 Feature Packs možete ga preuzeti na:
http://www.microsoft.com/download/en/details.aspx?id=26728

SQL Server “Denali” CTP3

Dugo očekivani CTP3 za novu verziju SQL Servera pod kodnim nazivom „Denali“ napokon je izašao. Svi oni koji žele vidjeti kako izgleda i koje to novosti donosi „Denali“ mogu ga preuzeti na:
SQL Server „Denali“ CTP3 download

Release Note za CTP3 možete naći na sljedećoj adresi:
http://social.technet.microsoft.com/wiki/contents/articles/3711.aspx

Categories: Denali, SQL Server 2008

SQL Server 2008 Backup Compression

10/07/2011 Leave a comment

Jedna od novih funkcionalnosti SQL Servera 2008 je i mogućnost kompresije backupa (backup compression). Native SQL Server backup (bez kompresije) zauzima približno isti prostor na disku kolika je i količina podataka u bazi. To u okruženjima s velikim bazama podataka, kada poslovna politika zahtjeva čuvanje više kopija backupa, znači i veliku potrošnju diskovnog prostora (ili traka) ali i gubitka vremena (što je veći backup – kreiranje backupa zahtjeva više vremena zbog IO operacija, kopiranje backupa traje duže itd.). Prije SQL Servera 2008 rješenje je bilo u nabavci softverskih alata od strane third-party proizvođača.

SQL Server 2008 donosi mogućnost kompresije backupa, što je obradovalo mnoge administratore a pogotovo one koji više vole koristiti native SQL Server backup (kao što sam ja). Kompresija backupa u SQL Server 2008 verziji podržana je samo u Enterprise izdanju dok SQL Server 2008 R2 omogučava kompresiju backupa i u Standard i Enterprise izdanju.

Kako uključiti backup kompresiju

Nakon instalacije SQL servera, funkcionalnost je isključena ali se vrlo jednostavno može uključiti za čitavu instancu SQL Servera. Ukoliko backup kompresiju uključite na nivou instance, svaki backup koji napravite biti će urađen s kompresijom. Sljedeća T-SQL naredba će uključiti backup kompresiju na nivou instance SQL Servera:

EXEC sys.sp_configure 'backup compression default', '1'
GO
RECONFIGURE WITH OVERRIDE
GO

Oni koji više vole koristiti GUI: desni klik na instancu SQL servera u SSMS i klik na Properties. U Server Properties prozoru, unutar Database Settings opcija odabrati Compress backup.

Backup compression Server Settings

Ukoliko ne želite uključiti kompresiju backupa na nivou instance, vrlo jednostavno možete prilikom kreiranja svakog pojedinačnog backupa specificirati da želite uključiti kompresiju backupa jednostavnim dodavanjem COMPRESSION u WITH klauzuli BACKUP naredbe.

BACKUP DATABASE AdventureWorks2008R2
TO DISK = 'D:\AW_backup.bak'
WITH COMPRESSION

Ili kroz GUI: U Options stranici Back Up Database prozora za Set backup compression opciju odabrati Compress backup.

Database backup compression settings

Media Set i kompresovani/nekompresovani backup

Ukoliko se radi backup na backup device ili se radi append backup-a na fajl, treba znati da nije moguće miješati kompresovane i nekompresovane backup-e. Ukoliko pokušate napraviti kompresovani backup na device koji sadrži nekompresovani backup prijavit će se greška:

Msg 3098, Level 16, State 2, Line 1
The backup cannot be performed because ‘COMPRESSION’ was requested after the media was formatted with an incompatible structure. To append to this media set, either omit ‘COMPRESSION’ or specify ‘NO_COMPRESSION’. Alternatively, you can create a new media set by using WITH FORMAT in your BACKUP statement. If you use WITH FORMAT on an existing media set, all its backup sets will be overwritten.
Msg 3013, Level 16, State 1, Line 1
BACKUP DATABASE is terminating abnormally.

Tako da, ukoliko backup device već sadrži nekompresovani backup, potrebno je formatirati backup device dodavanjem FORMAT u WITH klauzuli BACKUP naredbe.

BACKUP DATABASE AdventureWorks2008R2
TO BackupDevice
WITH FORMAT, COMPRESSION

Bitno je naglasiti, ukoliko se eksplicitno ne navodite WITH COMPRESSION ili NO_COMPRESSION u backup naredbi, backup će naslijediti kompresijska svojstva iz media seta a ne iz serverske konfiguracije.
Pa će, ukoliko pokušate napraviti nekompresovani backup bez specificiranja WITH NO_COMPRESSION (na nivou instance nije uključena backup kompresija) na device koji sadrži kompresovani backup, backup biti izvršen bez greške ali će backup biti kompresovan.
Da bi provjerili da li je media set kreiran s kompresijom ili ne može se koristiti sljedeća naredba:

RESTORE LABELONLY FROM DISK = 'D:\AW_backup.bak'  

Prilikom RESTORE operacije, nije potrebno specificirati o kakvoj vrsti backup fajla se radi, a sve edicije SQL Servera 2008 mogu napraviti restore baze iz kompresovanog backup fajla.