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
Cuando utilizás la condicional para actualizar, que campos actualizas de la tabla? Como es la tabla y que PK e indices ya tiene?
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.
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.
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?
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?
@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.
'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
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
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
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.