BEGIN TRANSACTION …

(by: Jasmin Azemović)

Archive for the ‘SQL Server’ Category

Trening summary

with one comment

U sklopu MSCommunity aktivnosti, održao sam kratki trening na temu: Analiza, projektovanje i relaciono modeliranje u prostorijama Microsoft BiH (Unitic-Sarajevo, 11.08.2011). Trening je po mojoj ocjeni bio vrlo uspješan i što je najvažnije ekipa je bila jako komunikativna i sigurno željna da nauči i čuje nešto novo.

Trening je počeo u 10.00 i trajao do 15.00. Pet sati je malo za ono što sam želio da kažem. Ako uzmemo u obzir da navedenu problematiku predajem cijeli semestar, slika postaje jasnija. Iz navednog razloga trening je podjeljen u pet lekcija:

1. Osnovni pojmovi, značaj baza podataka i uvod u SQL Server

Svaka priča ima svoj početak. Naša je krenula sa definisanjem pojmova i postavljanjem baze podataka na njeno mjesto. Pod ovim mislim na sagledavanje važnosti i okvira u kojima se baza nalazi. Ako stvari posmatramo iz današnjeg ugla onda je jasno da praktično i nema informacijskog sistema, a da isti nije povezan sa nekim data storage-om. Lekcija se završavama sa uvodom u SQL Server na kojim se i vrti cijela priča.

2. Temelji baze podataka

Druga lekcija fokus pomjera na same temelje na koje se oslanja dobra baza (akcenat na dobra). Između ostalog smo naveli da  su to: Relacini model i normalizacija, dostupnost, redudantnost, skalabilnost, pohrana, sigurnost, audit i privatnost. Malo smo se detaljnije osvrnuli na  “dječije bolesti” koje poprimaju status pandemije, a to je mala ili nikakv a briga za privatnost i sigurnost podataka u bazama. Primarni sadržaj lekcije jeste relacini model, pojmovi PK/FK i proces normalizacije.

3. Faze analize i projektovanja

Svakako jednako važan dio kursa jeste prolazak kroz sve sve faze analize i projektovanja jednog informacijskog sistema, a sve u cilju donošenja ispravnih odluka u razvoju. U suprotnom greške u ovim fazama mogu dovesti do lančanih rekacija koje se kasnije protežu kroz kompletan životni ciklus softvera.

4. Projekta "Studentska služba"

Dio treninga gdje su polaznici na praktičnom primjeru sistema vidjeli primjenu prve tri faze analize i dizajna (tj. one koje najviše uključuju baze podataka). Modelirano je oko 30 % funkcionalnosti sistema. Uglavnom prototip može biti dobra osnova za daljne modeliranje.

5. Praktični dio

Svaki polaznik je odabrao jednu od ponuđenih tema i u nekih 45 minuta pokušao uraditi analizui i osnovni dizajn strukture baze podataka. Rezultati su bili jako dobri !

Resursi treninga

Prezentacija (PDF)

eSluzbaDB (model baze podataka) – napominjem da se kod modela baze nije “gubilo” mnogo vremena na opseg i tipova podataka (manjak vremena), ali svakao da ispravan odabir tipova i opsega predstavlja jednu od karika dobrog dizajna.

Video sadržaj (link na YouTube kanal, pojedinačni linkovi se nalaze ispod)

Cijelo predavanje traje oko 4 sata i podjeljeno je na tri dijela. Napominjem da sve snimamo uživo tako da postoji interakcija sa auditorijem i svi oni problemi kada se radi live :). Mikrofon je bio fiksiran tako da se u udređenim momentima može pojaviti oscilacija u jačini zvuka zbog kretanja kroz prostor. Sve u svemu vjerujem da će ova tri videa dati prikaza odlične radne atmosfere 🙂

Prvi dio video sadržaja.

Drugi dio video sadržaja.

Treći dio video sadržaja.

Ovaj trening bi doživou punu snagu kada bi se proširio na 2-3 dana. Tada bi se imalo mnogo više vremena za uključivanje elemenata koji nisu tu, ali svakako i za proširenje postojećih.

END TRANSACTION
Advertisements

Written by Jasmin Azemović

18/08/2011 at 12:14

Random data and SQL Server (re-write)

with 2 comments

Prije par sedmica imao sam potrebu da iz baze podataka izdvojim određeni broj zapisa i to slučajnim izborom. E sada tu su se pojavili razni problemi, SQL jezik nema komandu koja bi “zagrabila” TOP n zapisa, malo promiješala i izbacila potpuno “RANDOM“.

Npr. Ako želim da iz baze AdventureWorks (tabela Person.Contact) uzmem prvih 5 zapisa kucam komandu koja izgleda ovako:

SELECT TOP 5 ContactID, FirstName
FROM Person.Contact

Retultat izvršenja će biti poredan prema PK u ovom slučaju ContactID (jer nisam drugačije definisao sa ORDER BY klauzulom).

ContactID     FirstName
———–        ————-
1                    Gustavo
2                    Catherine
3                    Kim
4                    Humberto
5                    Pilar

(5 row(s) affected)

Koliko god se mi trudili da sa ORDER BY korigujemo goren navedeni upit i promjenimo redosljed sortiranja…nemamo baš puno opcija, ako želimo RANDOM listu.

Pokušao sam i sa TABLESAMPLE.

SELECT ContactID, LastName
FROM Person.Contact
TABLESAMPLE (10 PERCENT)

