Velocidad consulta TOP

09/03/2009 - 17:50 por Ricardo Uribe | Informe spam
Buenos dias gente,

Tengo un problema (para variar), una consulta que
no me daba problemas ahora se demora como 10s
para devolver informacion.

Ejecuto desde el analizador de consultas la estructura
de mi consulta demora 1s, pero cuando la llamo desde su
nombre y poniendo un TOP 50 que es lo hago desde mi
aplicacion, se demora entre 8 y 10s.

La primera vez que ocurrio esto lo solucione, haciendo un
mantenimiento de reorganizar paginas de datos y de indices.

Pero ahora que ha vuelto a suceder no funciona.

Espero me puedan asesorar para entender porque sucede
esto, ya que tambien me daban problemas otras consultas
que tenian que ver con rango de fechas.

Muchas gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
09/03/2009 - 18:13 | Informe spam
Ricardo Uribe,

Creo que no podremos ser de mucha ayuda, si no es que posteas mas
informacion sobre los objetos involucrados en esta consulta.

- Estructura de las tablas, incluyendo restricciones e indices.
- Sentencia "select" a la que te refieres.
- Informacion sobre el Plan de ejecucion (ver set showplan_text / xml en
los BOL).


AMB



"Ricardo Uribe" wrote:

Buenos dias gente,

Tengo un problema (para variar), una consulta que
no me daba problemas ahora se demora como 10s
para devolver informacion.

Ejecuto desde el analizador de consultas la estructura
de mi consulta demora 1s, pero cuando la llamo desde su
nombre y poniendo un TOP 50 que es lo hago desde mi
aplicacion, se demora entre 8 y 10s.

La primera vez que ocurrio esto lo solucione, haciendo un
mantenimiento de reorganizar paginas de datos y de indices.

Pero ahora que ha vuelto a suceder no funciona.

Espero me puedan asesorar para entender porque sucede
esto, ya que tambien me daban problemas otras consultas
que tenian que ver con rango de fechas.

Muchas gracias



Respuesta Responder a este mensaje
#2 Ricardo Uribe
09/03/2009 - 20:25 | Informe spam
Alejandro,

Paso la estructura de las tablas principales que intervienen en la consulta.

CREATE TABLE [dbo].[FichaObra] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[FechaEmision] [smalldatetime] NULL ,
[CodigoEstado] [tinyint] NULL ,
[CodigoCliente] [int] NULL ,
[CodigoResponsable] [smallint] NULL ,
[RazonSocial] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[RazonSocialRUCDNI] [nvarchar] (11) COLLATE Modern_Spanish_CI_AS NULL ,
[RazonSocialDireccion] [nvarchar] (150) COLLATE Modern_Spanish_CI_AS NULL ,
[RazonSocialCodigoDistrito] [smallint] NULL ,
[RazonSocialLocalidad] [nvarchar] (70) COLLATE Modern_Spanish_CI_AS NULL ,
[ObraResponsable] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[ObraDireccion] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[ObraCodigoDistrito] [smallint] NULL ,
[ObraLocalidad] [nvarchar] (150) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoVendedor] [smallint] NULL ,
[MontoInstalacion] [money] NULL ,
[MontoPintura] [money] NULL ,
[MontoAlbañileria] [money] NULL ,
[MontoMercaderia] [money] NULL ,
[AtencionA] [nvarchar] (70) COLLATE Modern_Spanish_CI_AS NULL ,
[SerieNotaCredito] [smallint] NULL ,
[NumeroNotaCredito] [int] NULL ,
[Observaciones] [nvarchar] (500) COLLATE Modern_Spanish_CI_AS NULL ,
[NombreFichaObra] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[MontoNotaCredito] [money] NULL ,
[Adelanto] [tinyint] NULL ,
[ContraEntrega] [tinyint] NULL ,
[Condicion10] [nvarchar] (4000) COLLATE Modern_Spanish_CI_AS NULL ,
[Condicion11] [nvarchar] (4000) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoContacto] [int] NULL ,
[GerenteProyecto] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[SupervisorObra] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[AdministradorProyecto] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT
NULL ,
[InstaladorObra] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[CodigoEstadoLiquidacion] [smallint] NOT NULL ,
[CodSituacion] [smallint] NOT NULL ,
[CodTipoCobranza] [smallint] NOT NULL ,
[CodigoCentroVenta] [smallint] NOT NULL ,
[Comision] [smallint] NOT NULL ,
[EstadoComision] [bit] NOT NULL ,
[CodigoFinalizado] [smallint] NOT NULL ,
[FechaFinalizado] [smalldatetime] NULL ,
[CodigoResponsableFinalizado] [smallint] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaObra] ADD
CONSTRAINT [DF_FichaObra_MontoInstalacion] DEFAULT (0) FOR
[MontoInstalacion],
CONSTRAINT [DF_FichaObra_MontoPintura] DEFAULT (0) FOR [MontoPintura],
CONSTRAINT [DF_FichaObra_MontoAlbañileria] DEFAULT (0) FOR
[MontoAlbañileria],
CONSTRAINT [DF_FichaObra_AtencionA] DEFAULT ('') FOR [AtencionA],
CONSTRAINT [DF_FichaObra_Adelanto] DEFAULT (0) FOR [Adelanto],
CONSTRAINT [DF_FichaObra_ContraEntrega] DEFAULT (0) FOR [ContraEntrega],
CONSTRAINT [DF_FichaObra_GerenteProyecto] DEFAULT ('') FOR
[GerenteProyecto],
CONSTRAINT [DF_FichaObra_SupervisorObra] DEFAULT ('') FOR [SupervisorObra],
CONSTRAINT [DF_FichaObra_AdministradorObra] DEFAULT ('') FOR
[AdministradorProyecto],
CONSTRAINT [DF_FichaObra_InstaladorObra] DEFAULT ('') FOR [InstaladorObra],
CONSTRAINT [DF_FichaObra_CodigoEstadoLiquidacion] DEFAULT (0) FOR
[CodigoEstadoLiquidacion],
CONSTRAINT [DF_FichaObra_CodSituacion] DEFAULT (0) FOR [CodSituacion],
CONSTRAINT [DF_FichaObra_CodTipoCobranza] DEFAULT (0) FOR
[CodTipoCobranza],
CONSTRAINT [DF_FichaObra_CodigoCentroVenta] DEFAULT (0) FOR
[CodigoCentroVenta],
CONSTRAINT [DF_FichaObra_Comision] DEFAULT (0) FOR [Comision],
CONSTRAINT [DF_FichaObra_EstadoComision] DEFAULT (0) FOR [EstadoComision],
CONSTRAINT [DF_FichaObra_CodigoFinalizado] DEFAULT (0) FOR
[CodigoFinalizado],
CONSTRAINT [PK_FichaObra] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaObra] ADD
CONSTRAINT [FK_FichaObra_Clientes] FOREIGN KEY
(
[CodigoCliente]
) REFERENCES [dbo].[Clientes] (
[CodigoCliente]
),
CONSTRAINT [FK_FichaObra_Contactos] FOREIGN KEY
(
[CodigoContacto]
) REFERENCES [dbo].[Contactos] (
[CodigoContacto]
)
GO
CREATE TABLE [dbo].[FichaVenta] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[CodigoCliente] [int] NOT NULL ,
[Persona1] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona2] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona3] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona4] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[EstadoDocumento] [smallint] NULL ,
[DireccionFacturacion] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[Distrito] [smallint] NULL ,
[TipoDocumento] [char] (1) COLLATE Modern_Spanish_CI_AS NULL ,
[Comentario] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoResponsable] [smallint] NULL ,
[Comision] [smallint] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaVenta] ADD
CONSTRAINT [DF_FichaVenta_Distrito] DEFAULT (0) FOR [Distrito],
CONSTRAINT [DF_FichaVenta_Comision] DEFAULT (0) FOR [Comision],
CONSTRAINT [PK_FichaVenta] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaVenta] ADD
CONSTRAINT [FK_FichaVenta_Clientes] FOREIGN KEY
(
[CodigoCliente]
) REFERENCES [dbo].[Clientes] (
[CodigoCliente]
)
GO
CREATE TABLE [dbo].[DetalleFichaVenta] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[Item] [int] NOT NULL ,
[Fecha] [smalldatetime] NOT NULL ,
[PagoCuenta] [decimal](19, 2) NULL ,
[MontoFactura] [decimal](19, 2) NULL ,
[CodigoTipoDocumento] [smallint] NULL ,
[SerieComprobante] [int] NULL ,
[NumeroComprobante] [int] NULL ,
[FechaDocumento] [smalldatetime] NULL ,
[NumeroRecibo] [char] (20) COLLATE Modern_Spanish_CI_AS NULL ,
[Estado] [char] (25) COLLATE Modern_Spanish_CI_AS NULL ,
[Moneda] [char] (1) COLLATE Modern_Spanish_CI_AS NULL ,
[TipoCambio] [decimal](19, 2) NULL ,
[GuardadoFacturado] [bit] NULL ,
[Observaciones] [nvarchar] (300) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[DetalleFichaVenta] ADD
CONSTRAINT [DF_DetalleFichaVenta_Observaciones] DEFAULT ('') FOR
[Observaciones],
CONSTRAINT [PK_DetalleFichaVenta] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero],
[Item]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[DetalleFichaVenta] ADD
CONSTRAINT [FK_DetalleFichaVenta_FichaVenta] FOREIGN KEY
(
[Serie],
[Numero]
) REFERENCES [dbo].[FichaVenta] (
[Serie],
[Numero]
)
GO


