Como optimizar un sql con join a dos servidores

19/07/2007 - 15:42 por Diego Ruiz | Informe spam
Hola amigos!! les agradeceria mucho si me pudieran sacar de mi ignorancia!!
Tengo una consulta sql donde hago join a dos tablas, cada una
correspondiente a un servidor distinto. Uno de los campos es numerico y el
otro es varchar.
De que manera puedo optimizar mi consulta, o que debo tener en cuenta para
que al ejecutarse no se demore tanto? Para taer dos registros se demora 17
segundos.
Debo tener en cuenta algo de relacion de confianza entre los dos servidores
sql?

Muchas gracias por la ayudita

saludos

Diego Ruiz

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera (MVP)
19/07/2007 - 16:30 | Informe spam
Por favor muestre la estructura de las tablas involucradas y la consulta JOIN
que utiliza.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.Larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Diego Ruiz" wrote:

Hola amigos!! les agradeceria mucho si me pudieran sacar de mi ignorancia!!
Tengo una consulta sql donde hago join a dos tablas, cada una
correspondiente a un servidor distinto. Uno de los campos es numerico y el
otro es varchar.
De que manera puedo optimizar mi consulta, o que debo tener en cuenta para
que al ejecutarse no se demore tanto? Para taer dos registros se demora 17
segundos.
Debo tener en cuenta algo de relacion de confianza entre los dos servidores
sql?

Muchas gracias por la ayudita

saludos

Diego Ruiz
Respuesta Responder a este mensaje
#2 Diego Ruiz
19/07/2007 - 17:26 | Informe spam
Hola Gustavo, de atemano mil gracias por tan pronta respuesta.
Te anexo las estructuras y el query:

Estas dos tablas estan en un servidor
CREATE TABLE [dbo].[VALORESGLOBALES]
(
[IDFLUJORUTA] [numeric] (18, 0) NOT NULL,
[IDVARGLOBAL] [int] NOT NULL,
[VALORGLOBAL] [varchar] (8000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
)

GO
ALTER TABLE [dbo].[VALORESGLOBALES] ADD CONSTRAINT [PK_VALORESGLOBALES]
PRIMARY KEY CLUSTERED ([IDFLUJORUTA], [IDVARGLOBAL])
GO

CREATE TABLE [dbo].[FLUJOSACTIVIDADES]
(
[ID] [numeric] (18, 0) NOT NULL,
[IDFLUJORUTA] [numeric] (18, 0) NOT NULL,
[IDACTIVIDAD] [int] NOT NULL,
[IDUSUARIO] [int] NULL,
[SIGUIENTEACTIVIDAD] [char] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[FECHAINICIO] [datetime] NOT NULL,
[FECHAREVISION] [datetime] NULL,
[FECHAFIN] [datetime] NULL,
[IDESTADOACTIVIDAD] [tinyint] NOT NULL,
[MENSAJE] [tinyint] NULL,
[IDFLUJOACTIVIDADENVIA] [numeric] (23, 0) NULL
)

GO
CREATE TRIGGER CACHE ON dbo.FLUJOSACTIVIDADES
FOR UPDATE
AS
DECLARE @ID AS NUMERIC
SELECT @ID=ID FROM INSERTED
DELETE FROM DBO.CACHEACTIVIDADESASIGNADAS WHERE IDFLUJOACTIVIDAD=@ID
DELETE FROM DBO.CACHEACTIVIDADESDISPONIBLES WHERE IDFLUJOACTIVIDAD=@ID

GO
ALTER TABLE [dbo].[FLUJOSACTIVIDADES] ADD CONSTRAINT [PK_FLUJOSACTIVIDADES]
PRIMARY KEY CLUSTERED ([ID])
GO
CREATE NONCLUSTERED INDEX [IX_FLUJOSACTIVIDADES_FECHAFIN] ON
[dbo].[FLUJOSACTIVIDADES] ([FECHAFIN])
GO
CREATE NONCLUSTERED INDEX [IX_FLUJOSACTIVIDADES_FECHAINICIO] ON
[dbo].[FLUJOSACTIVIDADES] ([FECHAINICIO])
GO
CREATE NONCLUSTERED INDEX [IX_FLUJOSACTIVIDADES_ID] ON
[dbo].[FLUJOSACTIVIDADES] ([ID])
GO
CREATE NONCLUSTERED INDEX [IX_FLUJOSACTIVIDADES_IDACTIVIDAD] ON
[dbo].[FLUJOSACTIVIDADES] ([IDACTIVIDAD])
GO
CREATE NONCLUSTERED INDEX [IX_FLUJOSACTIVIDADES_IDESTADOACTIVIDAD] ON
[dbo].[FLUJOSACTIVIDADES] ([IDESTADOACTIVIDAD])
GO
CREATE NONCLUSTERED INDEX [IX_FLUJOSACTIVIDADES_IDFLUJOACTIVIDADENVIA] ON
[dbo].[FLUJOSACTIVIDADES] ([IDFLUJOACTIVIDADENVIA])
GO
CREATE NONCLUSTERED INDEX [IX_FLUJOSACTIVIDADES_IDFLUJORUTA] ON
[dbo].[FLUJOSACTIVIDADES] ([IDFLUJORUTA])
GO
CREATE NONCLUSTERED INDEX [IX_FLUJOSACTIVIDADES_IDUSUARIO] ON
[dbo].[FLUJOSACTIVIDADES] ([IDUSUARIO])
GO

Esta otra tabla esta en otro servidor:
CREATE TABLE [dbo].[CORRESPO]
(
[DWDOCID] [int] NOT NULL,
[DWPAGECOUNT] [int] NOT NULL,
[DWSTOREDATE] [datetime] NULL,
[DWSTORETIME] [int] NULL,
[DWDISKNO] [int] NULL,
[DWFLAGS] [int] NULL,
[DWOFFSET] [int] NULL,
[DWOWNER] [char] (8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[CDESPACHADA] [int] NULL,
[CRECIBIDA] [int] NULL,
[RMEMORANDOS] [int] NULL,
[RORIGEN] [int] NULL,
[NUMERO] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[FECHA] [datetime] NULL,
[NIT] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[EMPRESA] [varchar] (40) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[DIRECCION] [varchar] (40) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[TELEFONO] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[CIUDADORIGEN] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[FECHACARTA] [datetime] NULL,
[ASUNTO] [varchar] (40) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[ANEXO] [varchar] (40) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[CREFIORIGEN] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[CREFIDESTINO] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[TIPODOCTO] [int] NULL,
[CAJA] [int] NULL,
[PAQUETE] [int] NULL,
[DIGITADOR] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[FECHAMODIFICACION] [datetime] NULL,
[MATCHCODE] [varchar] (40) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[CEDULA] [varchar] (1347) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[DETALLEASUNTO] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[CORREOE] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[FLAGCALIDAD] [tinyint] NULL,
[FLAG] [tinyint] NULL
)

GO
ALTER TABLE [dbo].[CORRESPO] ADD CONSTRAINT [PK__CORRESPO__2C601307] PRIMARY
KEY CLUSTERED ([DWDOCID])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_CAJA] ON [dbo].[CORRESPO] ([CAJA])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_CDESPACHADA] ON [dbo].[CORRESPO]
([CDESPACHADA])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_CRECIBIDA] ON [dbo].[CORRESPO]
([CRECIBIDA])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_CREFIDESTINO] ON [dbo].[CORRESPO]
([CREFIDESTINO])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_DWDISKNO] ON [dbo].[CORRESPO]
([DWDISKNO])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_DWSTOREDATE] ON [dbo].[CORRESPO]
([DWSTOREDATE])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_FECHA] ON [dbo].[CORRESPO] ([FECHA])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_FLAG] ON [dbo].[CORRESPO] ([FLAG])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_NIT] ON [dbo].[CORRESPO] ([NIT])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_PAQUETE] ON [dbo].[CORRESPO]
([PAQUETE])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_RMEMORANDOS] ON [dbo].[CORRESPO]
([RMEMORANDOS])
GO
CREATE NONCLUSTERED INDEX [IX_CORRESPO_TIPODOCTO] ON [dbo].[CORRESPO]
([TIPODOCTO])
GO


