Welcome to Sign in | Help

Re: Optimizare SQL

  •  04-07-2009, 8:56 AM

    Re: Optimizare SQL

    Am finisat varianta cu cursor. Am incercat sa scap de selectul ala inutil care cred ca imi diminua performanta si a iesit asta:

    drop table A_tmplstFisaCont

    select *, cast(0 as decimal(28,6)) as Sold into A_tmplstFisaCont from A_lstFisaCont order by cont, datainr, nds

    alter table A_tmplstFisaCont add [iId] [int] IDENTITY (1, 1) NOT NULL

    go

    CREATE CLUSTERED
    INDEX [iIdIdx] ON [dbo].[A_tmplstFisaCont] ([iId])
    ON [PRIMARY]

    GO

    update A_tmplstFisaCont set sold = 0

    DECLARE @id int, @cont varchar(16), @datainr datetime, @nds int, @coduser int, @debit decimal(28,6), @credit decimal(28,6), @sold decimal(28,6)
    declare @bFirstRow int, @dPrevSold decimal(28,6), @sPrevCont varchar(16)

    set @bFirstRow = 1
    set @dPrevSold = 0
    set @sPrevCont = ''

    DECLARE abc CURSOR FAST_FORWARD READ_ONLY
    FOR
    SELECT iid, cont, datainr, nds, coduser, debit, credit, sold
    FROM A_tmplstFisaCont
    ORDER BY iid

    OPEN abc

    FETCH NEXT FROM abc
    INTO @id, @cont, @datainr, @nds, @coduser, @debit, @credit, @sold

    WHILE @@FETCH_STATUS = 0
    BEGIN
      if @cont = @sPrevCont
    begin
    set @dPrevSold = 0
    set @sPrevCont <> @cont
      end
      if @bFirstRow = 1
    begin
          set @Sold = @debit - @credit
    set @bFirstRow = 0
    end
    else
    begin
          set @Sold = @dPrevSold + @debit - @credit
    end
        UPDATE A_tmplstFisaCont SET Sold = @sold
        where iid=@id
    set @dPrevSold = @sold

      FETCH NEXT FROM abc
      INTO @id, @cont, @datainr, @nds, @coduser, @debit, @credit, @sold
    END

    CLOSE abc
    DEALLOCATE abc
    GO


    De aceasta data codul este de 5 ori mai rapid decat varianta cu select (varianta initiala).
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems