SQL Server Performance

Que me favorece?

Discussion in 'Preguntas sobre SQL Server en Español.' started by fjac_pe, Feb 11, 2005.

  1. fjac_pe New Member

    tengo una condicional como especifico a continuacion
    where OrdCort_codi = @OrdCort_codi and
    Esti_codi = @esti_codi and
    surt_codi = @surt_codi and
    Colo_codi = @colo_codi and
    Prendes_codi = @Prendes_codi and
    Cenc_codi = @Cenc_codi and
    Bloq_codi = @Bloq_codi and
    Fami_codi = @Fami_codi and
    Oper_codi = @Oper_codi and
    Paqu_codi = @Paqu_codi and
    Tall_codi = @Tall_codi
    es mi tabla de mas de 1 millon de registros, tengo que crear indices por cada campo para
    agilizar mi proceso?, o puedo crear un indice donde ponga todos los campos, que es mas
    conveniente, y si es todo en un solo indice, como sabe sql que indice usar?, gracias
  2. fjac_pe New Member

    ah me olvidaba, esta condicional la uso para actualizar y tengo mas de 1 millon de registros
  3. c_maldon Member

    Cuando utilizás la condicional para actualizar, que campos actualizas de la tabla?

    Como es la tabla y que PK e indices ya tiene?
  4. fjac_pe New Member

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Tickets]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Tickets]
    GO

    CREATE TABLE [dbo].[Tickets] (
    [OrdeTrab_codi] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
    [OrdCort_codi] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
    [Esti_codi] [char] (30) COLLATE Modern_Spanish_CI_AS NOT NULL ,
    [Surt_codi] [int] NOT NULL ,
    [Prendes_codi] [char] (35) COLLATE Modern_Spanish_CI_AS NOT NULL ,
    [Colo_codi] [char] (4) COLLATE Modern_Spanish_CI_AS NOT NULL ,
    [Tall_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,
    [Paqu_codi] [int] NOT NULL ,
    [Cant_Paqu] [numeric](20, 0) NOT NULL ,
    [Tick_Codi] [char] (15) COLLATE Modern_Spanish_CI_AS NOT NULL ,
    [Tick_Leid] [int] NOT NULL ,
    [Secu_Oper] [int] NOT NULL ,
    [Secu_Bloq] [int] NOT NULL ,
    [Cenc_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,
    [Bloq_codi] [int] NOT NULL ,
    [Fami_codi] [int] NOT NULL ,
    [Oper_codi] [int] NOT NULL ,
    [Estu_codi] [int] NOT NULL ,
    [Tick_Tstd] [numeric](20, 6) NOT NULL ,
    [Tick_Item] [int] NOT NULL ,
    [Tick_Fech] [datetime] NULL ,
    [Tick_Year] [numeric](4, 0) NULL ,
    [Tick_Sema] [numeric](2, 0) NULL ,
    [Tick_Ndia] [numeric](2, 0) NULL ,
    [Lectu_Id] [int] NULL ,
    [Line_codi] [int] NULL ,
    [Obre_codi] [char] (10) COLLATE Modern_Spanish_CI_AS NULL ,
    [Tick_Feri] [int] NULL ,
    [Tick_Dest] [int] NULL ,
    [Tick_Plant] [int] NULL ,
    [Tick_HNEx] [int] NULL ,
    [Tick_Cerr] [int] NOT NULL ,
    [Tick_Proc] [int] NOT NULL ,
    [Tick_Elim] [int] NOT NULL ,
    [TickCabe_Codi] [char] (15) COLLATE Modern_Spanish_CI_AS NULL ,
    [Tick_UserCrea] [int] NOT NULL ,
    [Tick_FechCrea] [datetime] NOT NULL ,
    [Tick_UserModi] [int] NOT NULL ,
    [Tick_FechModi] [datetime] NOT NULL
    ) ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[Tickets] WITH NOCHECK ADD
    CONSTRAINT [PK_Tickets] PRIMARY KEY CLUSTERED
    (
    [Tick_Codi]
    ) WITH FILLFACTOR = 90 ON [PRIMARY]
    GO

    CREATE INDEX [IX_Tickets] ON [dbo].[Tickets]([OrdCort_codi]) WITH FILLFACTOR = 90 ON [PRIMARY]
    GO

    CREATE INDEX [IX_Tickets_1] ON [dbo].[Tickets]([Esti_codi]) ON [PRIMARY]
    GO

    CREATE INDEX [IX_Tickets_2] ON [dbo].[Tickets]([OrdeTrab_codi]) WITH FILLFACTOR = 90 ON [PRIMARY]
    GO

    CREATE INDEX [IX_Tickets_3] ON [dbo].[Tickets]([Tick_Fech]) WITH FILLFACTOR = 90 ON [PRIMARY]
    GO

    CREATE INDEX [IX_Tickets_4] ON [dbo].[Tickets]([Obre_codi]) ON [PRIMARY]
    GO

    CREATE INDEX [IX_Tickets_5] ON [dbo].[Tickets]([Surt_codi]) ON [PRIMARY]
    GO


    esta es la tabla, antes del indice ix_tickets_2, tenia los campos esti_codi, surt_codi, colo_codi, tall_codi.

    Ahora tengo problemas porque al parecer colapsa el proceso de actualizacion y lo peor es que es un error que no me devuelve mensaje de error.
  5. c_maldon Member

    Ok, mandame el UPDATE
    que realizas para ver como trabaja y cuales campos modificas.

    Mientras le estoy poniendo a la tabla en mi server 1500000 de registros para luego correr el update que me envies y ver como se comporta.
  6. c_maldon Member

    Cuando decis colapsa, a que te referis, que es lo que pasa?, se cuelga el proceso o se te reinicia SQL Server?

    Si ejecutas desde el Analizador de Consultas, no te dá un mensaje de error?




  7. c_maldon Member

    Descarto que no tenés problemas de espacio en disco y que no se llena el transaction log.

    Cuantos registros actualiza el UPDATE cuando no se colapsa?
  8. fjac_pe New Member

    @SecuOrden = 1
    @SecuBloq = 2
    @cant_paqu = 20
    @OrdeTrab_codi = '04-000027'
    @Estu_codi = 1
    @OrdCort_codi = '04-000024'
    @esti_codi = '180102'
    @surt_codi = 1
    @colo_codi = '0245'
    @Prendes_codi = '215300024512'
    @Cenc_codi = '200'
    @Bloq_codi = 30
    @Fami_codi = 3
    @Oper_codi = 2
    @Paqu_codi = 1
    @Tall_codi = '092'

    Posible valores

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO



    CREATE procedure Sp_TicketsGeneracion @Corte varchar(20), @ValorCencos integer, @Cencos1 varchar(200), @Cencos2 varchar(200) , @Tiempos as int, @Operaciones as int, @User as int, @Corte_corr as numeric(20) output as
    declare @Sql varchar(8000)
    declare @SqlCencos varchar(500)
    declare @OrdeTrab_codi varchar(20), @ordcort_codi varchar(20), @cenc_codi varchar(20)
    declare@esti_codi varchar(30), @surt_codi int , @prendes_codi varchar(60)
    declare@colo_codi varchar(20), @tall_codi varchar(20), @paqu_codi int
    declare@cant_paqu numeric(20,6)
    declare@plant_codi varchar(20), @Bloq_codi int, @Fami_codi int
    declare@Oper_codi int, @Estu_codi int, @SecuOrden int, @SecuBloq int
    declare@Tick_Tstd numeric(20,6)
    declare @Tick_Codi varchar(20)
    declare @Tick_Item numeric(20,6)
    --declare @Corte_corr as numeric(20)
    declare @MaxTicket as numeric(20,6)
    declare @PrinTicket as varchar(20)
    select @Tick_Item = 0
    select @Tick_Codi = '0'
    select @SqlCencos = ''

    --begin tran
    --IF (@@ERROR <> 0) GOTO on_error
    if @ValorCencos = 0
    select @SqlCencos = ''
    if @ValorCencos = 1
    select @SqlCencos = 'cenc_codi in (' + @Cencos1 + ')'
    if @ValorCencos = 2
    select @SqlCencos = 'cenc_desc between ' + @Cencos1 + ' and ' + @Cencos2
    select @Corte_corr = null

    select @Corte_corr = OrdCort_Corr, @MaxTicket = UltiEmitido + 1 from TicketsEmitidos where OrdCort_codi = '' + @corte + ''

    if @Corte_corr is null
    begin
    select @Corte_corr = OrdCort_Corr + 1 from TicketCorrelativo
    if @Corte_corr is null
    begin
    select @Corte_Corr = 1
    insert into TicketCorrelativo (OrdCort_Corr) values (1)
    --IF (@@ERROR <> 0) GOTO on_error
    end
    else
    begin
    Update TicketCorrelativo set OrdCort_Corr = OrdCort_Corr + 1
    --IF (@@ERROR <> 0) GOTO on_error
    end
    insert into TicketsEmitidos (OrdCort_codi, OrdCort_Corr, UltiEmitido, FechEmit, FechImp, Tick_UserCrea, Tick_FechCrea, Tick_UserModi, Tick_FechModi)
    values ('' + @Corte +'', @Corte_corr, 1, getdate(), null, @User, getdate(), @User, getdate())
    --IF (@@ERROR <> 0) GOTO on_error

    --print 'inserta en tickets emitidos'
    end

    select @MaxTicket = isnull(@MaxTicket,1)

    select @Sql= 'Update Tickets set Tick_Elim = case when ' + cast(@Operaciones as varchar(20)) + ' = 0 then
    1 else case when Tick_Leid = 0 then 1 else 0 end end where ordcort_codi = ''' + @Corte + ''''

    if @ValorCencos = 2
    begin
    select @Sql= 'Update Tickets set Tick_Elim = case when ' + cast(@Operaciones as varchar(20)) + ' = 0 then
    1 else case when Tick_Leid = 0 then 1 else 0 end end
    from Tickets inner join Cencos on Tickets.Cenc_codi = Cencos.Cenc_codi
    where ordcort_codi = ''' + @Corte + ''''
    end
    else
    begin
    select @Sql= 'Update Tickets set Tick_Elim = case when ' + cast(@Operaciones as varchar(20)) + ' = 0 then
    1 else case when Tick_Leid = 0 then 1 else 0 end end where ordcort_codi = ''' + @Corte + ''''
    end

    if @ValorCencos = 1
    Select @Sql = @Sql + ' and Tickets.' + @SqlCencos + ' and Tick_Cerr = 0'
    if @ValorCencos = 2
    Select @Sql = @Sql + ' and Cencos.' + @SqlCencos + ' and Tick_Cerr = 0'

    exec(@Sql)
    --IF (@@ERROR <> 0) GOTO on_error
    select @Sql ='declare c_CurGenTick cursor for
    select PlaniPaquDeta.OrdeTrab_codi, PlaniPaquDeta.ordcort_codi, PlaniPaquDeta.cenc_codi,
    PlaniPaquDeta.esti_codi, PlaniPaquDeta.surt_codi, PlaniPaquDeta.prendes_codi,
    PlaniPaquDeta.colo_codi, PlaniPaquDeta.tall_codi, PlaniPaquDeta.paqu_codi,
    PlaniPaquDeta.cant_paqu,
    EstiPlantSecu.plant_codi, EstiPlantSecu.Bloq_codi, EstiPlantSecu.Fami_codi,
    EstiPlantSecu.Oper_codi, EstiPlantSecu.Estu_codi, EstiPlantSecu.Secu_Id1 SecuOrden,
    EstiPlantSecu.Tstd, EstiPlantSecu.Secu_Id3 SecuBloq
    from PlaniPaquDeta
    inner join EstiPlantSecu
    on PlaniPaquDeta.Esti_codi = EstiPlantSecu.Esti_codi and
    PlaniPaquDeta.Surt_codi = EstiPlantSecu.Surt_codi and
    PlaniPaquDeta.Prendes_codi = EstiPlantSecu.prendes_codi and
    PlaniPaquDeta.Cenc_codi = EstiPlantSecu.Cenc_codi
    inner join Cencos
    on Cencos.Cenc_codi = EstiPlantSecu.Cenc_codi
    where PlaniPaquDeta.ordcort_codi = ''' + @Corte + ''''

    if @ValorCencos = 1
    Select @Sql = @Sql + ' and PlaniPaquDeta.' + @SqlCencos --+ ' and Tick_Cerr = 0'
    if @ValorCencos = 2
    Select @Sql = @Sql + ' and Cencos.' + @SqlCencos -- + ' and Tick_Cerr = 0'

    SELECT @Sql = @Sql + ' order by PlaniPaquDeta.cenc_codi, PlaniPaquDeta.paqu_codi '

    exec (@sql)
    --IF (@@ERROR <> 0) GOTO on_error

    open c_CurGenTick
    fetch next from c_CurGenTick into
    @OrdeTrab_codi, @Ordcort_codi, @Cenc_codi,
    @esti_codi, @surt_codi, @Prendes_codi,
    @colo_codi, @tall_codi, @paqu_codi,
    @cant_paqu,
    @plant_codi, @Bloq_codi, @Fami_codi,
    @Oper_codi, @Estu_codi, @SecuOrden,
    @Tick_Tstd, @SecuBloq

    while @@Fetch_status = 0
    begin

    update Tickets set
    Secu_Oper = @SecuOrden, secu_bloq = @SecuBloq, OrdeTrab_codi = @OrdeTrab_codi, Estu_codi = @Estu_codi,
    cant_paqu = case when Tickets.Tick_Cerr = 0 then
    @cant_paqu
    else cant_paqu end,
    Tick_Tstd = case when Tickets.Tick_Cerr = 0 then
    case when @Tiempos = 0 then
    @Tick_Tstd
    when @Tiempos = 1 and Tick_Leid = 0 then
    @Tick_Tstd else Tick_Tstd end
    else Tick_Tstd end,
    Tick_Elim = case when Tickets.Tick_Cerr = 1 then
    Tick_Elim else 0 end
    where OrdCort_codi = @OrdCort_codi and
    Esti_codi = @esti_codi and
    surt_codi = @surt_codi and
    Colo_codi = @colo_codi and
    Prendes_codi = @Prendes_codi and
    Cenc_codi = @Cenc_codi and
    Bloq_codi = @Bloq_codi and
    Fami_codi = @Fami_codi and
    Oper_codi = @Oper_codi and
    Paqu_codi = @Paqu_codi and
    Tall_codi = @Tall_codi

    --IF (@@ERROR <> 0) GOTO on_error
    if @@rowcount=0
    begin
    --select @PrinTicket = '0' + right('00000' + cast(cast(@Corte_corr as int) as varchar(20)),5) + right('00000' + cast(cast(@MaxTicket as int) as varchar(20)),5)
    --8 para tickets de operaciones
    select @PrinTicket = '0' + right('00000' + cast(cast(@MaxTicket as int) as varchar(20)),5) + right('00000' + cast(cast(@Corte_corr as int) as varchar(20)),5)
    --print @PrinTicket
    insert into tickets
    (OrdeTrab_codi, OrdCort_codi, Esti_codi, Surt_codi,
    Prendes_codi, Colo_codi, Tall_codi, Paqu_codi,
    Cant_Paqu, Tick_Codi, Tick_Leid, Secu_Oper,
    Cenc_codi, Bloq_codi, Fami_codi, Oper_codi,
    Estu_codi, Tick_Tstd, Tick_Item, Tick_Fech,
    Tick_Year, Tick_Sema, Tick_Ndia, Lectu_Id,
    Line_codi, Obre_codi, Tick_Feri, Tick_Dest,
    Tick_Plant, Tick_HNEx, Tick_Cerr, Tick_Proc,
    Tick_Elim, TickCabe_Codi, Tick_UserCrea, Tick_FechCrea,
    Tick_UserModi, Tick_FechModi, secu_bloq)
    values (@OrdeTrab_codi, @OrdCort_codi, @Esti_codi, @Surt_codi,
    @Prendes_codi, @Colo_codi, @Tall_codi, @Paqu_codi,
    @Cant_Paqu, @PrinTicket, 0, @SecuOrden,
    @Cenc_codi, @Bloq_codi, @Fami_codi, @Oper_codi,
    @Estu_codi, @Tick_Tstd, @Tick_Item, null,
    null, null, null, null,
    null, null, null, null,
    null, null, 0, 0,
    0, null, @User, getdate(),
    @User, getdate(), @SecuBloq)
    --IF (@@ERROR <> 0) GOTO on_error
    update TicketsEmitidos set UltiEmitido = @MaxTicket where OrdCort_codi= '' + @Corte + ''
    --IF (@@ERROR <> 0) GOTO on_error
    select @MaxTicket = @MaxTicket + 1
    --print @MaxTicket
    end

    fetch next from c_CurGenTick into
    @OrdeTrab_codi, @Ordcort_codi, @Cenc_codi,
    @esti_codi, @surt_codi, @Prendes_codi,
    @colo_codi, @tall_codi, @paqu_codi,
    @cant_paqu,
    @plant_codi, @Bloq_codi, @Fami_codi,
    @Oper_codi, @Estu_codi, @SecuOrden,
    @Tick_Tstd, @SecuBloq
    end

    close c_CurGenTick
    deallocate c_CurGenTick

    select @Sql=' declare c_CurGenTick cursor for
    select distinct cenc_codi from Tickets where OrdCort_codi = ''' + @Corte + ''''

    if @ValorCencos = 1
    select @Sql = @Sql + ' and cenc_codi in (' + @Cencos1 + ')'
    if @ValorCencos = 2
    select @Sql = @Sql + ' and cenc_desc between ' + @Cencos1 + ' and ' + @Cencos2
    exec(@Sql)

    open c_CurGenTick
    fetch next from c_CurGenTick into @Cenc_codi
    while @@Fetch_Status = 0
    begin
    update TicketsImpresos set FechEmit = getdate(), Tick_UserModi = @User,
    Tick_FechModi=getdate()
    where OrdCort_codi = '' + @Corte + '' and Cenc_codi = '' + @Cenc_codi + ''
    --IF (@@ERROR <> 0) GOTO on_error
    if @@rowcount = 0
    insert into TicketsImpresos (OrdCort_codi, Cenc_codi, FechEmit, Tick_UserCrea, Tick_FechCrea, Tick_UserModi, Tick_FechModi)
    values ('' + @Corte + '', '' + @Cenc_codi + '', getdate(), @User , getdate(), @User , getdate() )
    --IF (@@ERROR <> 0) GOTO on_error
    fetch next from c_CurGenTick into @Cenc_codi
    end
    close c_CurGenTick
    deallocate c_CurGenTick

    --IF (@@ERROR <> 0)
    --begin
    --rollback transaction

    --return(0)
    --end
    --else
    --on_error:
    --begin
    --Commit transaction
    --return(1)
    --end
    --O
    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    Ese es mi store, en la parte inicial no hay problema, solo registra en otra tabla si se generaron o no los registros, antes primero preguntaba si el registro existia y de acuerdo a eso insertaba o actualizaba, pero demoraba mas, por lo que preferi actualiar y preguntar si actualiza o no para que inserte y mejoro mucho, ahora como veras el store dice si no actualiza inserta, sino no inserta, bueno si no actualizara, tendria que insertar y me llenaria de registros, antes lo ponia en transaccion pero tambien colapsaba y quedaba la transaccion abierta, y si seguian trabajando, al salir, se borraba todas las modificaciones en las tablas modificadas posteriormente, un verdadero problema, por eso lo quite y pensando que el problema pasaria, pense que la transaccion colapsaba porque tenia muchas conexiones, pero veo que sigue, bueno, como siempre tenemos el xp y sql personal, la semana que sigue estamos migrando a windows 2000 server y sql standard, con lo que tendremos mejoras. Lo que dedusco es que el store colapsa pero no devuelve mensaje de error al visual basic porque sino en basic lo reconoceria sin problemas e informaria que se genero un error en la generacion, primero todos los tickets los marco como anulados y de acuerdo a la generacion los reactivo.
  9. fjac_pe New Member

    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',1,1,1,1,1,0.000000,1
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',2,1,1,1,36,0.000000,7
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',2,1,2,1,37,0.000000,7
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',10,1,71,1,6,0.219000,3
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',40,1,40,1,7,0.120000,4
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',40,2,25,1,8,0.284000,4
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',40,3,26,1,10,0.220000,4
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',40,5,16,1,9,0.132000,4
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',40,7,1,1,11,0.353000,4
    '04-000786','05-000537','200','3N0368',1,'0230000190710200257000000','8702','001',23,20,'21006',250,1,36,1,12,0.221000,5
    estos solo son algunos registros generados en el select, por si quieres ver como manejor los datos. claro que este select cuenta en realidad con 5000 registros, es el mas pesado registrado
  10. c_maldon Member

    En las pruebas que he realizado me ha dado mucho resultado
    hacer que el indice clustered sea [IX_Tickets], para ello elimine la clave primaria, marque a [IX_Tickets] como clustered y volvi a declarar la clave primaria no clustered.

    Si podés hacer esto en desarrollo, entonces fijate si el Sp_TicketsGeneracion ejecuta más rápido cuando tiene que hacer UPDATEs.

    Saludos
  11. fjac_pe New Member

    Que tal, tiempo no he ingresado y he encontrado un problema, el actualizar no hay problemas, es rapido para hacerlo pero al ejecutar la primera ves, se tiene que insertar lo valores similares a como esta anteriormente y se demora una eternidad como comente tambien, genere un temporal para jugar ahi, bueno la inserccion en esa tabla es rapida, y luego hago update a la tabla real o insert pedendiendo el caso y nuevamente se demora, claro que en este caso utilizo el id principal para saber si existe el registro o no, para no estar pregutando si el paquete u otro campo, si no solo por el id principal.

    Ah ya tengo el windows 2000 server con sql 2000 standard, Pentium IV de 2,8 G y 1 G de memoria, uso Sql check y me da que el average latch wait time esta en 1047, que me indica, bueno conexiones tengo 155 y el bufrer cache hit ratio esta en 100, de ahi las bases de datos estan en 1, y 3 gigas respectivamente el average lock wait 0 y lock timeouts 0 tambien. Espero sus comentarios, gracias.

    Muchas gracias

    Jesus Aguilar
  12. Luis Martin Moderator

    Sería conveniente que con el Monitor de Performance para observar:
    Memoria: Pages/sec

    Physical Disk: Avg. Disk Queue Length por cada disco.



    Luis Martin
    Moderator
    SQL-Server-Performance.com

    One of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important
    Bertrand Russell


    All postings are provided “AS IS” with no warranties for accuracy.



Share This Page