Y esta es la instruccion sql que se ejecuta en el servidor de las dos
primeras tablas:

SELECT C.CRECIBIDA,VG2.VALORGLOBAL AS
RSALIDA,C.NIT,C.EMPRESA,C.TELEFONO,C.CIUDADORIGEN,CONVERT(VARCHAR(10),C.FECHA,103)AS FECHA,C.ASUNTO,C.CREFIDESTINO
FROM DWSERVER.DOCUWARE.DBO.CORRESPO AS C
INNER JOIN VALORESGLOBALES AS VG1 ON (VG1.VALORGLOBALÊST(C.DWDOCID AS
VARCHAR(15)) AND VG1.IDVARGLOBAL)
INNER JOIN VALORESGLOBALES AS VG2 ON (VG2.IDFLUJORUTA=VG1.IDFLUJORUTA
AND VG2.IDVARGLOBAL)
INNER JOIN FLUJOSACTIVIDADES AS FLA ON (FLA.IDFLUJORUTA=VG2.IDFLUJORUTA
AND FLA.IDACTIVIDAD AND FLA.IDESTADOACTIVIDAD=2)


De nuevo muchas gracias por la ayuda
Saludos

Diego Ruiz


"Gustavo Larriera (MVP)" wrote:

Por favor muestre la estructura de las tablas involucradas y la consulta JOIN
que utiliza.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.Larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Diego Ruiz" wrote:

> Hola amigos!! les agradeceria mucho si me pudieran sacar de mi ignorancia!!
> Tengo una consulta sql donde hago join a dos tablas, cada una
> correspondiente a un servidor distinto. Uno de los campos es numerico y el
> otro es varchar.
> De que manera puedo optimizar mi consulta, o que debo tener en cuenta para
> que al ejecutarse no se demore tanto? Para taer dos registros se demora 17
> segundos.
> Debo tener en cuenta algo de relacion de confianza entre los dos servidores
> sql?
>
> Muchas gracias por la ayudita
>
> saludos
>
> Diego Ruiz
Respuesta Responder a este mensaje
#3 Gustavo Larriera (MVP)
20/07/2007 - 01:51 | Informe spam
Entiendo que la tabla VALORGLOBAL almacena datos de diferentes tipos.
Eso provoca que para hacer comparaciones se debe usar CAST.

