Consulta lenta | SQL Server Performance Forums

SQL Server Performance Forum – Threads Archive

Consulta lenta

La siguiente consulta que tengo ya lo lleve al optimizador de indices y no me recomienda ninguno de los que ya tengo establecidos pero se demora demasiado, cuando quiero toda la informacion lo invoco de la siguiente manera Sp_TicketsEmitidos 2, 2005,1, 1,
’05/01/05′, ’11/01/05′, 1,0, 0,”, ”,0,”, ”,0,”, ”,1,0,”, ”,0,”, ”,0,”, ”,
0,”, ”,0,”, ”
Los valores 0,”,” no los he acoplado aun, significa que si quiero ver de un obrero x pondira 1,’000254′,” o de un rango 2,’000254′,’000489′, segun lo que puedan observar por la cantidad de tablas relacionadas (algo de 8 o 9 tablas), que me aconsejarian seguir para optimizar manualmente la consulta. Gracias, se que mucho tiene que ver el sql personal que tengo y el xp, pero no puedo hallar una manera de optimizacion? Select Fech_Year, ” as Fech_Month, Fech_Week , Tick_Fech, ” AS Lectu_Id , Tickets.OrdCort_codi, Tickets.Esti_codi, BdComun..Color.colo_desc, BdComun..Tallas.tall_desc,
Tickets.Paqu_codi, Tickets.Cant_Paqu, Tickets.Tick_Codi, Tickets.Cenc_codi, Tickets.Bloq_codi, Tickets.Fami_codi,
Tickets.Oper_codi, Operaciones.Oper_Desc, Tickets.Estu_codi, Tickets.Tick_Tstd, Tickets.Line_codi, Tickets.Obre_codi,
Obreros.Obre_CodiAlte, Obreros.Obre_ApelPate, Obreros.Obre_ApelMate, Obreros.Obre_Nombres, Tickets.Tick_Fech,
Tickets.Lectu_Id, Tickets.Tick_Elim, Maquinas.Maqu_Desc, MaquinasTipo.Maqu_TipoDesc, Lineas.Line_Desc,
Estudios.TStd, Tickets.Tick_Cerr
FROM MaquinasTipo INNER JOIN
Maquinas ON MaquinasTipo.Maqu_Tipo = Maquinas.Maqu_Tipo INNER JOIN
Tickets INNER JOIN
Operaciones ON Tickets.Cenc_codi = Operaciones.Cenc_codi AND Tickets.Bloq_codi = Operaciones.Bloq_codi AND
Tickets.Fami_codi = Operaciones.Fami_codi AND Tickets.Oper_codi = Operaciones.Oper_codi INNER JOIN
Obreros ON Tickets.Obre_codi = Obreros.Obre_codi INNER JOIN
BdComun..Color ON Tickets.Colo_codi = BdComun..Color.colo_codi INNER JOIN
BdComun..Tallas ON Tickets.Tall_codi = BdComun..Tallas.tall_codi ON Maquinas.Cenc_codi = Operaciones.Cenc_codi AND
Maquinas.Maqu_codi = Operaciones.Maqu_codi INNER JOIN
Lineas ON Tickets.Line_codi = Lineas.Line_codi AND Tickets.Cenc_codi = Lineas.Cenc_codi INNER JOIN
Estudios ON Tickets.Cenc_codi = Estudios.Cenc_codi AND Tickets.Bloq_codi = Estudios.Bloq_codi AND
Tickets.Fami_codi = Estudios.Fami_codi AND Tickets.Oper_codi = Estudios.Oper_codi AND
Tickets.Estu_codi = Estudios.Estu_codi Inner join FechasMinLab on FechasMinLab.Fech_Fecha = Tickets.tick_fech WHERE (Tickets.Tick_Elim = 0) and Fech_Year=2005 and Fech_Week= 1

Podrías mandar los create tabla y create index de las 9 tablas y el plan de ejecución del query? Cuantos registros tiene Tickets?
Cuantos registros devuelve la consulta con el where que mostraste?
Cuanto tarda?
Gracias
Es buena la idea de Maldon, pero tengamos en cuenta que el SO es XP y el SQL Personal.
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.

