SQL Server Express mire elég?

Mindig érdekelt, hogy mit bír az SQL Server Express. Egy korábbi project kapcsán kiderült, hogy mi az amire biztosan elég.

Fogtuk a következőket:
– 2 db SSD diszk
– 2 db processzor (16 core)
– 16 GB memoria
– SQL Server Express 2014
– IIS webszerver
– ASP.NET nyelv

És rápakoltunk egy több adatbázisos monitoring rendszert, ami többszáz szervert monitoroz.

Az egyik adatbázis tábláján elég hangzatos számok jöttek ki:
– 1 tábla
– Napi 28 millió sor
– 1 év alatt 10 milliárd kiosztott id
– Millisec-es válaszidők
Nézzünk néhány képet is:

02_resource_monitor

 

01_queries

 

Bár lenne még mit optimalizálni, de az esetleg egy másik bejegyzés lesz.

 

MSSQL vs MySQL 1.0

Az utóbbi időben rendes kiképzést kaptam MySQL-ből és volt is mit optimalizálni MySQL szervereken, ezért erről is fogok írni a jövőben, első sorban olyan jellegű dolgokról, amit lényeges különbségnek találok a adatbáziskezelők működésében. Most nagy vonalakban írok a tapasztalataimról, később majd részelesebben.

Az optimalizálás során az alábbiakat tapasztaltam:

  1. Negatívumok:
    1. Cross / Outer Apply hiánya
    2. Tábla értékkel visszatérő függvények hiánya
    3. Execution plan szegényes információkat ad egy MS execution planhoz képest
    4. Jó végrehajtási tervvel is voltak lassú query-k, amiket több lekérdezésre kellett bontani
    5. Teljesítmény számlálók hiánya, amik csak adott lekérdezésre vonatkoznak. (pl: hány page-et olvasott fel, volt e lookup a végrehajtás során, stb)
    6. Trace-elés hiánya
    7. Sok mindenben kellett a megszerzett általános SQL ismeretekre támaszkodni, mert egyes helyeken kimérni nem, csak sejteni lehetett, hogy hol kell optimalizálni
  2. Pozitívumok:
    1. Set profiling: rengeteget segített a megoldásokban
    2. Query cache: zseniális találmány
    3. Az MS-hez képest egy nagyon rugalmasan kezelt replikációs megoldás
    4. Before trigger

 

Ami itt is előjött, hogy a jól megtervezett adatbázis struktúra a legfontosabb.

Végezetül: a MySQL egy nagyon jó adatbázis kezelő, megvan a felhasználási területe és oda pont ez való. Működésben sok helyen hasonlít az MS SQL-re, ez elég sokat segített a munka során.

 

 

LIKE és az ESCAPE

A LIKE-ot szerintem mindenki ismeri, de az ESCAPE záradékát már kevesebben, pedig nagyon hasznos tud lenni. Erről írok most egy rövid postot.

Az ESCAPE kiegészítés akkor hasznos, amikor egy foglalt karakter is szerepelne a keresésben. Ilyen karakterek jelenleg: [,],%,_,^

Tehát, ha van egy ilyen változónk: @a = ‘ertek%ertek’ és azt akarjuk tudni, hogy @a változóban található e % jel, akkor escape-elni kell. Az escape karakter bármi lehet, a lényeg, hogy az escape záradékban adjuk meg, hogy mi volt az. A továbbiakban minden szónál többet fognak érni a példák, úgyhogy jöjjön a demó.

Készítünk egy táblát, teszünk bele % jeles értékeket és szűrünk többféle variációban (Százalékjel helyett lehetne más foglalt karakter is, én most ezzel demózok).

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
DROP TABLE #tmp
GO

CREATE TABLE #tmp (name VARCHAR(16) NULL)

INSERT INTO #tmp (name)
VALUES
(NULL),
('ertek%ertek'),
('ertekertek'),
('%'),
('%ertek'),
('ertek%'),
('e%rtek'),
('erte%k')

 