En mi opinion, el principal problema es el join entre columnas de
distinto tipo, que requieren el uso de CAST. No creo que el problema
principal sea que las tablas están en diferentes servidores.

SELECT C.CRECIBIDA,VG2.VALORGLOBAL AS
RSALIDA,C.NIT,C.EMPRESA,C.TELEFONO,C.CIUDADORIGEN,CONVERT(VARCHAR
(10),C.FECHA,103)AS FECHA,C.ASUNTO,C.CREFIDESTINO
FROM DWSERVER.DOCUWARE.DBO.CORRESPO AS C
INNER JOIN VALORESGLOBALES AS VG1 ON (VG1.VALORGLOBALÊST(C.DWDOCID
AS
VARCHAR(15)) AND VG1.IDVARGLOBAL)
INNER JOIN VALORESGLOBALES AS VG2 ON
(VG2.IDFLUJORUTA=VG1.IDFLUJORUTA
AND VG2.IDVARGLOBAL)
INNER JOIN FLUJOSACTIVIDADES AS FLA ON
(FLA.IDFLUJORUTA=VG2.IDFLUJORUTA
AND FLA.IDACTIVIDAD AND FLA.IDESTADOACTIVIDAD=2)

CREATE TABLE [dbo].[VALORESGLOBALES]
(
[IDFLUJORUTA] [numeric] (18, 0) NOT NULL,
[IDVARGLOBAL] [int] NOT NULL,
[VALORGLOBAL] [varchar] (8000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
)

CREATE TABLE [dbo].[FLUJOSACTIVIDADES]
(
[ID] [numeric] (18, 0) NOT NULL,
[IDFLUJORUTA] [numeric] (18, 0) NOT NULL,
. . .
)

CREATE TABLE [dbo].[CORRESPO]
(
[DWDOCID] [int] NOT NULL,
. . .
)

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.Larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.

In article ,
says...
Hola Gustavo, de atemano mil gracias por tan pronta respuesta.
Te anexo las estructuras y el query:



[...]
Respuesta Responder a este mensaje
#4 Diego Ruiz
23/07/2007 - 15:12 | Informe spam
Hola Gustavo. Estoy completamente de acuerdo contigo. Me imagino que el
servidor sql debe hacer un esfuerzo mas para hacer el cast a todas las
coincidencias en la otra tabla.

Muy agradecido por la ayuda

Saludos

Diego Ruiz

"Gustavo Larriera (MVP)" wrote:

Entiendo que la tabla VALORGLOBAL almacena datos de diferentes tipos.
Eso provoca que para hacer comparaciones se debe usar CAST.

En mi opinion, el principal problema es el join entre columnas de
distinto tipo, que requieren el uso de CAST. No creo que el problema
principal sea que las tablas están en diferentes servidores.

SELECT C.CRECIBIDA,VG2.VALORGLOBAL AS
RSALIDA,C.NIT,C.EMPRESA,C.TELEFONO,C.CIUDADORIGEN,CONVERT(VARCHAR
(10),C.FECHA,103)AS FECHA,C.ASUNTO,C.CREFIDESTINO
FROM DWSERVER.DOCUWARE.DBO.CORRESPO AS C
INNER JOIN VALORESGLOBALES AS VG1 ON (VG1.VALORGLOBALÊST(C.DWDOCID
AS
VARCHAR(15)) AND VG1.IDVARGLOBAL)
INNER JOIN VALORESGLOBALES AS VG2 ON
(VG2.IDFLUJORUTA=VG1.IDFLUJORUTA
AND VG2.IDVARGLOBAL)
INNER JOIN FLUJOSACTIVIDADES AS FLA ON
(FLA.IDFLUJORUTA=VG2.IDFLUJORUTA
AND FLA.IDACTIVIDAD AND FLA.IDESTADOACTIVIDAD=2)

CREATE TABLE [dbo].[VALORESGLOBALES]
(
[IDFLUJORUTA] [numeric] (18, 0) NOT NULL,
[IDVARGLOBAL] [int] NOT NULL,
[VALORGLOBAL] [varchar] (8000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
)

CREATE TABLE [dbo].[FLUJOSACTIVIDADES]
(
[ID] [numeric] (18, 0) NOT NULL,
[IDFLUJORUTA] [numeric] (18, 0) NOT NULL,
.. . .
)

CREATE TABLE [dbo].[CORRESPO]
(
[DWDOCID] [int] NOT NULL,
.. . .
)

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.Larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.

In article ,
says...
> Hola Gustavo, de atemano mil gracias por tan pronta respuesta.
> Te anexo las estructuras y el query:
>
[...]


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