Konkatenacija string vrednosti iz razlicitih redova (2. deo)

Objavljeno: 18-02-2014 | Autor: Tatjana Mađer | Kategorija: T-SQL

Ознаке:

2

Vrlo često se programeri susreću sa zahtevom da prikažu u aplikaciji izveštaj koji sadrži sumarne rezultate gde je potrebno prikazati u posebnoj koloni svakog sumarnog reda sve članove koji učestvuju u agregatnom redu.
U prethodnom delu ovog članka, objašnjeni su načini konkatenacije string vrednosti ukoliko je unapred poznat i ograničen broj redova i stringova koje treba spojiti.

Nepoznat broj redova

Slučajevi sa kojima se developeri najčešće susreću su oni kada je broj redova nepoznat. U ovim slučajevima je kod komplikovaniji i zahteva napredno poznavanje transakcionog SQL jezika. Varijanti za rešenje ovog problema ima više i najinteresantnije će biti objašnjene u nastavku.
a)   Korišćenje rekurzije uz pomoć CTE analogno generisanju hijerarhije. CASE u rekurzivnom delu upita je stavljen da bi se izbegao zarez na prvom mestu rezultata konkatenacije, što se može postići i na drugi način. Glavni nedostatak ove metode je to što brzina izvršavanja ovog upita postaje nezadovoljavajuća sa porastom broja nivoa. Treba obratiti pažnju i na sledeće: s obzirom na to da je podrazumevani limit za broj nivoa u rekurziji 100, preporuka je koristiti hint MAXRECURSION koji omogućava definisanje maksimalnog broja nivoa u rekurziji, gde je omogućeno definisati i beskonačan broj redova (Maxrecursion 0) što je i urađeno u narednom primeru.

 

b)   Rekurzija uz pomoć CTE gde se koristi poseban CTE za prvi a poseban za ostale nivoe rekurzije. Ovaj upit ima bolje performanse u odnosu na prethodni. Pošto je u pitanju rekurzija kao i u prethodnom primeru, potrebno je obratiti pažnju na iste napomene.

 

c)   Konkatenacija korišćenjem FOR XML metoda sa PATH modom koji nema ograničenja što se tiče broja nivoa, a i performanse su neuporedivo bolje u odnosu na rekurzivne upite. U nastavku su data dva načina:

 

d)   Dinamički SQL koristeći ROW_NUMBER funkciju da bi se pivotirali podaci za konkatenaciju . Nedstatak ovog metoda je taj što upit koji je sklopljen, može biti veoma rogobatan zbog potencijalno velikog broja članova u select statement-u.

 

e)   Varijanta sa korišćenjem kursora postoji, ali zbog brzine i resursa koje koristi, treba je izbegavati

 

Preporuka je konkatenaciju vrednosti ili izraza iz različitih redova u aplikaciji, najbolje i najbrže raditi na klijentskoj strani, s obzirom na to da SQL ima određena ograničenja u ovom domenu. Ukoliko je neophodno raditi je u SQL-u, kursor je metod koji nikako ne treba koristiti, osim ukoiko je verzija sql server-a toliko niska, da ne podržava ni jednu drugu ponuđenu metodu. Rekurzija je dobar metod ukoliko je broj slogova (samim tim i broj nivoa) mali, sa povećanjem broja nivoa, treba je izbegavati. Trenutno najjednostavnija varijanta bez nedostataka je varijanta c), korišćenje FOR XML PATH.
Na primerima sa malim brojem slogova (do 1000) sve metode osim metode a) su pokazale sasvim zadovoljavajuće performanse. Na velikom broju slogova (oko milion), upiti koji su potpuno neprihvatljivi i koji će završiti nakon veoma dugog vremena izvršavanja (a možda i nikad) su a), b), c2 (FOR XML PATH sa CROSS APPLY varijantom) i d ). Najbrža je c1 varijanta sa XML PATH i ona je definitivno preporuka za korišćenje na svim veličinama baza.

Komentari (2)

[…] Konkatenacija string vrednosti iz razlicitih redova (1. deo) Konkatenacija string vrednosti iz razlicitih redova (2. deo) […]

[…] nekog vremena smo u dva članka (1, 2) opisali proces konkatenacije, odnosno spajanja vrednosti iz kolone u jedan string. Ovog puta […]

Napišite komentar