SQL Server Performance

Consulta lenta

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

  1. fjac_pe New Member

    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
  2. c_maldon Member

    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
  3. Luis Martin Moderator

    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.



  4. fjac_pe New Member


    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

  5. c_maldon Member

    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.
  6. fjac_pe New Member

    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 @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.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 --@OpcOc int, @ValorOc varchar(200), --@OpcCencos int, @ValorCencos varchar(200), --@OtValor2<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 />
  7. c_maldon Member

    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 />
  8. fjac_pe New Member

    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.
  9. c_maldon Member

    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



  10. fjac_pe New Member

    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?
  11. c_maldon Member

    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


  12. fjac_pe New Member

    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
  13. c_maldon Member

    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.
  14. fjac_pe New Member

    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.
  15. c_maldon Member

    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

    Select@cType = cType
    From #MiTemp
    WherenRow = @nRow

    Print 'El registro N°' + str(@nRow,10) + ' contiene ' + @cType

    Set @nRow = @nRow + 1
    End

    Print 'Fin.'
  16. fjac_pe New Member

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

Share This Page