Međutim, nije baš random. BOL takođe kaže da ovo nije najbolje rješenje ako želimo slučajni izbor podataka. Šta sad?

Rješenje je generalno vrlo jednostavno, mada ima svojih prednosti i mana. Sigurno svi znamo za funkciju NEWID(). Ista generiše uniqueidentifier vrijednost koja je definitvno jedinstvena. To je svima nama dobro poznati 16 bitni GUID. Ako NEWID() svaki put generiše drugačiju GUID, zašto isti ne bi mogli primjenili u ORDER BY klauzili? Vratimo se na prvi upit:

SELECT TOP 5 ContactID, FirstName
FROM Person.Contact
ORDER BY NEWID()

Nakon izvršenja, redosljed sortiranja će bit drugačiji nego u listingu 1..pritisnimo ponovo F5, pa opet F5, pa opet F5….rezultat izvršenja će svaki put vratiti drugih 5 zapisa. Ovo je definitno riješilo moj problem. Možda će ilustrativnije biti ako se TOP 5 promjeni na TOP 1. Sada će te nakon F5 svaki put dobiti drugi zapis (kao i u prvom slučaju), ali se bolji primjeiti razlika.

Koji su side effects ove metode? Ima jedna mana (koliko sam ja mogao promjetiti..nisam puno ulazio u problematiku). Naime, na jako velikim tabalema  (par stotina hiljada zapisa ili nekoliko miliona) NEWID() treba da se generiše za svaki od tih zapisa i pa tek onda uradi ORDER BY. To je procedura koja može uzeti JAKO puno vremena. Tabela Person. Contact ima malo više od 19 000 zapisa tako da problem sa performansama nije baš uočljiv, ali ako pogledamo execution plan izvršenja našeg upita gdje se generiše NEWGUID() i po istom sortira (nije indekisran) onda stvar postaje malo jasnija.

Kako god,  meni je ovo riješilo problem, vjerujem da ako neko od Vas bude imao slične zahtjeve..NEWID() je nešto što definitivno trebate uzeti u razmatranje.

END TRANSACTION

Written by Jasmin Azemović

08/08/2011 at 22:28

Posted in Database, SQL, SQL Server, TSQL

SQL Server Best Of (OFF)

with one comment

Konačno sam dobio link na Channel 9 gdje je objavljeno moje predavanje održano u Sarajevu 26.05.2011 u sklopu TechDays 2011. Za oni koji više preferiraju YouTube, predavanje se može naću sklopu moga kanala i traje 50 minuta. Tema je bila izbor najboljih (po mome mišljnju) mogučnosti SQL Server okruženja koje nisu zastupljene na ovim prostorima. Naravno, referiram se na okruženje Bosne i Hercegovine, mada vjerujem da je u našem okruženju stanje vrlo slično.

Summary na engleskom jeziku:

SQL Server contains a lot of qualities that are not perhaps quite noticeable at first glance. Some things are much better resolved than in the RDBMS competitors. The aim of this presentations to know what is best of SQL Server.

Prezentacija (pptx)

PS: Ono OFF nije greška, ideja je da se Of interpetira kao OFF tj. isključene ili zanemarene funkcionalnosti 🙂

END TRANSACTION

Written by Jasmin Azemović

05/08/2011 at 22:16

Posted in Database, MVP, SQL Server

sp_MSforeachtable (re-write)

with 2 comments

Da, pokušam rezimirati problem koji sam imao prije par sedmica. Pojavila se potreba da u “staroj” bazi podataka, u svaku tabelu, dodam po jedan novi atribut tipa uniqueidentifier. Ništa posebno, ALTER TABLE ili desni klik na istu pa odabir opcije “Design”. Naravno, nema nikavih problema…osim jednog. Baza ima preko 150 tabela !!

Nisam mogao prihvatiti činjenicu da nema nekog  lakšeg, skrivenog načina za kaskadnu promjenu objekata bez obzira na njihov broj. Poznato je da je Microsoft, posebno u SQL Serveru krije određeni broj undocumented procedures. Radi se o skrivenim blokovima TSQL koda koji po običaju rade fantastične i cool stvari, ali problem je što je sve to “skriveno” od očiju globalne bazaške populacije. Kao po definiciji svaka nedokumentovane procedure nema podršku tj. drugim riječima, nemamo koga da pitamo. Parola je snađi se.

Rješene moga problema je pronađeno (nakon par sati lutanja) u proceduri:

sp_MSforeachtable

Iz samog imena “foreachtable” se vidi kako bi stvar trebala da funkcioniše. Na primjeru baze podataka pubs će Vam sve biti kristalno jasno. Dole navedeni primjer prvo dodaje GUID atribut tipa uniqueidentifier u sve tabele, a zatim isti i uklanja.

USE pubs
GO

-- Dodavanje iste kolone u sve tabele
EXEC sp_MSforeachtable 'ALTER TABLE ? ADD GUID uniqueidentifier NULL'

-- Uklanjanje prethodno dodane kolone
EXEC sp_MSforeachtable 'ALTER TABLE ? DROP COLUMN GUID'

Zaista bih volio da ima „skrivena“ procedura za promjenu imena svih objekata unutar baze ili servera, npr. da u ime svih sp’s dodamo „new“. Možda i ima 🙂

END TRANSACTION

Written by Jasmin Azemović

11/07/2011 at 11:32

Posted in Database, SQL, SQL Server, TSQL