locked
XML update nagyon lassu RRS feed

  • Question

  • hello

    egy tablaban van 2000 rekord, mind a 2000 rekordban van 1-1 xml ami jo nagy (20k-110k kozt!)

    ezekben kell guidokat lecserelni ehhez van egy tabla benne a regi guid meg az uj giud

    az elso verzio 40 masodperc alatt futott le, a masodiknal eleg 0.6 sec is ami meg mindig nagyon sok (20 perc lenne a 2000 rekod update)

    hogyan lehetne tovabb gyorsitani?

    XML alapu, lassu verzio

    update d
    
    set a.modify('replace value of (//Entity/@Id[.=sql:column("oldid")])[1] with sql:column("new_id")')
    
    from p as d
    
    join t as u
    
    	on u.oldid = d.a.value('(//Entity/@Id[.=sql:column("OldID")])[1]', 'uniqueidentifier')
    
    
    
    

    VARCHAR alapu gyorsabb verzio:

    -- egy kis trukk, hogy ne kelljen mindig a selectben konvertalnia az SQLnek
    
    create table tt ( kereso varchar(1000), oldid varchar(1000), new_id varchar(1000) )
    
    insert into tt select '%'+convert(varchar(1000),oldid)+'%' , oldid, newi from t
    
    
    
    update d
    
    set a = replace(convert(varchar(max),a),u.oldid,u.new_id)
    
    from p as d
    
    join tt u
    
    	on convert(varchar(max),a) like u.kereso
    
    
    
    

    termeszetesen ezeket meg ciklusba is kell szervezni, hogy az osszes guidot lecsereljek...

    -- valalhogy igy :
    declare @i int
    select @i = 1
    while isnull(@i,0) > 0 
    begin
    	select @i = null
    	update d ...
    	set @i = @@Rowcount
    	print @i
    end

     


    Potyos
    • Edited by Pötyös Tuesday, April 27, 2010 12:38 PM
    Tuesday, April 27, 2010 12:36 PM

All replies

  • Van 1-2 tippem, tudnál adni valamilyen teszt adatot? Ciklusra miért van szükség?

    István Sáfár
    Wednesday, April 28, 2010 11:37 AM
    Moderator
  • azota sikerult meg kicsit tuningolni, a ciklus ezert kell mert 1 XMLben 3-4-5 IDt is kell cserelni. azaz ugyan azt a rekodot tobbszor is meg kell updatelni

    es egy ilyen update

    update e

    set Z=Z+1

    from EgyRekordosTabla e

    join TizRekordosTabla t

    on a=b

    csak 1x modositja az EgyRekordosTabla-t, es a raadasul a a.modify('replace value of  is csak az elso elofordulasra muxik :)

    holnap bentrol kuldo adatot is :) meg azt ami most muxik :) (a cross apply-val sikerult kicsit gyorsitani de meg lassu igy is)


    Potyos
    Thursday, April 29, 2010 9:01 PM