Paso la consutla como la realizo. Asi demora 1s

SELECT TOP 100 PERCENT FV.Serie AS Serie, FV.Numero AS Numero, C.Nombres + '
' + C.Apellidos AS Cliente,
FV.Persona1, FV.Persona2, FV.Persona3, MFV.FechaEmision, MFV.PagoTotal,
MFV.Total as [Total Cot.], MFV.Saldo,
MFV.Estado
FROM dbo.FichaVenta FV INNER JOIN
dbo.Clientes C ON FV.CodigoCliente = C.CodigoCliente INNER JOIN
dbo.MontosFichaVenta MFV ON MFV.Serie = FV.Serie AND MFV.Numero = FV.Numero
GROUP BY FV.Serie, FV.Numero, C.Nombres + ' ' + C.Apellidos, FV.Persona1,
FV.Persona2, FV.Persona3,
MFV.FechaEmision, MFV.Estado, MFV.PagoTotal, MFV.Total, MFV.Saldo
ORDER BY MFV.FechaEmision Desc, FV.Numero Desc

Asi demora 10s

SELECT TOP 50 * FROM MostrarFichaVenta


Te paso el plan de mantenimiento, creo que la opcion para xml esta en sql
2005 o 2008, yo tengo 2000.

|--Sort(DISTINCT ORDER BY:([FichaObra].[FechaEmision] DESC, [FV].[Numero]
DESC, [FV].[Serie] ASC, [Expr1025] ASC, [Expr1018] ASC, [Expr1023] ASC,
[Expr1017] ASC, [Expr1024] ASC))
|--Compute Scalar(DEFINE:([Expr1025]=[C].[Nombres]+'
'+[C].[Apellidos]))
|--Hash Match(Inner Join,
HASH:([C].[CodigoCliente])=([FV].[CodigoCliente]))
|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[Clientes].[PK_Clientes] AS [C]))
|--Merge Join(Inner Join, MERGE:([FV].[Serie],
[FV].[Numero])=([FichaVenta].[Serie], [FichaVenta].[Numero]),
RESIDUAL:([FichaVenta].[Serie]=[FV].[Serie] AND
[FichaVenta].[Numero]=[FV].[Numero]))
|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaVenta].[PK_FichaVenta] AS [FV]), ORDERED
FORWARD)
|--Sort(ORDER BY:([FichaVenta].[Serie] ASC,
[FichaVenta].[Numero] ASC))
|--Compute Scalar(DEFINE:([Expr1023]=If
([Expr1019]=NULL) then 0.00 else [Expr1019], [Expr1024]=round([Expr1017]-If
([Expr1019]=NULL) then 0.00 else [Expr1019], 2, NULL)))
|--Compute Scalar(DEFINE:([Expr1019]=If
([Expr1071]=0) then NULL else [Expr1072]))
|--Stream Aggregate(GROUP
BY:([FichaVenta].[Numero], [FichaVenta].[Serie],
[FichaVenta].[CodigoCliente], [Expr1018], [Expr1017],
[FichaObra].[FechaEmision])
DEFINE:([Expr1071]=COUNT_BIG([DetalleFichaVenta].[PagoCuenta])
|--Sort(ORDER
BY:([FichaVenta].[Numero] DESC, [FichaVenta].[Serie] ASC,
[FichaVenta].[CodigoCliente] ASC, [Expr1018] ASC, [Expr1017] ASC,
[FichaObra].[FechaEmision] ASC))
|--Compute
Scalar(DEFINE:([Expr1018]=upper([EstadoFichaObra].[Descripcion])))
|--Hash Match(Right
Outer Join, HASH:([DetalleFichaVenta].[Serie],
[DetalleFichaVenta].[Numero])=([FichaVenta].[Serie], [FichaVenta].[Numero]),
RESIDUAL:([FichaVenta].[Serie]=[DetalleFichaVenta].[Serie] A
|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[DetalleFichaVenta].[PK_DetalleFichaVenta]))
|--Compute
Scalar(DEFINE:([Expr1017]=Convert(([Expr1010]+Convert(If ([Expr1005]=NULL)
then 0.00 else [Expr1005]))*1.19-Convert(If ([Expr1002]=NULL) then 0.00 else
[Expr1002]))))
|--Hash
Match(Inner Join, HASH:([EstadoFichaObra].[CodigoEstado])=([Expr1060]))
|--Clustered
Index Scan(OBJECT:([NTrazzo].[dbo].[EstadoFichaObra].[PK_EstadoFichaObra]))
|--Compute
Scalar(DEFINE:([Expr1060]=Convert([FichaObra].[CodigoEstado])))
|--Merge
Join(Inner Join, MERGE:([FichaVenta].[Serie],
[FichaVenta].[Numero])=([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetalle].[NumeroFichaObra]), RESIDUAL:([FichaObraDetalle].

|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaVenta].[PK_FichaVenta]), ORDERED FORWARD)

|--Compute Scalar(DEFINE:([Expr1010]=If ([Expr1069]=0) then NULL else
[Expr1070]))

|--Stream Aggregate(GROUP BY:([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetalle].[NumeroFichaObra], [Expr1002], [Expr1005])
DEFINE:([Expr1069]=COUNT_BIG(Convert([FichaOb

|--Sort(ORDER BY:([FichaObraDetalle].[SerieFichaObra] ASC,
[FichaObraDetalle].[NumeroFichaObra] ASC, [Expr1002] ASC, [Expr1005] ASC))

|--Hash Match(Right Outer Join,
HASH:([FichaObra_Servicios].[SerieFichaObra],
[FichaObra_Servicios].[NumeroFichaObra])=([FichaObra].[Serie],
[FichaObra].[Numero]),

|--Stream Aggregate(GROUP
BY:([FichaObra_Servicios].[SerieFichaObra],
[FichaObra_Servicios].[NumeroFichaObra])
DEFINE:([Expr1005]=SUM([FichaObra_Servicios].[Mo

| |--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaObra_Servicios].[PK_FichaObra_Servicios]),
ORDERED FORWARD)

|--Merge Join(Right Outer Join,
MERGE:([NotaCredito].[SerieCotizacion],
[NotaCredito].[NumeroCotizacion])=([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetal

|--Stream Aggregate(GROUP
BY:([NotaCredito].[SerieCotizacion], [NotaCredito].[NumeroCotizacion])
DEFINE:([Expr1002]=SUM([NotaCredito].[ImporteTotal])))

| |--Sort(ORDER
BY:([NotaCredito].[SerieCotizacion] ASC, [NotaCredito].[NumeroCotizacion]
ASC))

| |--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[NotaCredito].[PK_NotaCredito]),
WHERE:([NotaCredito].[EstadoDocumento]<>4))

|--Merge Join(Inner Join,
MERGE:([FichaObra].[Serie],
[FichaObra].[Numero])=([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetalle].[NumeroFichaObra]), R

|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaObra].[PK_FichaObra]), ORDERED FORWARD)

|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaObraDetalle].[PK_FichaObraDetalle]),
ORDERED FORWARD)

Espero te sirva la informacion que te envio.

Muchas gracias.


"Alejandro Mesa" escribió en el
mensaje news:
Ricardo Uribe,

Creo que no podremos ser de mucha ayuda, si no es que posteas mas
informacion sobre los objetos involucrados en esta consulta.

- Estructura de las tablas, incluyendo restricciones e indices.
- Sentencia "select" a la que te refieres.
- Informacion sobre el Plan de ejecucion (ver set showplan_text / xml en
los BOL).


AMB



"Ricardo Uribe" wrote:

Buenos dias gente,

Tengo un problema (para variar), una consulta que
no me daba problemas ahora se demora como 10s
para devolver informacion.

Ejecuto desde el analizador de consultas la estructura
de mi consulta demora 1s, pero cuando la llamo desde su
nombre y poniendo un TOP 50 que es lo hago desde mi
aplicacion, se demora entre 8 y 10s.

La primera vez que ocurrio esto lo solucione, haciendo un
mantenimiento de reorganizar paginas de datos y de indices.

Pero ahora que ha vuelto a suceder no funciona.

Espero me puedan asesorar para entender porque sucede
esto, ya que tambien me daban problemas otras consultas
que tenian que ver con rango de fechas.

Muchas gracias



Respuesta Responder a este mensaje
#3 Alejandro Mesa
09/03/2009 - 21:23 | Informe spam
Ricardo Uribe,

Espera un momento, creo que hay algo aqui que tu no nos estas dejando saber.

Esta es la lista de las tablas, de las cuales posteastes su estructura:

- [dbo].[FichaObra]
- [dbo].[FichaVenta]
- [dbo].[DetalleFichaVenta]

Pero veo en la primera select, que se referencia a otros objetos.

- dbo.Clientes
- dbo.MontosFichaVenta

y tambien noto que el objeto que se referencia en la segunda "select" no ha
sido incluido en la lista de las estructuras.

- MostrarFichaVenta

Me hace pensar, por el uso de la construccion "SELECT TOP 100 PERCENT ...
ORDER BY...", que el objeto [MostrarFichaVenta] pudiera ser una vista, y que
se ha usado la construccion anterior para que el resultado este ordenado
cuando se selecciona desde esa vista, estoy en lo correcto o no?

De ser asi, entonces te aconsejo que elimines el ordenamiento en la
construccion de la vista, pues para que el resultado de una select que
referencia la vista este ordenado, se debe usar la clausula "order by" en la
select que la referencia o que selecciona data desde esa vista.

Asi que si esta es la sentencia usada para construir la vista, entonces
deberia quedar como:

create view ...
as
SELECT
FV.Serie AS Serie, FV.Numero AS Numero, C.Nombres + '
' + C.Apellidos AS Cliente,
FV.Persona1, FV.Persona2, FV.Persona3, MFV.FechaEmision, MFV.PagoTotal,
MFV.Total as [Total Cot.], MFV.Saldo,
MFV.Estado
FROM dbo.FichaVenta FV INNER JOIN
dbo.Clientes C ON FV.CodigoCliente = C.CodigoCliente INNER JOIN
dbo.MontosFichaVenta MFV ON MFV.Serie = FV.Serie AND MFV.Numero = FV.Numero
GROUP BY FV.Serie, FV.Numero, C.Nombres + ' ' + C.Apellidos, FV.Persona1,
FV.Persona2, FV.Persona3,
MFV.FechaEmision, MFV.Estado, MFV.PagoTotal, MFV.Total, MFV.Saldo
GO

y la sentencia que hala data desde la vista seria:

SELECT TOP 50 *
FROM MostrarFichaVenta
ORDER BY FechaEmision Desc, Numero Desc;
GO

Tambien asegurate de tener indices por las columnas que toman parte en las
uniones, por ejemplo:

FROM
dbo.FichaVenta FV
INNER JOIN
dbo.Clientes C ON FV.CodigoCliente = C.CodigoCliente

Aca te pudiera ayudar tener un indice en FichaVenta(CodigoCliente) y uno en
Clientes(CodigoCliente).


FROM
dbo.FichaVenta FV
INNER JOIN
dbo.MontosFichaVenta MFV
ON MFV.Serie = FV.Serie AND MFV.Numero = FV.Numero

Aca, FichaVenta(Serie, Numero) y MontosFichaVenta(Serie, Numero). Cuando
tienes claves compuestas, trata de usar la columna mas selectiva como lider
de el grupo de columnas que conforman la clave de el indice.


AMB


"Ricardo Uribe" wrote:

Alejandro,

Paso la estructura de las tablas principales que intervienen en la consulta.

CREATE TABLE [dbo].[FichaObra] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[FechaEmision] [smalldatetime] NULL ,
[CodigoEstado] [tinyint] NULL ,
[CodigoCliente] [int] NULL ,
[CodigoResponsable] [smallint] NULL ,
[RazonSocial] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[RazonSocialRUCDNI] [nvarchar] (11) COLLATE Modern_Spanish_CI_AS NULL ,
[RazonSocialDireccion] [nvarchar] (150) COLLATE Modern_Spanish_CI_AS NULL ,
[RazonSocialCodigoDistrito] [smallint] NULL ,
[RazonSocialLocalidad] [nvarchar] (70) COLLATE Modern_Spanish_CI_AS NULL ,
[ObraResponsable] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[ObraDireccion] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[ObraCodigoDistrito] [smallint] NULL ,
[ObraLocalidad] [nvarchar] (150) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoVendedor] [smallint] NULL ,
[MontoInstalacion] [money] NULL ,
[MontoPintura] [money] NULL ,
[MontoAlbañileria] [money] NULL ,
[MontoMercaderia] [money] NULL ,
[AtencionA] [nvarchar] (70) COLLATE Modern_Spanish_CI_AS NULL ,
[SerieNotaCredito] [smallint] NULL ,
[NumeroNotaCredito] [int] NULL ,
[Observaciones] [nvarchar] (500) COLLATE Modern_Spanish_CI_AS NULL ,
[NombreFichaObra] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[MontoNotaCredito] [money] NULL ,
[Adelanto] [tinyint] NULL ,
[ContraEntrega] [tinyint] NULL ,
[Condicion10] [nvarchar] (4000) COLLATE Modern_Spanish_CI_AS NULL ,
[Condicion11] [nvarchar] (4000) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoContacto] [int] NULL ,
[GerenteProyecto] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[SupervisorObra] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[AdministradorProyecto] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT
NULL ,
[InstaladorObra] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[CodigoEstadoLiquidacion] [smallint] NOT NULL ,
[CodSituacion] [smallint] NOT NULL ,
[CodTipoCobranza] [smallint] NOT NULL ,
[CodigoCentroVenta] [smallint] NOT NULL ,
[Comision] [smallint] NOT NULL ,
[EstadoComision] [bit] NOT NULL ,
[CodigoFinalizado] [smallint] NOT NULL ,
[FechaFinalizado] [smalldatetime] NULL ,
[CodigoResponsableFinalizado] [smallint] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaObra] ADD
CONSTRAINT [DF_FichaObra_MontoInstalacion] DEFAULT (0) FOR
[MontoInstalacion],
CONSTRAINT [DF_FichaObra_MontoPintura] DEFAULT (0) FOR [MontoPintura],
CONSTRAINT [DF_FichaObra_MontoAlbañileria] DEFAULT (0) FOR
[MontoAlbañileria],
CONSTRAINT [DF_FichaObra_AtencionA] DEFAULT ('') FOR [AtencionA],
CONSTRAINT [DF_FichaObra_Adelanto] DEFAULT (0) FOR [Adelanto],
CONSTRAINT [DF_FichaObra_ContraEntrega] DEFAULT (0) FOR [ContraEntrega],
CONSTRAINT [DF_FichaObra_GerenteProyecto] DEFAULT ('') FOR
[GerenteProyecto],
CONSTRAINT [DF_FichaObra_SupervisorObra] DEFAULT ('') FOR [SupervisorObra],
CONSTRAINT [DF_FichaObra_AdministradorObra] DEFAULT ('') FOR
[AdministradorProyecto],
CONSTRAINT [DF_FichaObra_InstaladorObra] DEFAULT ('') FOR [InstaladorObra],
CONSTRAINT [DF_FichaObra_CodigoEstadoLiquidacion] DEFAULT (0) FOR
[CodigoEstadoLiquidacion],
CONSTRAINT [DF_FichaObra_CodSituacion] DEFAULT (0) FOR [CodSituacion],
CONSTRAINT [DF_FichaObra_CodTipoCobranza] DEFAULT (0) FOR
[CodTipoCobranza],
CONSTRAINT [DF_FichaObra_CodigoCentroVenta] DEFAULT (0) FOR
[CodigoCentroVenta],
CONSTRAINT [DF_FichaObra_Comision] DEFAULT (0) FOR [Comision],
CONSTRAINT [DF_FichaObra_EstadoComision] DEFAULT (0) FOR [EstadoComision],
CONSTRAINT [DF_FichaObra_CodigoFinalizado] DEFAULT (0) FOR
[CodigoFinalizado],
CONSTRAINT [PK_FichaObra] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaObra] ADD
CONSTRAINT [FK_FichaObra_Clientes] FOREIGN KEY
(
[CodigoCliente]
) REFERENCES [dbo].[Clientes] (
[CodigoCliente]
),
CONSTRAINT [FK_FichaObra_Contactos] FOREIGN KEY
(
[CodigoContacto]
) REFERENCES [dbo].[Contactos] (
[CodigoContacto]
)
GO
CREATE TABLE [dbo].[FichaVenta] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[CodigoCliente] [int] NOT NULL ,
[Persona1] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona2] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona3] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona4] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[EstadoDocumento] [smallint] NULL ,
[DireccionFacturacion] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[Distrito] [smallint] NULL ,
[TipoDocumento] [char] (1) COLLATE Modern_Spanish_CI_AS NULL ,
[Comentario] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoResponsable] [smallint] NULL ,
[Comision] [smallint] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaVenta] ADD
CONSTRAINT [DF_FichaVenta_Distrito] DEFAULT (0) FOR [Distrito],
CONSTRAINT [DF_FichaVenta_Comision] DEFAULT (0) FOR [Comision],
CONSTRAINT [PK_FichaVenta] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaVenta] ADD
CONSTRAINT [FK_FichaVenta_Clientes] FOREIGN KEY
(
[CodigoCliente]
) REFERENCES [dbo].[Clientes] (
[CodigoCliente]
)
GO
CREATE TABLE [dbo].[DetalleFichaVenta] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[Item] [int] NOT NULL ,
[Fecha] [smalldatetime] NOT NULL ,
[PagoCuenta] [decimal](19, 2) NULL ,
[MontoFactura] [decimal](19, 2) NULL ,
[CodigoTipoDocumento] [smallint] NULL ,
[SerieComprobante] [int] NULL ,
[NumeroComprobante] [int] NULL ,
[FechaDocumento] [smalldatetime] NULL ,
[NumeroRecibo] [char] (20) COLLATE Modern_Spanish_CI_AS NULL ,
[Estado] [char] (25) COLLATE Modern_Spanish_CI_AS NULL ,
[Moneda] [char] (1) COLLATE Modern_Spanish_CI_AS NULL ,
[TipoCambio] [decimal](19, 2) NULL ,
[GuardadoFacturado] [bit] NULL ,
[Observaciones] [nvarchar] (300) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[DetalleFichaVenta] ADD
CONSTRAINT [DF_DetalleFichaVenta_Observaciones] DEFAULT ('') FOR
[Observaciones],
CONSTRAINT [PK_DetalleFichaVenta] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero],
[Item]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[DetalleFichaVenta] ADD
CONSTRAINT [FK_DetalleFichaVenta_FichaVenta] FOREIGN KEY
(
[Serie],
[Numero]
) REFERENCES [dbo].[FichaVenta] (
[Serie],
[Numero]
)
GO


