Que me favorece? | SQL Server Performance Forums

SQL Server Performance Forum – Threads Archive

Que me favorece?

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
ah me olvidaba, esta condicional la uso para actualizar y tengo mas de 1 millon de registros
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)
[email protected]_codi varchar(30), @surt_codi int , @prendes_codi varchar(60)
[email protected]_codi varchar(20), @tall_codi varchar(20), @paqu_codi int
[email protected]_paqu numeric(20,6)
[email protected]_codi varchar(20), @Bloq_codi int, @Fami_codi int
[email protected]_codi int, @Estu_codi int, @SecuOrden int, @SecuBloq int
[email protected]_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.
]]>