[ kg.rules @ 28.12.2011. 15:09 ] @
Pozdrav svima.

Nigde nisam mogao da nadjem odgovor na neko ovakvo pitanje.

Zanima me da li se ubrzava rad upita nad bazom tj tabelama kada je ona "sredjena" tj vrednosti po primarnom kljucu (npr) idu redom nego kada su redovi u bazi recimo random.

Primer: Primarni kljuc ima vrednosti 1,4,19,2,16,22 ... (ovim redom su unosene vrednosti u tabelu)
ili kada je primarni kljuc sortiran po npr rastucem redosledu. (1,2,4,16,19,22 ...)

Ako upit brze radi kada su redovi u tabeli sredjeni kako postici njihovo reindeksiranje tj kako ih sortirati po rastucem redosledu npr?

Hvala ...
[ Dusan Kondic @ 28.12.2011. 17:15 ] @
Tačno je da upiti rade brže kada je baza "sređena". Jedan od razloga postojanja indeksa upravo jeste ubrzanje pretrage.
E, sad. Polje nad kojim je podignut primarni ključ ne mora da bude grupišući indeks za neku tabelu. Npr. tabela može da
ima polje "Id" i da nad njom bude podignut primarni ključ a da grupišući indeks bude podignut nad
poljem "Redosled". To najviše zavisi od toga koje se polje najčešće navodi u WHERE klauzuli kada se vrši
upit nad tom tabelom. Indeksa može da se podigne neograničeni broj ali samo jedan može biti grupišući. To znači da će
podaci fizički biti poređani po tom polju. Naravno, kreiranje indeksa usporava upis i izmenu tako da ih treba dodavati
samo prema potrebi i s pažnjom.
Postavio si pitanje iz oblasti koja je poprilično široka i ako želiš da je savladaš preporučujem ti da potražiš neku literaturu
i da eksperimentišeš sa velikim brojem stavki. SQL Profiler ti može postati najbolji drug ;-).
Pozdrav.
[ Dusan Kondic @ 28.12.2011. 17:17 ] @
Umalo da zaboravim. Skript za reindeksaciju svih tabela:
Code:

CREATE TABLE #A(RBr INT IDENTITY(1, 1), table_name NVARCHAR(100))

INSERT INTO #A
SELECT table_name FROM information_schema.tables 
WHERE table_type = 'base table' ORDER BY  table_name

DECLARE @I INT
DECLARE @BrTabela INT
SET @I = 1
SET @BrTabela = (SELECT COUNT(*) FROM #A)

DECLARE @tabela sysname
DECLARE @SQL NVARCHAR(100)

WHILE @I <= @BrTabela
BEGIN
SET @tabela = (SELECT table_name FROM #A WHERE RBr = @I)
SET @SQL = 'ALTER INDEX ALL ON [' + @tabela + '] REBUILD'
EXEC sp_executesql @SQL
SET @SQL = 'ALTER INDEX ALL ON [' + @tabela + '] REORGANIZE'
EXEC sp_executesql @SQL
SET @I = @I + 1
END

DROP TABLE #A
GO
[ kg.rules @ 29.12.2011. 11:55 ] @
Hvala Dusane.

Hvala na odgovoru. Pretpostavljao sam da radi brze ali nisam bio siguran, a da mogu da indeksiram tabelu po bilo kojoj koloni to mi je jasno.

U sustini ja bih trebao da regrupisem tabelu (bazu) npr 1 u godinu dana ili jednom mesecno. Dakle korisnik unosi podatke i jednom mesecno ili godisnje (nebitno) odradi se "sredjivanje".