Paso la consutla como la realizo. Asi demora 1s

SELECT TOP 100 PERCENT FV.Serie AS Serie, FV.Numero AS Numero, C.Nombres + '
' + C.Apellidos AS Cliente,
FV.Persona1, FV.Persona2, FV.Persona3, MFV.FechaEmision, MFV.PagoTotal,
MFV.Total as [Total Cot.], MFV.Saldo,
MFV.Estado
FROM dbo.FichaVenta FV INNER JOIN
dbo.Clientes C ON FV.CodigoCliente = C.CodigoCliente INNER JOIN
dbo.MontosFichaVenta MFV ON MFV.Serie = FV.Serie AND MFV.Numero = FV.Numero
GROUP BY FV.Serie, FV.Numero, C.Nombres + ' ' + C.Apellidos, FV.Persona1,
FV.Persona2, FV.Persona3,
MFV.FechaEmision, MFV.Estado, MFV.PagoTotal, MFV.Total, MFV.Saldo
ORDER BY MFV.FechaEmision Desc, FV.Numero Desc

Asi demora 10s

SELECT TOP 50 * FROM MostrarFichaVenta


Te paso el plan de mantenimiento, creo que la opcion para xml esta en sql
2005 o 2008, yo tengo 2000.

|--Sort(DISTINCT ORDER BY:([FichaObra].[FechaEmision] DESC, [FV].[Numero]
DESC, [FV].[Serie] ASC, [Expr1025] ASC, [Expr1018] ASC, [Expr1023] ASC,
[Expr1017] ASC, [Expr1024] ASC))
|--Compute Scalar(DEFINE:([Expr1025]=[C].[Nombres]+'
'+[C].[Apellidos]))
|--Hash Match(Inner Join,
HASH:([C].[CodigoCliente])=([FV].[CodigoCliente]))
|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[Clientes].[PK_Clientes] AS [C]))
|--Merge Join(Inner Join, MERGE:([FV].[Serie],
[FV].[Numero])=([FichaVenta].[Serie], [FichaVenta].[Numero]),
RESIDUAL:([FichaVenta].[Serie]=[FV].[Serie] AND
[FichaVenta].[Numero]=[FV].[Numero]))
|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaVenta].[PK_FichaVenta] AS [FV]), ORDERED
FORWARD)
|--Sort(ORDER BY:([FichaVenta].[Serie] ASC,
[FichaVenta].[Numero] ASC))
|--Compute Scalar(DEFINE:([Expr1023]=If
([Expr1019]=NULL) then 0.00 else [Expr1019], [Expr1024]=round([Expr1017]-If
([Expr1019]=NULL) then 0.00 else [Expr1019], 2, NULL)))
|--Compute Scalar(DEFINE:([Expr1019]=If
([Expr1071]=0) then NULL else [Expr1072]))
|--Stream Aggregate(GROUP
BY:([FichaVenta].[Numero], [FichaVenta].[Serie],
[FichaVenta].[CodigoCliente], [Expr1018], [Expr1017],
[FichaObra].[FechaEmision])
DEFINE:([Expr1071]=COUNT_BIG([DetalleFichaVenta].[PagoCuenta])
|--Sort(ORDER
BY:([FichaVenta].[Numero] DESC, [FichaVenta].[Serie] ASC,
[FichaVenta].[CodigoCliente] ASC, [Expr1018] ASC, [Expr1017] ASC,
[FichaObra].[FechaEmision] ASC))
|--Compute
Scalar(DEFINE:([Expr1018]=upper([EstadoFichaObra].[Descripcion])))
|--Hash Match(Right
Outer Join, HASH:([DetalleFichaVenta].[Serie],
[DetalleFichaVenta].[Numero])=([FichaVenta].[Serie], [FichaVenta].[Numero]),
RESIDUAL:([FichaVenta].[Serie]=[DetalleFichaVenta].[Serie] A
|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[DetalleFichaVenta].[PK_DetalleFichaVenta]))
|--Compute
Scalar(DEFINE:([Expr1017]=Convert(([Expr1010]+Convert(If ([Expr1005]=NULL)
then 0.00 else [Expr1005]))*1.19-Convert(If ([Expr1002]=NULL) then 0.00 else
[Expr1002]))))
|--Hash
Match(Inner Join, HASH:([EstadoFichaObra].[CodigoEstado])=([Expr1060]))
|--Clustered
Index Scan(OBJECT:([NTrazzo].[dbo].[EstadoFichaObra].[PK_EstadoFichaObra]))
|--Compute
Scalar(DEFINE:([Expr1060]=Convert([FichaObra].[CodigoEstado])))
|--Merge
Join(Inner Join, MERGE:([FichaVenta].[Serie],
[FichaVenta].[Numero])=([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetalle].[NumeroFichaObra]), RESIDUAL:([FichaObraDetalle].

|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaVenta].[PK_FichaVenta]), ORDERED FORWARD)

|--Compute Scalar(DEFINE:([Expr1010]=If ([Expr1069]=0) then NULL else
[Expr1070]))

|--Stream Aggregate(GROUP BY:([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetalle].[NumeroFichaObra], [Expr1002], [Expr1005])
DEFINE:([Expr1069]=COUNT_BIG(Convert([FichaOb

|--Sort(ORDER BY:([FichaObraDetalle].[SerieFichaObra] ASC,
[FichaObraDetalle].[NumeroFichaObra] ASC, [Expr1002] ASC, [Expr1005] ASC))

|--Hash Match(Right Outer Join,
HASH:([FichaObra_Servicios].[SerieFichaObra],
[FichaObra_Servicios].[NumeroFichaObra])=([FichaObra].[Serie],
[FichaObra].[Numero]),

|--Stream Aggregate(GROUP
BY:([FichaObra_Servicios].[SerieFichaObra],
[FichaObra_Servicios].[NumeroFichaObra])
DEFINE:([Expr1005]=SUM([FichaObra_Servicios].[Mo

| |--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaObra_Servicios].[PK_FichaObra_Servicios]),
ORDERED FORWARD)

|--Merge Join(Right Outer Join,
MERGE:([NotaCredito].[SerieCotizacion],
[NotaCredito].[NumeroCotizacion])=([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetal

|--Stream Aggregate(GROUP
BY:([NotaCredito].[SerieCotizacion], [NotaCredito].[NumeroCotizacion])
DEFINE:([Expr1002]=SUM([NotaCredito].[ImporteTotal])))

| |--Sort(ORDER
BY:([NotaCredito].[SerieCotizacion] ASC, [NotaCredito].[NumeroCotizacion]
ASC))

Respuesta Responder a este mensaje
#4 Ricardo Uribe
10/03/2009 - 01:07 | Informe spam
Si tienes razon,

Este es la estructura de Montos Ficha Venta

CREATE VIEW dbo.MontosFichaVenta
AS
SELECT TOP 100 PERCENT RIGHT('000' + CONVERT(NVARCHAR(3), FV.Serie), 3) +
RIGHT('0000000' + CONVERT(NVARCHAR(7),
FV.Numero), 7) AS [Nº Ficha], FV.Serie, FV.Numero, FV.CodigoCliente,
UPPER(EFO.Descripcion) Estado,
CASE WHEN SUM(DFV.PagoCuenta) IS NULL THEN 0 ELSE SUM(DFV.PagoCuenta)
END AS PagoTotal,
FOI.Total, Round(FOI.Total - CASE WHEN SUM(DFV.PagoCuenta) IS NULL
THEN 0 ELSE SUM(DFV.PagoCuenta) END,2) AS Saldo, FOI.FechaEmision
FROM dbo.FichaVenta FV INNER JOIN dbo.FichaObraImporte FOI ON
FV.Serie = FOI.SerieFichaObra AND FV.Numero = FOI.NumeroFichaObra INNER
JOIN
dbo.EstadoFichaObra EFO ON FOI.CodigoEstado = EFO.CodigoEstado LEFT
OUTER JOIN
DetalleFichaVenta DFV ON FV.Serie = DFV.Serie AND FV.Numero =
DFV.Numero
GROUP BY FV.Serie, FV.Numero, FV.Serie, FV.Numero, FV.CodigoCliente,
UPPER(EFO.Descripcion), FOI.Total, FOI.FechaEmision
ORDER BY FV.Numero DESC


La estructura de MostrarFichaVenta es la misma que esta antes del

SELECT TOP 50 * FROM MostrarFichaVenta, solo hago la observaciones que
ejecutando su estructura se demora menos que llamandolo por su nombre y con
el
TOP 50.

Ahora se me hace un poco complicado quitar el TOP 100 PERCENT, ya que en mi
solo utilizo esto SELECT TOP 50 * FROM y lo demas es una variable que hace
referencia a varias vistas por lo que no puedo usar un ORDER BY final.

Abusando de tu amabilidad porque pasaria que funcionando varios años bien de
un
momento a otro se demore tanto en cargar, sera que por la cantidad de data,
comienzan a aparecer estos problemas.

Voy a replatear mis vistas desdel el inicio, a ver si se repara.

Muchas gracias.


"Alejandro Mesa" escribió en el
mensaje news:
Ricardo Uribe,

Espera un momento, creo que hay algo aqui que tu no nos estas dejando
saber.

Esta es la lista de las tablas, de las cuales posteastes su estructura:

- [dbo].[FichaObra]
- [dbo].[FichaVenta]
- [dbo].[DetalleFichaVenta]

Pero veo en la primera select, que se referencia a otros objetos.

- dbo.Clientes
- dbo.MontosFichaVenta

y tambien noto que el objeto que se referencia en la segunda "select" no
ha
sido incluido en la lista de las estructuras.

- MostrarFichaVenta

Me hace pensar, por el uso de la construccion "SELECT TOP 100 PERCENT ...
ORDER BY...", que el objeto [MostrarFichaVenta] pudiera ser una vista, y
que
se ha usado la construccion anterior para que el resultado este ordenado
cuando se selecciona desde esa vista, estoy en lo correcto o no?

De ser asi, entonces te aconsejo que elimines el ordenamiento en la
construccion de la vista, pues para que el resultado de una select que
referencia la vista este ordenado, se debe usar la clausula "order by" en
la
select que la referencia o que selecciona data desde esa vista.

Asi que si esta es la sentencia usada para construir la vista, entonces
deberia quedar como:

create view ...
as
SELECT
FV.Serie AS Serie, FV.Numero AS Numero, C.Nombres + '
' + C.Apellidos AS Cliente,
FV.Persona1, FV.Persona2, FV.Persona3, MFV.FechaEmision, MFV.PagoTotal,
MFV.Total as [Total Cot.], MFV.Saldo,
MFV.Estado
FROM dbo.FichaVenta FV INNER JOIN
dbo.Clientes C ON FV.CodigoCliente = C.CodigoCliente INNER JOIN
dbo.MontosFichaVenta MFV ON MFV.Serie = FV.Serie AND MFV.Numero =
FV.Numero
GROUP BY FV.Serie, FV.Numero, C.Nombres + ' ' + C.Apellidos, FV.Persona1,
FV.Persona2, FV.Persona3,
MFV.FechaEmision, MFV.Estado, MFV.PagoTotal, MFV.Total, MFV.Saldo
GO

y la sentencia que hala data desde la vista seria:

SELECT TOP 50 *
FROM MostrarFichaVenta
ORDER BY FechaEmision Desc, Numero Desc;
GO

Tambien asegurate de tener indices por las columnas que toman parte en las
uniones, por ejemplo:

FROM
dbo.FichaVenta FV
INNER JOIN
dbo.Clientes C ON FV.CodigoCliente = C.CodigoCliente

Aca te pudiera ayudar tener un indice en FichaVenta(CodigoCliente) y uno
en
Clientes(CodigoCliente).


FROM
dbo.FichaVenta FV
INNER JOIN
dbo.MontosFichaVenta MFV
ON MFV.Serie = FV.Serie AND MFV.Numero = FV.Numero

Aca, FichaVenta(Serie, Numero) y MontosFichaVenta(Serie, Numero). Cuando
tienes claves compuestas, trata de usar la columna mas selectiva como
lider
de el grupo de columnas que conforman la clave de el indice.


AMB


"Ricardo Uribe" wrote:

Alejandro,

Paso la estructura de las tablas principales que intervienen en la
consulta.

CREATE TABLE [dbo].[FichaObra] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[FechaEmision] [smalldatetime] NULL ,
[CodigoEstado] [tinyint] NULL ,
[CodigoCliente] [int] NULL ,
[CodigoResponsable] [smallint] NULL ,
[RazonSocial] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[RazonSocialRUCDNI] [nvarchar] (11) COLLATE Modern_Spanish_CI_AS NULL ,
[RazonSocialDireccion] [nvarchar] (150) COLLATE Modern_Spanish_CI_AS
NULL ,
[RazonSocialCodigoDistrito] [smallint] NULL ,
[RazonSocialLocalidad] [nvarchar] (70) COLLATE Modern_Spanish_CI_AS NULL
,
[ObraResponsable] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[ObraDireccion] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[ObraCodigoDistrito] [smallint] NULL ,
[ObraLocalidad] [nvarchar] (150) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoVendedor] [smallint] NULL ,
[MontoInstalacion] [money] NULL ,
[MontoPintura] [money] NULL ,
[MontoAlbañileria] [money] NULL ,
[MontoMercaderia] [money] NULL ,
[AtencionA] [nvarchar] (70) COLLATE Modern_Spanish_CI_AS NULL ,
[SerieNotaCredito] [smallint] NULL ,
[NumeroNotaCredito] [int] NULL ,
[Observaciones] [nvarchar] (500) COLLATE Modern_Spanish_CI_AS NULL ,
[NombreFichaObra] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[MontoNotaCredito] [money] NULL ,
[Adelanto] [tinyint] NULL ,
[ContraEntrega] [tinyint] NULL ,
[Condicion10] [nvarchar] (4000) COLLATE Modern_Spanish_CI_AS NULL ,
[Condicion11] [nvarchar] (4000) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoContacto] [int] NULL ,
[GerenteProyecto] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL
,
[SupervisorObra] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL
,
[AdministradorProyecto] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS
NOT
NULL ,
[InstaladorObra] [nvarchar] (100) COLLATE Modern_Spanish_CI_AS NOT NULL
,
[CodigoEstadoLiquidacion] [smallint] NOT NULL ,
[CodSituacion] [smallint] NOT NULL ,
[CodTipoCobranza] [smallint] NOT NULL ,
[CodigoCentroVenta] [smallint] NOT NULL ,
[Comision] [smallint] NOT NULL ,
[EstadoComision] [bit] NOT NULL ,
[CodigoFinalizado] [smallint] NOT NULL ,
[FechaFinalizado] [smalldatetime] NULL ,
[CodigoResponsableFinalizado] [smallint] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaObra] ADD
CONSTRAINT [DF_FichaObra_MontoInstalacion] DEFAULT (0) FOR
[MontoInstalacion],
CONSTRAINT [DF_FichaObra_MontoPintura] DEFAULT (0) FOR [MontoPintura],
CONSTRAINT [DF_FichaObra_MontoAlbañileria] DEFAULT (0) FOR
[MontoAlbañileria],
CONSTRAINT [DF_FichaObra_AtencionA] DEFAULT ('') FOR [AtencionA],
CONSTRAINT [DF_FichaObra_Adelanto] DEFAULT (0) FOR [Adelanto],
CONSTRAINT [DF_FichaObra_ContraEntrega] DEFAULT (0) FOR [ContraEntrega],
CONSTRAINT [DF_FichaObra_GerenteProyecto] DEFAULT ('') FOR
[GerenteProyecto],
CONSTRAINT [DF_FichaObra_SupervisorObra] DEFAULT ('') FOR
[SupervisorObra],
CONSTRAINT [DF_FichaObra_AdministradorObra] DEFAULT ('') FOR
[AdministradorProyecto],
CONSTRAINT [DF_FichaObra_InstaladorObra] DEFAULT ('') FOR
[InstaladorObra],
CONSTRAINT [DF_FichaObra_CodigoEstadoLiquidacion] DEFAULT (0) FOR
[CodigoEstadoLiquidacion],
CONSTRAINT [DF_FichaObra_CodSituacion] DEFAULT (0) FOR [CodSituacion],
CONSTRAINT [DF_FichaObra_CodTipoCobranza] DEFAULT (0) FOR
[CodTipoCobranza],
CONSTRAINT [DF_FichaObra_CodigoCentroVenta] DEFAULT (0) FOR
[CodigoCentroVenta],
CONSTRAINT [DF_FichaObra_Comision] DEFAULT (0) FOR [Comision],
CONSTRAINT [DF_FichaObra_EstadoComision] DEFAULT (0) FOR
[EstadoComision],
CONSTRAINT [DF_FichaObra_CodigoFinalizado] DEFAULT (0) FOR
[CodigoFinalizado],
CONSTRAINT [PK_FichaObra] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaObra] ADD
CONSTRAINT [FK_FichaObra_Clientes] FOREIGN KEY
(
[CodigoCliente]
) REFERENCES [dbo].[Clientes] (
[CodigoCliente]
),
CONSTRAINT [FK_FichaObra_Contactos] FOREIGN KEY
(
[CodigoContacto]
) REFERENCES [dbo].[Contactos] (
[CodigoContacto]
)
GO
CREATE TABLE [dbo].[FichaVenta] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[CodigoCliente] [int] NOT NULL ,
[Persona1] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona2] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona3] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[Persona4] [nvarchar] (250) COLLATE Modern_Spanish_CI_AS NULL ,
[EstadoDocumento] [smallint] NULL ,
[DireccionFacturacion] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS
NULL ,
[Distrito] [smallint] NULL ,
[TipoDocumento] [char] (1) COLLATE Modern_Spanish_CI_AS NULL ,
[Comentario] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoResponsable] [smallint] NULL ,
[Comision] [smallint] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaVenta] ADD
CONSTRAINT [DF_FichaVenta_Distrito] DEFAULT (0) FOR [Distrito],
CONSTRAINT [DF_FichaVenta_Comision] DEFAULT (0) FOR [Comision],
CONSTRAINT [PK_FichaVenta] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[FichaVenta] ADD
CONSTRAINT [FK_FichaVenta_Clientes] FOREIGN KEY
(
[CodigoCliente]
) REFERENCES [dbo].[Clientes] (
[CodigoCliente]
)
GO
CREATE TABLE [dbo].[DetalleFichaVenta] (
[Serie] [smallint] NOT NULL ,
[Numero] [int] NOT NULL ,
[Item] [int] NOT NULL ,
[Fecha] [smalldatetime] NOT NULL ,
[PagoCuenta] [decimal](19, 2) NULL ,
[MontoFactura] [decimal](19, 2) NULL ,
[CodigoTipoDocumento] [smallint] NULL ,
[SerieComprobante] [int] NULL ,
[NumeroComprobante] [int] NULL ,
[FechaDocumento] [smalldatetime] NULL ,
[NumeroRecibo] [char] (20) COLLATE Modern_Spanish_CI_AS NULL ,
[Estado] [char] (25) COLLATE Modern_Spanish_CI_AS NULL ,
[Moneda] [char] (1) COLLATE Modern_Spanish_CI_AS NULL ,
[TipoCambio] [decimal](19, 2) NULL ,
[GuardadoFacturado] [bit] NULL ,
[Observaciones] [nvarchar] (300) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[DetalleFichaVenta] ADD
CONSTRAINT [DF_DetalleFichaVenta_Observaciones] DEFAULT ('') FOR
[Observaciones],
CONSTRAINT [PK_DetalleFichaVenta] PRIMARY KEY CLUSTERED
(
[Serie],
[Numero],
[Item]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[DetalleFichaVenta] ADD
CONSTRAINT [FK_DetalleFichaVenta_FichaVenta] FOREIGN KEY
(
[Serie],
[Numero]
) REFERENCES [dbo].[FichaVenta] (
[Serie],
[Numero]
)
GO


Paso la consutla como la realizo. Asi demora 1s

SELECT TOP 100 PERCENT FV.Serie AS Serie, FV.Numero AS Numero, C.Nombres
+ '
' + C.Apellidos AS Cliente,
FV.Persona1, FV.Persona2, FV.Persona3, MFV.FechaEmision, MFV.PagoTotal,
MFV.Total as [Total Cot.], MFV.Saldo,
MFV.Estado
FROM dbo.FichaVenta FV INNER JOIN
dbo.Clientes C ON FV.CodigoCliente = C.CodigoCliente INNER JOIN
dbo.MontosFichaVenta MFV ON MFV.Serie = FV.Serie AND MFV.Numero =
FV.Numero
GROUP BY FV.Serie, FV.Numero, C.Nombres + ' ' + C.Apellidos, FV.Persona1,
FV.Persona2, FV.Persona3,
MFV.FechaEmision, MFV.Estado, MFV.PagoTotal, MFV.Total, MFV.Saldo
ORDER BY MFV.FechaEmision Desc, FV.Numero Desc

Asi demora 10s

SELECT TOP 50 * FROM MostrarFichaVenta


Te paso el plan de mantenimiento, creo que la opcion para xml esta en sql
2005 o 2008, yo tengo 2000.

|--Sort(DISTINCT ORDER BY:([FichaObra].[FechaEmision] DESC, [FV].[Numero]
DESC, [FV].[Serie] ASC, [Expr1025] ASC, [Expr1018] ASC, [Expr1023] ASC,
[Expr1017] ASC, [Expr1024] ASC))
|--Compute Scalar(DEFINE:([Expr1025]=[C].[Nombres]+'
'+[C].[Apellidos]))
|--Hash Match(Inner Join,
HASH:([C].[CodigoCliente])=([FV].[CodigoCliente]))
|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[Clientes].[PK_Clientes] AS [C]))
|--Merge Join(Inner Join, MERGE:([FV].[Serie],
[FV].[Numero])=([FichaVenta].[Serie], [FichaVenta].[Numero]),
RESIDUAL:([FichaVenta].[Serie]=[FV].[Serie] AND
[FichaVenta].[Numero]=[FV].[Numero]))
|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaVenta].[PK_FichaVenta] AS [FV]),
ORDERED
FORWARD)
|--Sort(ORDER BY:([FichaVenta].[Serie] ASC,
[FichaVenta].[Numero] ASC))
|--Compute Scalar(DEFINE:([Expr1023]=If
([Expr1019]=NULL) then 0.00 else [Expr1019],
[Expr1024]=round([Expr1017]-If
([Expr1019]=NULL) then 0.00 else [Expr1019], 2, NULL)))
|--Compute Scalar(DEFINE:([Expr1019]=If
([Expr1071]=0) then NULL else [Expr1072]))
|--Stream Aggregate(GROUP
BY:([FichaVenta].[Numero], [FichaVenta].[Serie],
[FichaVenta].[CodigoCliente], [Expr1018], [Expr1017],
[FichaObra].[FechaEmision])
DEFINE:([Expr1071]=COUNT_BIG([DetalleFichaVenta].[PagoCuenta])
|--Sort(ORDER
BY:([FichaVenta].[Numero] DESC, [FichaVenta].[Serie] ASC,
[FichaVenta].[CodigoCliente] ASC, [Expr1018] ASC, [Expr1017] ASC,
[FichaObra].[FechaEmision] ASC))
|--Compute
Scalar(DEFINE:([Expr1018]=upper([EstadoFichaObra].[Descripcion])))
|--Hash Match(Right
Outer Join, HASH:([DetalleFichaVenta].[Serie],
[DetalleFichaVenta].[Numero])=([FichaVenta].[Serie],
[FichaVenta].[Numero]),
RESIDUAL:([FichaVenta].[Serie]=[DetalleFichaVenta].[Serie] A
|--Clustered
Index
Scan(OBJECT:([NTrazzo].[dbo].[DetalleFichaVenta].[PK_DetalleFichaVenta]))
|--Compute
Scalar(DEFINE:([Expr1017]=Convert(([Expr1010]+Convert(If
([Expr1005]=NULL)
then 0.00 else [Expr1005]))*1.19-Convert(If ([Expr1002]=NULL) then 0.00
else
[Expr1002]))))
|--Hash
Match(Inner Join, HASH:([EstadoFichaObra].[CodigoEstado])=([Expr1060]))

|--Clustered
Index
Scan(OBJECT:([NTrazzo].[dbo].[EstadoFichaObra].[PK_EstadoFichaObra]))

|--Compute
Scalar(DEFINE:([Expr1060]=Convert([FichaObra].[CodigoEstado])))

|--Merge
Join(Inner Join, MERGE:([FichaVenta].[Serie],
[FichaVenta].[Numero])=([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetalle].[NumeroFichaObra]), RESIDUAL:([FichaObraDetalle].

|--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaVenta].[PK_FichaVenta]), ORDERED
FORWARD)

|--Compute Scalar(DEFINE:([Expr1010]=If ([Expr1069]=0) then NULL else
[Expr1070]))

|--Stream Aggregate(GROUP BY:([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetalle].[NumeroFichaObra], [Expr1002], [Expr1005])
DEFINE:([Expr1069]=COUNT_BIG(Convert([FichaOb

|--Sort(ORDER BY:([FichaObraDetalle].[SerieFichaObra] ASC,
[FichaObraDetalle].[NumeroFichaObra] ASC, [Expr1002] ASC, [Expr1005]
ASC))

|--Hash Match(Right Outer Join,
HASH:([FichaObra_Servicios].[SerieFichaObra],
[FichaObra_Servicios].[NumeroFichaObra])=([FichaObra].[Serie],
[FichaObra].[Numero]),

|--Stream Aggregate(GROUP
BY:([FichaObra_Servicios].[SerieFichaObra],
[FichaObra_Servicios].[NumeroFichaObra])
DEFINE:([Expr1005]=SUM([FichaObra_Servicios].[Mo

| |--Clustered Index
Scan(OBJECT:([NTrazzo].[dbo].[FichaObra_Servicios].[PK_FichaObra_Servicios]),
ORDERED FORWARD)

|--Merge Join(Right Outer Join,
MERGE:([NotaCredito].[SerieCotizacion],
[NotaCredito].[NumeroCotizacion])=([FichaObraDetalle].[SerieFichaObra],
[FichaObraDetal

|--Stream Aggregate(GROUP
BY:([NotaCredito].[SerieCotizacion], [NotaCredito].[NumeroCotizacion])
DEFINE:([Expr1002]=SUM([NotaCredito].[ImporteTotal])))

| |--Sort(ORDER
BY:([NotaCredito].[SerieCotizacion] ASC, [NotaCredito].[NumeroCotizacion]
ASC))

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida