utorak, 3. kolovoza 2010.

Spori update

Eh evo kako sam rjesio problem.
Prikaz je na testnim podacima od 1000 redova.
Prvi slucaj: Svaki red ce biti uparen s unutrasnjim selektom i vaki ce se update-tati na odredjenu vrijednost.
Excetuion plan nad drugom tablicom je sljedeci:




Evo podataka o izvrsenju prve tacke (krajnje desne)
















Drugi slucaj: Ni jedan red nema para, tj sve ide na NULL.
Evo podataka o prvoj tacki execution plana:

Problem se vidi na Broju actual number of rows. U drugom slucaju kad je NULL napravio je nekakav proizvod prve tablice da bi zapisao NULL.
Zasto se to desilo ne razumijem. Al koje je rjesenje, sasvim slucajno otkriveno, izbrisao sam primarni kljuc druge tablice, postavio sam index na dvije kolone, i nema vise zadrzavanja. Novi execution plan
Ne znam ni kako ni zasto, ali bez kljuca savrseno radi update imao sta zapisati ili samo NULL.

utorak, 1. prosinca 2009.

Redni broj iliti ROW COUNT

Ovo je vezano za sve nesretnike koji rade na serveru mssql 2000.
Zanimljiv nacin za prevazilazenje nedostatka servera.
Ukoliko vam je potreban u rezultatu i broj reda u koloni evo nacina kako se to moze dobiti...

select IDENTITY(int,1,1) AS [Row Number],* INTO #Temp
from TABLE
order by column

select * from #Temp

drop table #Temp

Zatrebalo i ovo...

Brisanje duplih podataka iz tablice....

Bio je to jedan lijep i suncan dan. Samo sto ga je moglo pokvariti su dupli podaci po tablicama, i eto desi se tako.
Puna tablica podataka a ne meres udarit kljuc nikako, ima hin sa istim vremenom nastanka podatka, sto se ujedno jeli i nametnulo kao kljuc tabele.
Nakon sto se editovao jedan cijeli excel file, reko stanite ljudi ne mere ovo vako.
I tako vratim se ja starom dobrom sql-u i nakon malo napornog rada dodjem to otkrica dana.
Rezultat je sljedeci kratki kod, koji je ustedio par dana rada...

DECLARE @colA datetime
DECLARE @colB int
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR FAST_FORWARD
FOR
select pkColumn,count(pkColumn)-1
from TABLE
group by pkColumn
having count(pkColumn)>1

OPEN @MyCursor
FETCH NEXT
FROM @MyCursor
INTO @ColA,@ColB

WHILE @@FETCH_STATUS = 0
BEGIN

set rowcount @ColB
delete TABLE
where pkColumn=@ColA

FETCH NEXT
FROM @MyCursor
INTO @ColA,@Col
B
END

CLOSE @MyCursor
DEALLOCATE @MyCursor



Eto tako se vrlo jednostavno rjesavamo duplih recorda...



DELETE DUPLICATE RECORDS (za ove strance, nebil slucajno nekom zatrebalo)