[ vujkev @ 23.09.2016. 15:09 ] @
Primera radi imamo tabelu Code (tsql): create table foo ( id int, Status tinyint, ... i nad kolonom Status kreiran index. Kolona status predstavlja jedan ili više mogućih statusa enum Statusi : byte { Status1 = 0x01, Status2 = 0x02, Status3 = 0x04, Status4 = 0x08 } Ukoliko napišem upit Code (tsql): Select * from foo where Status & 1 = 1 SQL neće koristiti kreiran index nad kolonom Status jer mora za svaki red da odradi bitwise operaciju. Ukoliko upit napišem kao Code (tsql): Select * from foo where Status = 1 index se naravno koristi. Na žalost ako neki red ima Status = Status4|Status1 gornji upit neće vratiti taj red. Jedno moguće rešenje je da se statusi prebace u posebnu tabelu i da se svaki mogući status snima kao poseban red Code (tsql): create table fooStatus( fooID int, Status tinyInt U ovom slučaju statusi mogu da budu brojevi 1, 2, 3, 4 ... jer se neće koristiti bitwise operacije, ali ukoliko foo tabela ima 5.000.000 redova ova tabela može imati do 50.000.000 (ako kažemo da postoji max 10 moguća statusa). Da li će ovoliki index imati uticaj na performanse izvršavanja upita? Drugo rešenje je da se koristi IN prilikom selecta Code (tsql): Select * from foo where Status IN (1, 3, 5, 7, 9, 11, 13, 15) -- ako ima max 4 statusa i tražimo Status & 1 = 1 U ovom slučaju problem je ako postoji npr 10 mogućih statusa. IN clause u ovom slučaju može biti poprilično dugačka. Da li će ovo imati uticaj na performanse izvršavanja upita? Postoji li još neko rešenje ovog problema i kako ga rešavate u vašim aplikacijama? Poz. |