Próbáljuk keresni a hagyományos módszerrel a % jelet:

-- 1.) Elso teszt
SELECT [name]
FROM #tmp
WHERE name LIKE '%%%'

01_elso_teszt

Azt látjuk, hogy visszakaptuk a teljes tábla tartalmát a NULL kivételével. De nem ezt akartuk.

Használjuk ez escape-elést.

-- 3.) Szazalekjel van valahol az ertekben
SELECT [name]
FROM #tmp
WHERE name LIKE '%!%%' ESCAPE '!'

03_szalaekjel_valahol
Egész jó, itt már azt kaptuk, amit akartunk. Bonyolítsuk néhány dologgal, a további példák már csak ráadások.

-- 4.) Szazalekjel van valahol az ertekben, de a szazalekjel elott van legalabb egy karakter
SELECT [name]
FROM #tmp
WHERE name LIKE '%_!%%' ESCAPE '!'

04_szazalekjel_valahol_plusz_elotte_1_karakter

 

-- 5.) Szazalekjel van valahol az ertekben, de a szazalekjel utan van legalabb egy karakter
SELECT [name]
FROM #tmp
WHERE name LIKE '%!%_%' ESCAPE '!'

05_szazalekjel_valahol_plusz_utana_1_karakter

 

-- 6.) Szazalekjellel kezdodik az ertek
SELECT [name]
FROM #tmp
WHERE name LIKE '!%%' ESCAPE '!'

06_szazalekjellel_kezdodik

 

-- 7.) Szazalekjelre vegzodik az ertek
SELECT [name]
FROM #tmp
WHERE name LIKE '%!%' ESCAPE '!'

07_szazalekjelre_vegzodik

 

-- 8.) Szazalekjel elott csak 1 db karakter all
SELECT [name]
FROM #tmp
WHERE name LIKE '_!%%' ESCAPE '!'

08_szazalekjel_elott_1_karakter_utana_barmennyi

 

-- 9.) Szazalekjel utan csak 1 db karakter all
SELECT [name]
FROM #tmp
WHERE name LIKE '%!%_' ESCAPE '!'

09_szazalekjel_utan_1_karakter_elotte_barmennyi

 

-- 10.) Szazalekjel utan 'e' vagy 'r' vagy 'k' aztan barmi
SELECT [name]
FROM #tmp
WHERE name LIKE '%!%[erk]%' ESCAPE '!'

10_szazalekjel_utan_erk_aztan_barmi

-- 11.) Szazalekjel utan 'e' vagy 'r' vagy 'k' aztan vege
SELECT [name]
FROM #tmp
WHERE name LIKE '%!%[erk]' ESCAPE '!'

11_szazalekjel_utan_erk_aztan_vege

 

Van még a LIKE-nak jó tulajdonsága, bővebben BOL-ban lehet utána olvasni.

Ha valakinek van kedve még ezzel játszani, akkor itt egy feladat: A meglévő táblába szúrjunk be további 2 értéket:

INSERT INTO [#tmp] ( [name] ) VALUES  ( 'ertek%[[ertek]]')
INSERT INTO [#tmp] ( [name] ) VALUES  ( 'ertek%[ertek]')

És most keressük ki azokat az értékeket, ahol:

  1. A ‘%’ jel után ‘[‘ jel áll. (Tehát ‘%[‘)
  2. A ‘%’ jel után ‘[‘ jel áll, utána pedig NEM ‘[‘ jel. (Tehát ‘%[‘ majd nem ‘[‘). Ez utóbbit a cikk alapján nem tudod megoldani, el kell olvasni a BOL-t, ha nem tudod a megoldást.

Végezetül pedig, ha nagyon bonyolult regex-es kifejezésekre van szükségünk, akkor használjunk hozzá CLR-t.

Követem

Értesítést küldünk minden új bejegyzésről a megadott e-mail címre.