CREATE TABLE [dbo].[Bloques] (
[Cenc_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Bloq_codi] [int] NOT NULL ,
[Bloq_Desc] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Bloq_UserCrea] [int] NOT NULL ,
[Bloq_FechCrea] [datetime] NOT NULL ,
[Bloq_UserModi] [int] NOT NULL ,
[Bloq_FechModi] [datetime] NOT NULL
) ON [PRIMARY]
GO CREATE TABLE [dbo].[CenCos] (
[Cenc_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Cenc_desc] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Cenc_UserCrea] [int] NOT NULL ,
[Cenc_FechCrea] [datetime] NOT NULL ,
[Cenc_UserModi] [int] NOT NULL ,
[Cenc_FechModi] [datetime] NOT NULL ,
[Here_Plani] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [MASTER] TEXTIMAGE_ON [MASTER]
GO CREATE TABLE [dbo].[Estudios] (
[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 ,
[Mate_Cost] [varchar] (20) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Long_Cost] [numeric](18, 2) NOT NULL ,
[Punt_Pulg] [numeric](18, 0) NOT NULL ,
[TStd] [numeric](20, 6) NOT NULL ,
[Estu_desc] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Estu_UserCrea] [int] NOT NULL ,
[Estu_FechCrea] [datetime] NOT NULL ,
[Estu_UserModi] [int] NOT NULL ,
[Estu_FechModi] [datetime] NOT NULL
) ON [PRIMARY]
GO CREATE TABLE [dbo].[Familias] (
[Cenc_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Bloq_codi] [int] NOT NULL ,
[Fami_codi] [int] NOT NULL ,
[Fami_Desc] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Fami_UserCrea] [int] NOT NULL ,
[Fami_FechCrea] [datetime] NOT NULL ,
[Fami_UserModi] [int] NOT NULL ,
[Fami_FechModi] [datetime] NOT NULL
) ON [PRIMARY]
GO CREATE TABLE [dbo].[Lineas] (
[Cenc_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Line_codi] [int] NOT NULL ,
[Line_Desc] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Line_TipoCodi] [int] NOT NULL ,
[Line_UserCrea] [int] NOT NULL ,
[Line_FechCrea] [datetime] NOT NULL ,
[Line_UserModi] [int] NOT NULL ,
[Line_FechModi] [datetime] NOT NULL
) ON [PRIMARY]
GO CREATE TABLE [dbo].[Maquinas] (
[Cenc_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Maqu_codi] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Maqu_Desc] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Maqu_UserCrea] [int] NOT NULL ,
[Maqu_FechCrea] [datetime] NOT NULL ,
[Maqu_UserModi] [int] NOT NULL ,
[Maqu_FechModi] [datetime] NOT NULL ,
[Maqu_Cant] [numeric](20, 0) NOT NULL ,
[Maqu_Tipo] [int] NOT NULL
) ON [PRIMARY]
GO CREATE TABLE [dbo].[MaquinasTipo] (
[Maqu_Tipo] [int] NOT NULL ,
[Maqu_TipoDesc] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO CREATE TABLE [dbo].[Obreros] (
[Obre_codi] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Obre_CodiAlte] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Obre_ApelPate] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Obre_ApelMate] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Obre_Nombres] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Obre_Sexo] [int] NOT NULL ,
[CargObre_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[CateObre_codi] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Obre_FIng] [datetime] NOT NULL ,
[Obre_JornBasi] [numeric](20, 6) NOT NULL ,
[EficTipo_codi] [int] NOT NULL ,
[Obre_Estado] [int] NOT NULL ,
[Obre_UserCrea] [int] NOT NULL ,
[Obre_FechCrea] [datetime] NOT NULL ,
[Obre_UserModi] [int] NOT NULL ,
[Obre_FechModi] [datetime] NOT NULL ,
[Obre_Tipo] [int] NOT NULL ,
[Obre_Temp] [int] NOT NULL ,
[Cenc_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NULL ,
[Line_codi] [int] NULL ,
[Obre_Emple] [int] NOT NULL
) ON [PRIMARY]
GO CREATE TABLE [dbo].[Operaciones] (
[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 ,
[Cate_codi] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Maqu_codi] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Acce_codi] [int] NOT NULL ,
[Oper_Desc] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Oper_UserCrea] [int] NOT NULL ,
[Oper_FechCrea] [datetime] NOT NULL ,
[Oper_UserModi] [int] NOT NULL ,
[Oper_FechModi] [datetime] NOT NULL
) ON [PRIMARY]
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].[Bloques] WITH NOCHECK ADD
CONSTRAINT [PK_Bloques] PRIMARY KEY CLUSTERED
(
[Cenc_codi],
[Bloq_codi]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO ALTER TABLE [dbo].[CenCos] WITH NOCHECK ADD
CONSTRAINT [PK_Cencos] PRIMARY KEY CLUSTERED
(
[Cenc_codi]
) WITH FILLFACTOR = 90 ON [MASTER]
GO ALTER TABLE [dbo].[Estudios] WITH NOCHECK ADD
CONSTRAINT [PK_Estudios] PRIMARY KEY CLUSTERED
(
[Cenc_codi],
[Bloq_codi],
[Fami_codi],
[Oper_codi],
[Estu_codi]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO ALTER TABLE [dbo].[Familias] WITH NOCHECK ADD
CONSTRAINT [PK_Familias] PRIMARY KEY CLUSTERED
(
[Cenc_codi],
[Bloq_codi],
[Fami_codi]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO ALTER TABLE [dbo].[Lineas] WITH NOCHECK ADD
CONSTRAINT [PK_Lineas] PRIMARY KEY CLUSTERED
(
[Cenc_codi],
[Line_codi]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO ALTER TABLE [dbo].[Maquinas] WITH NOCHECK ADD
CONSTRAINT [PK_Maquinas] PRIMARY KEY CLUSTERED
(
[Cenc_codi],
[Maqu_codi]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO ALTER TABLE [dbo].[Obreros] WITH NOCHECK ADD
CONSTRAINT [PK_Obreros] PRIMARY KEY CLUSTERED
(
[Obre_codi]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO ALTER TABLE [dbo].[Operaciones] WITH NOCHECK ADD
CONSTRAINT [PK_Operacion] PRIMARY KEY CLUSTERED
(
[Cenc_codi],
[Bloq_codi],
[Fami_codi],
[Oper_codi]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO ALTER TABLE [dbo].[Tickets] WITH NOCHECK ADD
CONSTRAINT [PK_Tickets] PRIMARY KEY CLUSTERED
(
[Tick_Codi]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO ALTER TABLE [dbo].[CenCos] ADD
CONSTRAINT [DF_CenCos_Here_Plani] DEFAULT (”) FOR [Here_Plani]
GO ALTER TABLE [dbo].[Maquinas] ADD
CONSTRAINT [DF_Maquinas_Maqu_Tipo] DEFAULT (0) FOR [Maqu_Tipo]
GO ALTER TABLE [dbo].[Obreros] ADD
CONSTRAINT [DF_Obreros_Obre_Emple] DEFAULT (0) FOR [Obre_Emple]
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], [Surt_codi], [Prendes_codi], [Colo_codi], [Tall_codi]) WITH FILLFACTOR = 90 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 ALTER TABLE [dbo].[Bloques] ADD
CONSTRAINT [FK_Bloques_CenCos] FOREIGN KEY
(
[Cenc_codi]
) REFERENCES [dbo].[CenCos] (
[Cenc_codi]
) ON UPDATE CASCADE
GO ALTER TABLE [dbo].[Estudios] ADD
CONSTRAINT [FK_Estudios_Operaciones] FOREIGN KEY
(
[Cenc_codi],
[Bloq_codi],
[Fami_codi],
[Oper_codi]
) REFERENCES [dbo].[Operaciones] (
[Cenc_codi],
[Bloq_codi],
[Fami_codi],
[Oper_codi]
) ON UPDATE CASCADE
GO ALTER TABLE [dbo].[Familias] ADD
CONSTRAINT [FK_Familias_Bloques] FOREIGN KEY
(
[Cenc_codi],
[Bloq_codi]
) REFERENCES [dbo].[Bloques] (
[Cenc_codi],
[Bloq_codi]
) ON UPDATE CASCADE
GO ALTER TABLE [dbo].[Maquinas] ADD
CONSTRAINT [FK_Maquinas_CenCos] FOREIGN KEY
(
[Cenc_codi]
) REFERENCES [dbo].[CenCos] (
[Cenc_codi]
) ON UPDATE CASCADE
GO ALTER TABLE [dbo].[Operaciones] ADD
CONSTRAINT [FK_Operaciones_Categorias] FOREIGN KEY
(
[Cate_codi]
) REFERENCES [dbo].[Categorias] (
[Cate_codi]
) ON UPDATE CASCADE ,
CONSTRAINT [FK_Operaciones_Familias] FOREIGN KEY
(
[Cenc_codi],
[Bloq_codi],
[Fami_codi]
) REFERENCES [dbo].[Familias] (
[Cenc_codi],
[Bloq_codi],
[Fami_codi]
) ON UPDATE CASCADE ,
CONSTRAINT [FK_Operaciones_Maquinas] FOREIGN KEY
(
[Cenc_codi],
[Maqu_codi]
) REFERENCES [dbo].[Maquinas] (
[Cenc_codi],
[Maqu_codi]
)
GO
Tengo 1459060 registros en tickets
La consula retorna 95443
Demoraba 4 min 30, pero haciendo una restructuracion en parte del codigo que no creo que haya cambiado en algo, ahora se esta demorando 12 segundos, a que se pudo deber, a que el servidor estaba muy ocupado para poder atenderme, si es asi que puedo hacer, mi problema radica que el servidor no es uno dedicado, lo usa una chica con sus hojas de calculo y 2 sistemas (contable (no es mio, maneja rdo) y almacenes (propio, manejo ado)). Ya he implementado el mantenimiento de indices y estadisticas todos los dias a la 8, tendria que desabilitar las opciones de actualizar estadisticas automaticamente?, y el creaar estadisticas automaticamente, lo tengo activo siempre?, y como reduzco mi base de datos, ah y cuando, antes o despues de reestructurar los indices, mi base de datos bajo mucho, pero la curiosidad que tengo es que la base de datos presenta tamaño 1174.19 y espacion disponible 0, le aumento fisicamente el tamaño y el disponible sigue siendo 0, a menos que lo haga crecer a 1400 para poder tener algo de 50 megas libres, orientenme como deberia tener configurado el sql para mejorar la performance en general, gracias, abajo muestro el store que se ejecuta diariamente a la 8 pm desde un trabajo de sql, ah, me c_maldon, gracias por tu ayuda con la actualizacion de un codigo en todas las tablas, cree el store que haga eso, cosa que si cambio un codigo, tengo una tabla donde almaceno el codigo anterior y el nuevo, luego activo el trabajo y le dejo todo el trabajo a sql, el chiste es que antes que lo haga, habia un cambio de codigos a gran escala, ahora lo implemente y coincidencia cesaron los cambios de codigo, lo se porque el trabajo aun no ha sido convocado por nadie, pero estoy seguro funcionara, gracias a ambos por su ayuda. SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO CREATE Procedure Sp_ReindexarBd @BaseDatos varchar(200) as exec(‘use ‘ + @BaseDatos ) –USE DatabaseName –Enter the name of the database you want to reindex DECLARE @TableName varchar(255) DECLARE TableCursor CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_type = ‘base table’ OPEN TableCursor FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
–if @TableName <> ‘Tickets’
–begin
PRINT ‘Reindexing ‘ + @TableName
DBCC DBREINDEX(@TableName,’ ‘,90)
exec(‘update statistics ‘ + @TableName + ‘ with fullscan’)
–end
FETCH NEXT FROM TableCursor INTO @TableName
END CLOSE TableCursor DEALLOCATE TableCursor
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
No están las tablas FechasMinLab, Tallas ni Color. Tambien podrías mandar el plan de ejecución? Para hacerlo ingresá al Query Analyzer y ejecutá: SET SHOWPLAN_TEXT ON
Go
Ejecutá el procedure o query para que muestre el
plan.
No verás la salida del query, en lugar de eso verás el plan de ejecución de SQL Server
Go
SET SHOWPLAN_TEXT OFF
Go Igualmente 12 segundos parece un tiempo razonable para tu contexto.
Para realizar mediciones de tiempo parejas tenes que tener en cuenta que la cache de SQL Server mantiene los datos en memoria RAM y si ejecutás la consulta dos veces la segunda seguro seá mas rapida.
Para limpiar la cache podés usar:
(en ambientes de desarrollo) CHECKPOINT
go
DBCC DROPCLEANBUFFERS y luego ejecutar por segunda vez tu query, si no hay incidencias de otros usuarios te tardará lo mismo que la primera ejecución. Tratá de medir el query después de la hora en que los otros usuarios comparten el servidor. Por otro lado, si podés, evitá usar cursores.

CREATE TABLE [dbo].[Color] (<br />[colo_codi] [char] (4) COLLATE Modern_Spanish_CI_AS NOT NULL ,<br />[colo_desc] [varchar] (70) COLLATE Modern_Spanish_CI_AS NOT NULL ,<br />[colo_abre] [varchar] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,<br />[colo_rgb] [bigint] NULL <br />) ON [PRIMARY]<br />GO<br /><br />CREATE TABLE [dbo].[Tallas] (<br />[tall_codi] [char] (3) COLLATE Modern_Spanish_CI_AS NOT NULL ,<br />[tall_desc] [varchar] (20) COLLATE Modern_Spanish_CI_AS NOT NULL <br />) ON [PRIMARY]<br />GO<br /><br />ALTER TABLE [dbo].[Color] WITH NOCHECK ADD <br />CONSTRAINT [PK_Color] PRIMARY KEY CLUSTERED <br />(<br />[colo_codi]<br />) WITH FILLFACTOR = 90 ON [PRIMARY] <br />GO<br /><br />ALTER TABLE [dbo].[Tallas] WITH NOCHECK ADD <br />CONSTRAINT [PK_Tallas] PRIMARY KEY CLUSTERED <br />(<br />[tall_codi]<br />) WITH FILLFACTOR = 90 ON [PRIMARY] <br />GO<br /><br />ALTER TABLE [dbo].[Color] ADD <br />CONSTRAINT [IX_Color] UNIQUE NONCLUSTERED <br />(<br />[colo_desc]<br />) WITH FILLFACTOR = 90 ON [PRIMARY] <br />GO<br /><br />ALTER TABLE [dbo].[Tallas] ADD <br />CONSTRAINT [IX_Tallas] UNIQUE NONCLUSTERED <br />(<br />[tall_desc]<br />) WITH FILLFACTOR = 90 ON [PRIMARY] <br />GO<br /><br /><br />CREATE TABLE [dbo].[FechasMinLab] (<br />[Fech_Year] [numeric](4, 0) NOT NULL ,<br />[Fech_Month] [numeric](2, 0) NOT NULL ,<br />[Fech_Week] [numeric](2, 0) NOT NULL ,<br />[Fech_Fecha] [datetime] NOT NULL ,<br />[Fech_MinLab] [numeric](20, 0) NOT NULL ,<br />[Fech_DomFeri] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL ,<br />[Fech_UserCrea] [int] NOT NULL ,<br />[Fech_FechCrea] [datetime] NOT NULL ,<br />[Fech_UserModi] [int] NOT NULL ,<br />[Fech_FechModi] [datetime] NOT NULL ,<br />[Fech_Day] [int] NOT NULL ,<br />[Fech_Proc] [int] NOT NULL ,<br />[Fech_Cerr] [int] NOT NULL ,<br />[Fech_weekProd] [numeric](2, 0) NOT NULL ,<br />[Fech_MonthProd] [numeric](2, 0) NOT NULL ,<br />[Fech_YearProd] [numeric](4, 0) NOT NULL <br />) ON [PRIMARY]<br />GO<br /><br />ALTER TABLE [dbo].[FechasMinLab] WITH NOCHECK ADD <br />CONSTRAINT [PK_FechasMinLab] PRIMARY KEY CLUSTERED <br />(<br />[Fech_Fecha]<br />) WITH FILLFACTOR = 90 ON [PRIMARY] <br />GO<br /><br />ALTER TABLE [dbo].[FechasMinLab] ADD <br />CONSTRAINT [DF_FechasMinLab_Fech_DomFeri] DEFAULT (‘N’) FOR [Fech_DomFeri],<br />CONSTRAINT [DF_FechasMinLab_Fech_NDia] DEFAULT (0) FOR [Fech_Day],<br />CONSTRAINT [DF_FechasMinLab_Fech_weekProd] DEFAULT (0) FOR [Fech_weekProd],<br />CONSTRAINT [DF_FechasMinLab_Fech_MonthProd] DEFAULT (0) FOR [Fech_MonthProd],<br />CONSTRAINT [DF_FechasMinLab_Fech_YearProd] DEFAULT (0) FOR [Fech_YearProd]<br />GO<br /><br /><br />Sorry la tabla de color y tallas estan en otra base de datos, sino que preferi separa la informacion porque sino creceria mucho todo en una Bd y para reorganizarla seria un problema.<br /><br />El plan de ejecucion es el siguiente<br /><br /><br />SET SHOWPLAN_TEXT ON<br /><br /><br />Sp_TicketsEmitidos 3, 2004, 12, 47, ’18/01/05′, ’19/01/05′, 0, 0, 0, ”’04-000625”’, 0, ”’04-004553”’, 0, ”’300”’, 0, 0, ”’008000”’, 0, ”’233112”’, 0, ”’410”’, 0, ”’2”’, 0, ”’1”'<br /> CREATE procedure Sp_TicketsEmitidos @Periodo int, @Fech_Year varchar(20), @Fech_Month varchar(20), @Fech_Week varchar(20), @FInicial varchar(20), @FFin varchar(20), @Lectu_Id varchar(20), @Nivel int, @OpcOt int, @ValorOt varchar(200), @OpcOc int, <br /><br /><br /><br /> |–Table Scan(OBJECT<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[BdProduccion].[dbo].[ConforCodiOperacion]))<br /><br /><br /><br /> if @Periodo = ‘0’<br /> begin select @CamposPeriodo = ””’ as Fech_Year, ”” as Fech_Month, ”” as Fech_Week, Tick_Fech, Lectu_Id ‘<br /> end if @Periodo = ‘1’<br /> begin select @CamposPeriodo = ””’ as Fech_Year, ”” as Fech_Month, ”” as Fech_Week, Tick_Fech, ”” AS Lectu_Id ‘<br /> end if @Periodo = ‘2’<br /> begin select @CamposPeriodo = ‘Fech_Year, ”” as Fech_Month, Fech_Week , Tick_Fech, ”” AS Lectu_Id ‘<br /> end if @Periodo = ‘3’<br /> begin select @CamposPeriodo = ‘Fech_Year, Fech_Month, ”” as Fech_Week, Tick_Fech, ”” AS Lectu_Id ‘<br /> end select @Sql = ‘Select ‘ + @CamposPeriodo + ‘, right(replicate(”0”,’ + cast(@LongCencos as varchar(20)) + ‘) + ltrim(rtrim(Tickets.Cenc_codi)),’ + cast(@LongCencos as varchar(20)) + ‘) + right(replicate(”0”,’ + cast(@LongBloque as varcha<br /> declare @Where varchar(8000), @Inner varchar(8000) if @Periodo = ‘0’<br /> begin select @Where = ‘ and tick_fech = ”’ + @FInicial + ””<br /> if @Lectu_Id &lt;&gt; 0<br /> select @Where = @where + ‘ and Lectu_Id = ‘ + @Lectu_Id<br /> select @Inner = ”<br /> end if @Periodo = ‘1’<br /> begin select @where = ‘ and Tick_Fech between ”’ + @FInicial + ”’ and ”’ + @FFin + ”” — select @CamposPeriodo = ””’ as Fech_Year, ”” as Fech_Week, Tick_Fech, ”” AS Lectu_Id ‘<br /> select @Inner = ”<br /> end if @Periodo = ‘2’<br /> begin select @Where = ‘ and Fech_Year=’ + @Fech_Year + ‘ and Fech_Week= ‘ + @Fech_Week — select @CamposPeriodo = ‘and Fech_Year, Fech_Week , Tick_Fech, ”” AS Lectu_Id ‘<br /> select @Inner = ‘ Inner join FechasMinLab on FechasMinLab.Fech_Fecha = Tickets.tick_fech ‘<br /> end if @Periodo = ‘3’<br /> begin select @Where = ‘ and Year(tick_fech) = ‘ + @Fech_Year + ‘ and month(tick_fech) = ‘ + @Fech_Month<br /> select @Inner = ‘ Inner join FechasMinLab on FechasMinLab.Fech_Fecha = Tickets.tick_fech ‘ — select @CamposPeriodo = ‘Fech_Year, Fech_Month, Fech_Week , Tick_Fech, ”” AS Lectu_Id ‘<br /> end if @Lineas &lt;&gt; ‘0’ and @Lineas&lt;&gt;”<br /> begin select @where = @where + ‘ and Tickets.Line_codi =’ + cast(@Lineas as varchar(20))<br /> end declare @WhereOt varchar(200), @WhereOc varchar(200), @WhereCencos varchar(200), @WhereObrero varchar(200), @WhereEstilo varchar(200), @WhereBloque varchar(200), @WhereFamilia varchar(200), @WhereOperacion varchar(200) exec dbo.sp_ParametrosR<br /> CREATE PROC sp_ParametrosReporte1 @ColumCodi varchar(100), @ColumDesc Varchar(100), @Opcion int, @Valor Varchar(8000), @Where Varchar(8000) output as select @Where=’ ‘<br /> declare @Val1 varchar(5000),@Val2 varchar(5000) if @Opcion = 1<br /> select @where =’ and ‘ + @ColumCodi + ‘ in (‘+ @Valor +’)'<br /> if @Opcion=2<br /> begin select @Val1 = left(ltrim(@Valor),patindex(‘%,%’,@Valor)-1)<br /> select @Val2 = right(ltrim(@Valor),len(@Valor)-patindex(‘%,%’,@Valor))<br /> select @where= ‘ and ‘ + @Columdesc + ‘ between ”’+ @Val1 +”’ and ”’ + @Val2 + ””<br /> exec dbo.sp_ParametrosReporte1 ‘Tickets.OrdCort_codi’, ‘Tickets.OrdCort_codi’, @OpcOc, @ValorOc ,@WhereOc output<br /> CREATE PROC sp_ParametrosReporte1 @ColumCodi varchar(100), @ColumDesc Varchar(100), @Opcion int, @Valor Varchar(8000), @Where Varchar(8000) output as select @Where=’ ‘<br /> declare @Val1 varchar(5000),@Val2 varchar(5000) if @Opcion = 1<br /> select @where =’ and ‘ + @ColumCodi + ‘ in (‘+ @Valor +’)'<br /> if @Opcion=2<br /> begin select @Val 1 = left(ltrim(@Valor),patindex(‘%,%’,@Valor)-1)<br /> select @Val2 = right(ltrim(@Valor),len(@Valor)-patindex(‘%,%’,@Valor))<br /> select @where= ‘ and ‘ + @Columdesc + ‘ between ”’+ @Val1 +”’ and ”’ + @Val2 + ””<br /> exec dbo.sp_ParametrosReporte1 ‘Tickets.Cenc_codi’, ‘Cencos.Cenc_desc’, @OpcCencos, @ValorCencos ,@WhereCencos output<br /> CREATE PROC sp_ParametrosReporte1 @ColumCodi varchar(100), @ColumDesc Varchar(100), @Opcion int, @Valor Varchar(8000), @Where Varchar(8000) output as select @Where=’ ‘<br /> declare @Val1 varchar(5000),@Val2 varchar(5000) if @Opcion = 1<br /> select @where =’ and ‘ + @ColumCodi + ‘ in (‘+ @Valor +’)'<br /> if @Opcion=2<br /> begin select @Val1 = left(ltrim(@Valor),patindex(‘%,%’,@Valor)-1)<br /> select @Val2 = right(ltrim(@Valor),len(@Valor)-patindex(‘%,%’,@Valor))<br /> select @where= ‘ and ‘ + @Columdesc + ‘ between ”’+ @Val1 +”’ and ”’ + @Val2 + ””<br /> exec dbo.sp_ParametrosReporte1 ‘Tickets.Obre_codi’, ‘Obreros.Obre_ApelPate + Obreros.Obre_ApelMate + ” – ”+ Obreros.Obre_Nombres ‘, @OpcObrero, @ValorObrero ,@WhereObrero output<br /> CREATE PROC sp_ParametrosReporte1 @ColumCodi varchar(100), @ColumDesc Varchar(100), @Opcion int, @Valor Varchar(8000), @Where Varchar(8000) output as select @Where=’ ‘<br /> declare @Val1 varchar(5000),@Val2 varchar(5000) if @Opcion = 1<br /> select @where =’ and ‘ + @ColumCodi + ‘ in (‘+ @Valor +’)'<br /> if @Opcion=2<br /> begin select @Val1 = left(ltrim(@Valor),patindex(‘%,%’,@Valor)-1)<br /> select @Val2 = right(ltrim(@Valor),len(@Valor)-patindex(‘%,%’,@Valor))<br /> select @where= ‘ and ‘ + @Columdesc + ‘ between ”’+ @Val1 +”’ and ”’ + @Val2 + ””<br /> exec dbo.sp_ParametrosReporte1 ‘Tickets.esti_codi’, ‘Estilos.Esti_desc’, @OpcEstilo, @ValorEstilo ,@WhereEstilo output<br /> CREATE PROC sp_ParametrosReporte1 @ColumCodi varchar(100), @ColumDesc Varchar(100), @Opcion int, @Valor Varchar(8000), @Where Varchar(8000) output as select @Where=’ ‘<br /> declare @Val1 varchar(5000),@Val2 varchar(5000) if @Opcion = 1<br /> select @where =’ and ‘ + @ColumCodi + ‘ in (‘+ @Valor +’)'<br /> if @Opcion=2<br /> begin select @Val1 = left(ltrim(@Valor),patindex(‘%,%’,@Valor)-1)<br /> select @Val2 = right(ltrim(@Valor),len(@Valor)-patindex(‘%,%’,@Valor))<br /> select @where= ‘ and ‘ + @Columdesc + ‘ between ”’+ @Val1 +”’ and ”’ + @Val2 + ””<br /> exec dbo.sp_ParametrosReporte1 ‘Tickets.Bloq_codi’, ‘Bloques.Bloq_desc’, @OpcBloque, @ValorBloque ,@WhereBloque output<br /> CREATE PROC sp_ParametrosReporte1 @ColumCodi varchar(100), @ColumDesc Varchar(100), @Opcion int, @Valor Varchar(8000), @Where Varchar(8000) output as select @Where=’ ‘<br /> declare @Val1 varchar(5000),@Val2 varchar(5000) if @Opcion = 1<br /> select @where =’ and ‘ + @ColumCodi + ‘ in (‘+ @Valor +’)'<br /> if @Opcion=2<br /> begin select @Val1 = left(ltrim(@Valor),patindex(‘%,%’,@Valor)-1)<br /> select @Val2 = right(ltrim(@Valor),len(@Valor)-patindex(‘%,%’,@Valor))<br /> select @where= ‘ and ‘ + @Columdesc + ‘ between ”’+ @Val1 +”’ and ”’ + @Val2 + ””<br /> exec dbo.sp_ParametrosReporte1 ‘Tickets.Fami_codi’, ‘Familias.Fami_desc’, @OpcFamilia, @ValorFamilia ,@WhereFamilia output<br /> CREATE PROC sp_ParametrosReporte1 @ColumCodi varchar(100), @ColumDesc Varchar(100), @Opcion int, @Valor Varchar(8000), @Where Varchar(8000) output as select @Where=’ ‘<br /> declare @Val1 varchar(5000),@Val2 varchar(5000) if @Opcion = 1<br /> select @where =’ and ‘ + @ColumCodi + ‘ in (‘+ @Valor +’)'<br /> if @Opcion=2<br /> begin select @Val1 = left(ltrim(@Valor),patindex(‘%,%’,@Valor)-1)<br /> select @Val2 = right(ltrim(@Valor),len(@Valor)-patindex(‘%,%’,@Valor))<br /> select @where= ‘ and ‘ + @Columdesc + ‘ between ”’+ @Val1 +”’ and ”’ + @Val2 + ””<br /> exec dbo.sp_ParametrosReporte1 ‘Tickets.Oper_codi’, ‘Operaciones.Oper_desc’, @OpcOperacion, @ValorOperacion ,@WhereOperacion output [email protected] int, @ValorOc varchar(200), [email protected] int, @ValorCencos varchar(200), [email protected]<br /> CREATE PROC sp_ParametrosReporte1 @ColumCodi varchar(100), @ColumDesc Varchar(100), @Opcion int, @Valor Varchar(8000), @Where Varchar(8000) output as select @Where=’ ‘<br /> declare @Val1 varchar(5000),@Val2 varchar(5000) if @Opcion = 1<br /> select @where =’ and ‘ + @ColumCodi + ‘ in (‘+ @Valor +’)'<br /> if @Opcion=2<br /> begin select @Val1 = left(ltrim(@Valor),patindex(‘%,%’,@Valor)-1)<br /> select @Val2 = right(ltrim(@Valor),len(@Valor)-patindex(‘%,%’,@Valor))<br /> select @where= ‘ and ‘ + @Columdesc + ‘ between ”’+ @Val1 +”’ and ”’ + @Val2 + ””<br /> select @Where = ‘WHERE (Tickets.Tick_Elim = 0) ‘ + @where + @WhereOt + @WhereOc + @WhereCencos + @WhereObrero + @WhereEstilo + @WhereBloque + @WhereFamilia + @WhereOperacion<br /> select @Sql = @Sql + @Inner + @Where + @WhereOt + @WhereOc + @WhereCencos + @WhereObrero + @WhereEstilo + @WhereBloque + @WhereFamilia + @WhereOperacion <br /> exec(@Sql) <br />
No te quedó bien el plan de ejecución.<br /><br />Pero fijate si ves algo como el que yo te mando:<br /><br />StmtText————————————————<br />|–Nested Loops(Inner Join, OUTER REFERENCES<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[Maquinas]<br />|–Nested Loops(Inner Join, OUTER REFERENCES<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[Operacion<br />|—-|–Nested Loops(Inner Join, OUTER REFERENCES<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[Estu<br />|—-|—-|–Nested Loops(Inner Join, OUTER REFERENCES<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ /><br />|—-|—-|—-|–Nested Loops(Inner Join, OUTER REFEREN<br />|—-|—-|—-|—-|–Nested Loops(Inner Join, OUTER RE<br />|—-|—-|—-|—-|—-|–Nested Loops(Inner Join, OUT<br />|—-|—-|—-|—-|—-|—-|–Nested Loops(Inner Join<br />|—-|—-|—-|—-|—-|—-|—-|–Nested Loops(Inner<br />|—-|—-|—-|—-|—-|—-|—-|—-|-Clust Ind Scan<br />|—-|—-|—-|—-|—-|—-|—-|—-|-Clust Ind Seek<br />|—-|—-|—-|—-|—-|—-|—-|–Clustered Index Se<br />|—-|—-|—-|—-|—-|—-|–Clustered Index Seek(OB<br />|—-|—-|—-|—-|—-|–Clustered Index Seek(OBJECT:<br />|—-|—-|—-|—-|–Clustered Index Seek(OBJECT<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[db]<br />|—-|—-|—-|–Clustered Index Seek(OBJECT<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[db].[dbo<br />|—-|—-|–Clustered Index Seek(OBJECT<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[db].[dbo].[Op<br />|—-|–Clustered Index Seek(OBJECT<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[db].[dbo].[Maquina<br />|–Clustered Index Seek(OBJECT<img src=’/community/emoticons/emotion-6.gif’ alt=’:(‘ />[db].[dbo].[MaquinasTipo<br /><br />En el plan se puede ver que esta entrando por todas las tablas por su indice agrupado, que coincide con la clave primaria de la tabla.<br />No encontré indice ni PK para la tabla [MaquinasTipo] pero me imagino que existe.<br /><br />Fijate si tu plan de ejecución es igual al que yo veo.<br /><br />Como vos armás el código al vuelo no podés estar seguro que estará optimizado para todas sus variantes a menos que las pruebes una a una<br /><br />
No encontrar ese resultado, MaquinasTipo no tiene indice porque solo es una tabla de 2 registros, que es 0 Maquina 1 Manual, no creo que aumente registros, son valores ya establecidos, es mas los podria quitar del select como hice en una prueba pero no se nota la diferencia, es para que en el reporte ilustre el tipo de maquina empleada. El plan que tengo es tal como te mande, tengo sql2000 personal a menos que sea eso, en la ayuda no me muestra algo similar a lo que me dices.
Si querés ver el plan en forma gráfica
pintá el query y presiona <Ctrl><L> Yo estoy ejecutando lo que mandaste en el primer post,
estamos haciendo lo mismo? Select Fech_Year, ” as Fech_Month, Fech_Week , Tick_Fech, ” AS Lectu_Id , Tickets.OrdCort_codi, Tickets.Esti_codi, BdComun..Color.colo_desc, BdComun..Tallas.tall_desc,
Tickets.Paqu_codi, Tickets.Cant_Paqu, Tickets.Tick_Codi, Tickets.Cenc_codi, Tickets.Bloq_codi, Tickets.Fami_codi,
Tickets.Oper_codi, Operaciones.Oper_Desc, Tickets.Estu_codi, Tickets.Tick_Tstd, Tickets.Line_codi, Tickets.Obre_codi,
Obreros.Obre_CodiAlte, Obreros.Obre_ApelPate, Obreros.Obre_ApelMate, Obreros.Obre_Nombres, Tickets.Tick_Fech,
Tickets.Lectu_Id, Tickets.Tick_Elim, Maquinas.Maqu_Desc, MaquinasTipo.Maqu_TipoDesc, Lineas.Line_Desc,
Estudios.TStd, Tickets.Tick_Cerr
FROM MaquinasTipo INNER JOIN
Maquinas ON MaquinasTipo.Maqu_Tipo = Maquinas.Maqu_Tipo INNER JOIN
Tickets INNER JOIN
Operaciones ON Tickets.Cenc_codi = Operaciones.Cenc_codi AND Tickets.Bloq_codi = Operaciones.Bloq_codi AND
Tickets.Fami_codi = Operaciones.Fami_codi AND Tickets.Oper_codi = Operaciones.Oper_codi INNER JOIN
Obreros ON Tickets.Obre_codi = Obreros.Obre_codi INNER JOIN
BdComun..Color ON Tickets.Colo_codi = BdComun..Color.colo_codi INNER JOIN
BdComun..Tallas ON Tickets.Tall_codi = BdComun..Tallas.tall_codi ON Maquinas.Cenc_codi = Operaciones.Cenc_codi AND
Maquinas.Maqu_codi = Operaciones.Maqu_codi INNER JOIN
Lineas ON Tickets.Line_codi = Lineas.Line_codi AND Tickets.Cenc_codi = Lineas.Cenc_codi INNER JOIN
Estudios ON Tickets.Cenc_codi = Estudios.Cenc_codi AND Tickets.Bloq_codi = Estudios.Bloq_codi AND
Tickets.Fami_codi = Estudios.Fami_codi AND Tickets.Oper_codi = Estudios.Oper_codi AND
Tickets.Estu_codi = Estudios.Estu_codi Inner join FechasMinLab on FechasMinLab.Fech_Fecha = Tickets.tick_fech WHERE (Tickets.Tick_Elim = 0) and Fech_Year=2005 and Fech_Week= 1
Si es lo mismo, si puedo ver el plan de ejecucion, pensaba enviarlo pero la chica se llevo el scanner y lo estan usando al maximo en diseño, en cuanto pueda te envio el archivo, pero segun lo que veo, no cuesta casi nada las consultas, eso significaria que esta optimizada la consulta?
Ojala fuera tan facil, en este sitio hay muy buenos artículos de optimización
por ejemplo:
http://sql-server-performance.com/query_execution_plan_analysis.asp Lo basico es ver si se está realizando un "Table Scan" cuando había posibilidades de utilizar un índice. Un punto es que vos construis una instrucción SQL en una variable y despues la ejecutás con exec(). Los queries que terminan armándose en la variable tienen distinto plan de ejecución dependiendo de lo que el usuario quiera buscar. Por lo tanto te podes encontrar que si busca de una forma la respuesta es rápida y si busca de otra sea lenta, por eso te decia que tenés que optimizar cada variante por separado. Por ejemplo: cuando el usuario busca una fecha en particular, vos pones en la variable tick_fech = @FInicial y la consulta utilizará el indice Tickets.[IX_Tickets_3]
que tiene indexado el campo (tick_fech) pero cuando el usuario pide por año,/mes usas: Year(tick_fech) = @Fech_Year and month(tick_fech) = @Fech_Month y la consulta no puede utilizar más el indice. Por esto te digo que tenes que probar cada combinación para saber si todo te quedó optimizado. Saludos

Que problema tendria si genero mas indices a las tablas?, la insercion a estoy es mas lenta, rapida o no se afecta?, ah, eso si, en el procedimiento de kardex que tengo, el bucle demora 3 segundos en hacer todo, pero si activo los comandos update e insert, demora mas de 6 minutos, por eso, no se si creando mas indices aceleraria el trabajo o lo pondria mas lento, o que tan beneficioso es crear indices antes de hacer la consulta y eliminarlos luego, es mas optimo o estoy dificultandome las labores?. Gracias
No te recomiendo la opción de crear indices para consultas y eliminarlos luego de realizarlas. La utilidad de los índices es encontrar los registros con mayor efectividad, antes de crear nuevos índices tenes que asegurarte de que los índices que ya tenes creados no te sirven.
Hay que verificar que los esté utilizando el analizador de consultas..
Muchas veces tenés el indice adecuado pero por la forma en que está escrito el query no lo utiliza. Generalmente cuando haces UPDATE buscás por la clave primaria y actualizas recistros no clave, por lo que se disminuye el impacto de actualizar los indices ya que el indice de la clave primaria no cambia, en INSERT o DELETE los indices se debe actualizar todos por eso es más pesado. Cono te indicó Luis el balance es lo mas importante.
Cuando haces UPDATE también hay un plan de ejecución y tenés que analizarlo para ver si estás llegando de la forma más rápida a los registros que querés actualizar. Otras alternativas que podés probar, para consultas, es usar tablas temporarias (de las que creas con un #). En lugar de realizar un Mega Query, haces varios queries intermedios que los trabajas en tablas temporarias. En algunos casos funciona mejor.

Ok, pero si creo una tabla temporal, y para hacer un bucle en el store, genero un cursor para hacerle fetch next, como puedo hacerlo hacia una tabla? para evitar el cursor.
Te doy un ejemplo, no es la unica forma pero es efectiva: Set nocount on
Declare @nRow int
Declare @nRowMax int
Declare @cType char(2) if object_id(‘tempdb..#MiTemp’) is not null
Drop Table #MiTemp Create Table #MiTemp
(
nRow Int identity(1,1) Not null,
cType char(2) Null
) Create index nRow on #MiTemp (nRow) Insert #MiTemp (cType)
Select Distinct Type
From SysObjects Select @nRow = min(nRow),
@nRowMax= max(nRow)
From #MiTemp While @nRow <= @nRowMax
Begin [email protected] = cType
From #MiTemp
WherenRow = @nRow Print ‘El registro N°’ + str(@nRow,10) + ‘ contiene ‘ + @cType Set @nRow = @nRow + 1
End Print ‘Fin.’

Ok, gracias, aplicare lo que me indicas y veremos como se comporta el sistema.
]]>