Aumentar mas aun la velocidad

08/06/2004 - 20:18 por Ricardo Uribe | Informe spam
Hola grupo, lo unico que queria saber es,como puedo
aumentar un mas la velocidad de mi consulta, primero me
dijeron que creara relaciones y campos clave.

Bueno despues de depurar los datos he podido hacerlo, pero
aun deseo hacerlo mas veloz.

Lo que sucede es que el sistema antiguo que tiene sus datos en
tablas .dbf realiza la misma consulta que yo hago en menos tiempo,
ese sistema esta en entorno DOS, y no se que mas hacer.

Gracias por su ayuda.

Si necesitan que les mande mis consultas y procedimientos o
la estructura de las tablas me lo dicen.

Preguntas similare

Leer las respuestas

#1 Javier Loria
09/06/2004 - 04:46 | Informe spam
Hola Ricardo:
Si quieres mandar el DDL de algunas de las Tablas y una de las consultas
talvez podamos revisarlas.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Ricardo Uribe escribio:
Hola grupo, lo unico que queria saber es,como puedo
aumentar un mas la velocidad de mi consulta, primero me
dijeron que creara relaciones y campos clave.

Bueno despues de depurar los datos he podido hacerlo, pero
aun deseo hacerlo mas veloz.

Lo que sucede es que el sistema antiguo que tiene sus datos en
tablas .dbf realiza la misma consulta que yo hago en menos tiempo,
ese sistema esta en entorno DOS, y no se que mas hacer.

Gracias por su ayuda.

Si necesitan que les mande mis consultas y procedimientos o
la estructura de las tablas me lo dicen.
Respuesta Responder a este mensaje
#2 Ricardo Uribe
09/06/2004 - 09:25 | Informe spam
Gracias por tu ayuda, quisiera preguntarte si hay algun
problema si pongo money en lugar float en las columnas
donde guardo cantidades de dinero.




"Javier Loria" escribió en el mensaje
news:
Hola Ricardo:
Algunos comentarios sobre la Tabla de Documento:
1. Uso de NULL: En la medida de lo posible no permitas nulos en los


campos,
para mantener la integridad de los datos, para hacer mas rapidas las
consultas y para hacer mas simple el codigo. Me parece que no requieres ni
un solo campo NULL. Cuando un campo puede ser nulo el servidor agrega
almacenamiento para controlar ese campo, y es requerido evaluar por


separado
esta condicion ya que ninguna de las siguientes condiciones es cierta:
NULL>3 o NULL<3 o NULL=3 o NULL=NULL.
2. NumeroMovimiento es un BIGINT el INT en SQL permite 4 Mil Millones de
movimientos (2 Mil Millones positivos), realmente vas a tener mas de esa
cantidad.
3. Uso de NVARCHAR los NVARCHAR son caracteres tipo UNICODE utiles para
manejar simbolos especiales que no se pueden representar con un byte, pero
tienen la limitacion de ocupar mas espacio en Disco. Adicionalmente el VAR
exige que se lleven 2 bytes de control para el largo. En el caso de
NumeroDocumento es mejor usar CHAR.
3. Un codigo de Cliente tipo FLOAT presentara una alta tendencia a los
errores porque el FLOAT es un tipo de datos de APROXIMACION, o sea el SQL


no
garantiza guardar el valor garantiza guardar un valor aproximado. Usa INT


o
un CHAR(X).
4. Igualmente las cantidades y Precios que usan FLOAT. En este caso debes
usar DECIMAL.
5. Si entiendo correctamente existe una relacion 1..* (Uno a Muchos) entre
Documento y Movimientos, si es asi es muy posible que no requieras las
columnas: CantidadTotal, CantidadInf, Precio y PrecioInf.
6. Cual es la llave Primaria de Documento: NumeroMovimiento o
TipoDocumento/NumeroDocumento?. Aun cuando me gusta mas la segunda voy a
asumir la primera que es mas popular.
Para la tabla de movimientos el analisis seria similar, y voy a asumir
que NumeroMovimiento y CodigoArticulo son Llave Primaria y que las
columnas: FechaMovimiento, TipoMovimiento, TipoDocumento, NumeroDocumento


y
CodigoCotizacionA son redundantes de Documento, y por lo tanto no son
necesarias y deben eliminarse (normalizacion).
La vista podria quedar asi:
=> CREATE VIEW MovimientosCompletos
AS
SELECT Movimientos.NumeroMovimiento AS Movimiento
, Movimientos.CodigoArticulo
, Articulo.descripcion
CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.TipoMovimiento
WHEN 'I' THEN 'Ingreso'
WHEN 'S' THEN 'Salida'
WHEN 'D' THEN 'Devolución'
WHEN 'J' THEN 'Ajuste'
END
, Movimientos.TipoDocumento
, Movimientos.NumeroDocumento
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.AlmacenOrigen
WHEN 'I' THEN Proveedor.Nombre
WHEN 'S' THEN 'ALMACEN CENTRAL'
WHEN 'D' THEN Clientes.Nombres
WHEN 'J' THEN Movimientos.AlmacenOrigen
END AS AlmacenOrigen
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.AlmacenDestino
WHEN 'I' THEN 'ALMACEN CENTRAL'
WHEN 'S' THEN Clientes.Nombres
WHEN 'D' THEN 'ALMACEN CENTRAL'
WHEN 'J' THEN Movimientos.AlmacenDestino
END AS AlmacenDestino
, Movimientos.FechaMovimiento
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.Cantidad
WHEN 'I' THEN Movimientos.Cantidad
WHEN 'S' THEN -Movimientos.Cantidad
WHEN 'D' THEN Movimientos.Cantidad
WHEN 'J' THEN Movimientos.Cantidad
END AS Cantidad
FROM Movimientos
JOIN Articulo
ON Movimientos.CodigoArticulo = Articulo.codigoarticulo
JOIN Documento
ON Documento.NumeroMovimiento=Movimientos.NumeroMovimiento
LEFT OUTER JOIN Proveedor
ON Documento.CodigoProveedor = Proveedor.CodigoProveedor
AND Movimientos.TipoMovimiento='I'
LEFT OUTER JOIN Clientes
ON Documento.CodigoCliente = Clientes.CodigoCliente
AND Movimientos.TipoMovimiento IN ('S', 'D')
WHERE (Movimientos.TipoMovimiento IN ('T', 'I', 'S', 'D', 'J')
=> Va sin probar asi que disculpa cualquier error de sintaxis. Prueba a


ver
como se comporta el rendimiento.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Ricardo Uribe escribio:
> Aqui te adjunto los datos que me pides, las dos tablas
> intervienen en mi consulta, la respectiva consulta y el
> procedimiento que genero de esa consulta.
>
> Gracias por tu interes.
>
> y aqui esta la tabla Movimientos
> "Javier Loria" escribió en el mensaje
> news:
>> Hola Ricardo:
>> Si quieres mandar el DDL de algunas de las Tablas y una de las
>> consultas talvez podamos revisarlas.
>> Saludos,
>>
>>
>> Javier Loria
>> Costa Rica
>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>> que pueda ser copiado y pegado al Query Analizer.
>> La version de SQL y Service Pack tambien ayuda.
>> Ricardo Uribe escribio:
>>> Hola grupo, lo unico que queria saber es,como puedo
>>> aumentar un mas la velocidad de mi consulta, primero me
>>> dijeron que creara relaciones y campos clave.
>>>
>>> Bueno despues de depurar los datos he podido hacerlo, pero
>>> aun deseo hacerlo mas veloz.
>>>
>>> Lo que sucede es que el sistema antiguo que tiene sus datos en
>>> tablas .dbf realiza la misma consulta que yo hago en menos tiempo,
>>> ese sistema esta en entorno DOS, y no se que mas hacer.
>>>
>>> Gracias por su ayuda.
>>>
>>> Si necesitan que les mande mis consultas y procedimientos o
>>> la estructura de las tablas me lo dicen.


Respuesta Responder a este mensaje
#3 Ricardo Uribe
09/06/2004 - 12:12 | Informe spam
Javier una consulta más estoy tratando de usar el plan de ejecucion
que esta en el Analizador de Consultas, pero no se como interpretar
los simbolos que me devuelve.

Sabes de alguna pagina que explique esto un poco mas.




"Javier Loria" escribió en el mensaje
news:
Hola:
No ninguno. En mi caso no lo uso, pero solo es porque el numeric hace
la misma funcion y tengo control sobre los decimales (en CR con un tipo de
cambio de mas de 400 colones por dolar, no tiene mucho sentido llevar 4
decimales!!!) y si en la siguiente version de SQL lo cambian o lo eliminan
no tengo que reescribir el codigo.
A algunos autores no les gusta porque no es ANSI y porque algunos
clientes asumen ciertos formatos (le ponen como prefijo $).
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Ricardo Uribe escribio:
> Gracias por tu ayuda, quisiera preguntarte si hay algun
> problema si pongo money en lugar float en las columnas
> donde guardo cantidades de dinero.
>
>
>
>
> "Javier Loria" escribió en el mensaje
> news:
>> Hola Ricardo:
>> Algunos comentarios sobre la Tabla de Documento:
>> 1. Uso de NULL: En la medida de lo posible no permitas nulos en los
>> campos, para mantener la integridad de los datos, para hacer mas
>> rapidas las consultas y para hacer mas simple el codigo. Me parece
>> que no requieres ni un solo campo NULL. Cuando un campo puede ser
>> nulo el servidor agrega almacenamiento para controlar ese campo, y
>> es requerido evaluar por separado esta condicion ya que ninguna de
>> las siguientes condiciones es cierta: NULL>3 o NULL<3 o NULL=3 o
>> NULL=NULL.
>> 2. NumeroMovimiento es un BIGINT el INT en SQL permite 4 Mil
>> Millones de movimientos (2 Mil Millones positivos), realmente vas a
>> tener mas de esa cantidad.
>> 3. Uso de NVARCHAR los NVARCHAR son caracteres tipo UNICODE utiles
>> para manejar simbolos especiales que no se pueden representar con un
>> byte, pero tienen la limitacion de ocupar mas espacio en Disco.
>> Adicionalmente el VAR exige que se lleven 2 bytes de control para el
>> largo. En el caso de NumeroDocumento es mejor usar CHAR.
>> 3. Un codigo de Cliente tipo FLOAT presentara una alta tendencia a
>> los errores porque el FLOAT es un tipo de datos de APROXIMACION, o
>> sea el SQL no garantiza guardar el valor garantiza guardar un valor
>> aproximado. Usa INT o un CHAR(X).
>> 4. Igualmente las cantidades y Precios que usan FLOAT. En este caso
>> debes usar DECIMAL.
>> 5. Si entiendo correctamente existe una relacion 1..* (Uno a Muchos)
>> entre Documento y Movimientos, si es asi es muy posible que no
>> requieras las columnas: CantidadTotal, CantidadInf, Precio y
>> PrecioInf.
>> 6. Cual es la llave Primaria de Documento: NumeroMovimiento o
>> TipoDocumento/NumeroDocumento?. Aun cuando me gusta mas la segunda
>> voy a asumir la primera que es mas popular.
>> Para la tabla de movimientos el analisis seria similar, y voy a
>> asumir que NumeroMovimiento y CodigoArticulo son Llave Primaria y
>> que las columnas: FechaMovimiento, TipoMovimiento, TipoDocumento,
>> NumeroDocumento y CodigoCotizacionA son redundantes de Documento, y
>> por lo tanto no son necesarias y deben eliminarse (normalizacion).
>> La vista podria quedar asi:
>> => >> CREATE VIEW MovimientosCompletos
>> AS
>> SELECT Movimientos.NumeroMovimiento AS Movimiento
>> , Movimientos.CodigoArticulo
>> , Articulo.descripcion
>> CASE Movimientos.TipoMovimiento
>> WHEN 'T' THEN Movimientos.TipoMovimiento
>> WHEN 'I' THEN 'Ingreso'
>> WHEN 'S' THEN 'Salida'
>> WHEN 'D' THEN 'Devolución'
>> WHEN 'J' THEN 'Ajuste'
>> END
>> , Movimientos.TipoDocumento
>> , Movimientos.NumeroDocumento
>> , CASE Movimientos.TipoMovimiento
>> WHEN 'T' THEN Movimientos.AlmacenOrigen
>> WHEN 'I' THEN Proveedor.Nombre
>> WHEN 'S' THEN 'ALMACEN CENTRAL'
>> WHEN 'D' THEN Clientes.Nombres
>> WHEN 'J' THEN Movimientos.AlmacenOrigen
>> END AS AlmacenOrigen
>> , CASE Movimientos.TipoMovimiento
>> WHEN 'T' THEN Movimientos.AlmacenDestino
>> WHEN 'I' THEN 'ALMACEN CENTRAL'
>> WHEN 'S' THEN Clientes.Nombres
>> WHEN 'D' THEN 'ALMACEN CENTRAL'
>> WHEN 'J' THEN Movimientos.AlmacenDestino
>> END AS AlmacenDestino
>> , Movimientos.FechaMovimiento
>> , CASE Movimientos.TipoMovimiento
>> WHEN 'T' THEN Movimientos.Cantidad
>> WHEN 'I' THEN Movimientos.Cantidad
>> WHEN 'S' THEN -Movimientos.Cantidad
>> WHEN 'D' THEN Movimientos.Cantidad
>> WHEN 'J' THEN Movimientos.Cantidad
>> END AS Cantidad
>> FROM Movimientos
>> JOIN Articulo
>> ON Movimientos.CodigoArticulo = Articulo.codigoarticulo
>> JOIN Documento
>> ON Documento.NumeroMovimiento=Movimientos.NumeroMovimiento
>> LEFT OUTER JOIN Proveedor
>> ON Documento.CodigoProveedor = Proveedor.CodigoProveedor
>> AND Movimientos.TipoMovimiento='I'
>> LEFT OUTER JOIN Clientes
>> ON Documento.CodigoCliente = Clientes.CodigoCliente
>> AND Movimientos.TipoMovimiento IN ('S', 'D')
>> WHERE (Movimientos.TipoMovimiento IN ('T', 'I', 'S', 'D', 'J')
>> => >> Va sin probar asi que disculpa cualquier error de sintaxis.
>> Prueba a ver como se comporta el rendimiento.
>> Saludos,
>>
>>
>> Javier Loria
>> Costa Rica
>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>> que pueda ser copiado y pegado al Query Analizer.
>> La version de SQL y Service Pack tambien ayuda.
>>
>> Ricardo Uribe escribio:
>>> Aqui te adjunto los datos que me pides, las dos tablas
>>> intervienen en mi consulta, la respectiva consulta y el
>>> procedimiento que genero de esa consulta.
>>>
>>> Gracias por tu interes.
>>>
>>> y aqui esta la tabla Movimientos
>>> "Javier Loria" escribió en el mensaje
>>> news:
>>>> Hola Ricardo:
>>>> Si quieres mandar el DDL de algunas de las Tablas y una de las
>>>> consultas talvez podamos revisarlas.
>>>> Saludos,
>>>>
>>>>
>>>> Javier Loria
>>>> Costa Rica
>>>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>>>> que pueda ser copiado y pegado al Query Analizer.
>>>> La version de SQL y Service Pack tambien ayuda.
>>>> Ricardo Uribe escribio:
>>>>> Hola grupo, lo unico que queria saber es,como puedo
>>>>> aumentar un mas la velocidad de mi consulta, primero me
>>>>> dijeron que creara relaciones y campos clave.
>>>>>
>>>>> Bueno despues de depurar los datos he podido hacerlo, pero
>>>>> aun deseo hacerlo mas veloz.
>>>>>
>>>>> Lo que sucede es que el sistema antiguo que tiene sus datos en
>>>>> tablas .dbf realiza la misma consulta que yo hago en menos tiempo,
>>>>> ese sistema esta en entorno DOS, y no se que mas hacer.
>>>>>
>>>>> Gracias por su ayuda.
>>>>>
>>>>> Si necesitan que les mande mis consultas y procedimientos o
>>>>> la estructura de las tablas me lo dicen.


Respuesta Responder a este mensaje
#4 Javier Loria
09/06/2004 - 16:14 | Informe spam
Hola Ricardo:
Algunos comentarios sobre la Tabla de Documento:
1. Uso de NULL: En la medida de lo posible no permitas nulos en los campos,
para mantener la integridad de los datos, para hacer mas rapidas las
consultas y para hacer mas simple el codigo. Me parece que no requieres ni
un solo campo NULL. Cuando un campo puede ser nulo el servidor agrega
almacenamiento para controlar ese campo, y es requerido evaluar por separado
esta condicion ya que ninguna de las siguientes condiciones es cierta:
NULL>3 o NULL<3 o NULL=3 o NULL=NULL.
2. NumeroMovimiento es un BIGINT el INT en SQL permite 4 Mil Millones de
movimientos (2 Mil Millones positivos), realmente vas a tener mas de esa
cantidad.
3. Uso de NVARCHAR los NVARCHAR son caracteres tipo UNICODE utiles para
manejar simbolos especiales que no se pueden representar con un byte, pero
tienen la limitacion de ocupar mas espacio en Disco. Adicionalmente el VAR
exige que se lleven 2 bytes de control para el largo. En el caso de
NumeroDocumento es mejor usar CHAR.
3. Un codigo de Cliente tipo FLOAT presentara una alta tendencia a los
errores porque el FLOAT es un tipo de datos de APROXIMACION, o sea el SQL no
garantiza guardar el valor garantiza guardar un valor aproximado. Usa INT o
un CHAR(X).
4. Igualmente las cantidades y Precios que usan FLOAT. En este caso debes
usar DECIMAL.
5. Si entiendo correctamente existe una relacion 1..* (Uno a Muchos) entre
Documento y Movimientos, si es asi es muy posible que no requieras las
columnas: CantidadTotal, CantidadInf, Precio y PrecioInf.
6. Cual es la llave Primaria de Documento: NumeroMovimiento o
TipoDocumento/NumeroDocumento?. Aun cuando me gusta mas la segunda voy a
asumir la primera que es mas popular.
Para la tabla de movimientos el analisis seria similar, y voy a asumir
que NumeroMovimiento y CodigoArticulo son Llave Primaria y que las
columnas: FechaMovimiento, TipoMovimiento, TipoDocumento, NumeroDocumento y
CodigoCotizacionA son redundantes de Documento, y por lo tanto no son
necesarias y deben eliminarse (normalizacion).
La vista podria quedar asi:
=CREATE VIEW MovimientosCompletos
AS
SELECT Movimientos.NumeroMovimiento AS Movimiento
, Movimientos.CodigoArticulo
, Articulo.descripcion
CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.TipoMovimiento
WHEN 'I' THEN 'Ingreso'
WHEN 'S' THEN 'Salida'
WHEN 'D' THEN 'Devolución'
WHEN 'J' THEN 'Ajuste'
END
, Movimientos.TipoDocumento
, Movimientos.NumeroDocumento
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.AlmacenOrigen
WHEN 'I' THEN Proveedor.Nombre
WHEN 'S' THEN 'ALMACEN CENTRAL'
WHEN 'D' THEN Clientes.Nombres
WHEN 'J' THEN Movimientos.AlmacenOrigen
END AS AlmacenOrigen
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.AlmacenDestino
WHEN 'I' THEN 'ALMACEN CENTRAL'
WHEN 'S' THEN Clientes.Nombres
WHEN 'D' THEN 'ALMACEN CENTRAL'
WHEN 'J' THEN Movimientos.AlmacenDestino
END AS AlmacenDestino
, Movimientos.FechaMovimiento
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.Cantidad
WHEN 'I' THEN Movimientos.Cantidad
WHEN 'S' THEN -Movimientos.Cantidad
WHEN 'D' THEN Movimientos.Cantidad
WHEN 'J' THEN Movimientos.Cantidad
END AS Cantidad
FROM Movimientos
JOIN Articulo
ON Movimientos.CodigoArticulo = Articulo.codigoarticulo
JOIN Documento
ON Documento.NumeroMovimiento=Movimientos.NumeroMovimiento
LEFT OUTER JOIN Proveedor
ON Documento.CodigoProveedor = Proveedor.CodigoProveedor
AND Movimientos.TipoMovimiento='I'
LEFT OUTER JOIN Clientes
ON Documento.CodigoCliente = Clientes.CodigoCliente
AND Movimientos.TipoMovimiento IN ('S', 'D')
WHERE (Movimientos.TipoMovimiento IN ('T', 'I', 'S', 'D', 'J')
= Va sin probar asi que disculpa cualquier error de sintaxis. Prueba a ver
como se comporta el rendimiento.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Ricardo Uribe escribio:
Aqui te adjunto los datos que me pides, las dos tablas
intervienen en mi consulta, la respectiva consulta y el
procedimiento que genero de esa consulta.

Gracias por tu interes.

y aqui esta la tabla Movimientos
"Javier Loria" escribió en el mensaje
news:
Hola Ricardo:
Si quieres mandar el DDL de algunas de las Tablas y una de las
consultas talvez podamos revisarlas.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Ricardo Uribe escribio:
Hola grupo, lo unico que queria saber es,como puedo
aumentar un mas la velocidad de mi consulta, primero me
dijeron que creara relaciones y campos clave.

Bueno despues de depurar los datos he podido hacerlo, pero
aun deseo hacerlo mas veloz.

Lo que sucede es que el sistema antiguo que tiene sus datos en
tablas .dbf realiza la misma consulta que yo hago en menos tiempo,
ese sistema esta en entorno DOS, y no se que mas hacer.

Gracias por su ayuda.

Si necesitan que les mande mis consultas y procedimientos o
la estructura de las tablas me lo dicen.
Respuesta Responder a este mensaje
#5 Javier Loria
09/06/2004 - 16:52 | Informe spam
Hola:
No ninguno. En mi caso no lo uso, pero solo es porque el numeric hace
la misma funcion y tengo control sobre los decimales (en CR con un tipo de
cambio de mas de 400 colones por dolar, no tiene mucho sentido llevar 4
decimales!!!) y si en la siguiente version de SQL lo cambian o lo eliminan
no tengo que reescribir el codigo.
A algunos autores no les gusta porque no es ANSI y porque algunos
clientes asumen ciertos formatos (le ponen como prefijo $).
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Ricardo Uribe escribio:
Gracias por tu ayuda, quisiera preguntarte si hay algun
problema si pongo money en lugar float en las columnas
donde guardo cantidades de dinero.




"Javier Loria" escribió en el mensaje
news:
Hola Ricardo:
Algunos comentarios sobre la Tabla de Documento:
1. Uso de NULL: En la medida de lo posible no permitas nulos en los
campos, para mantener la integridad de los datos, para hacer mas
rapidas las consultas y para hacer mas simple el codigo. Me parece
que no requieres ni un solo campo NULL. Cuando un campo puede ser
nulo el servidor agrega almacenamiento para controlar ese campo, y
es requerido evaluar por separado esta condicion ya que ninguna de
las siguientes condiciones es cierta: NULL>3 o NULL<3 o NULL=3 o
NULL=NULL.
2. NumeroMovimiento es un BIGINT el INT en SQL permite 4 Mil
Millones de movimientos (2 Mil Millones positivos), realmente vas a
tener mas de esa cantidad.
3. Uso de NVARCHAR los NVARCHAR son caracteres tipo UNICODE utiles
para manejar simbolos especiales que no se pueden representar con un
byte, pero tienen la limitacion de ocupar mas espacio en Disco.
Adicionalmente el VAR exige que se lleven 2 bytes de control para el
largo. En el caso de NumeroDocumento es mejor usar CHAR.
3. Un codigo de Cliente tipo FLOAT presentara una alta tendencia a
los errores porque el FLOAT es un tipo de datos de APROXIMACION, o
sea el SQL no garantiza guardar el valor garantiza guardar un valor
aproximado. Usa INT o un CHAR(X).
4. Igualmente las cantidades y Precios que usan FLOAT. En este caso
debes usar DECIMAL.
5. Si entiendo correctamente existe una relacion 1..* (Uno a Muchos)
entre Documento y Movimientos, si es asi es muy posible que no
requieras las columnas: CantidadTotal, CantidadInf, Precio y
PrecioInf.
6. Cual es la llave Primaria de Documento: NumeroMovimiento o
TipoDocumento/NumeroDocumento?. Aun cuando me gusta mas la segunda
voy a asumir la primera que es mas popular.
Para la tabla de movimientos el analisis seria similar, y voy a
asumir que NumeroMovimiento y CodigoArticulo son Llave Primaria y
que las columnas: FechaMovimiento, TipoMovimiento, TipoDocumento,
NumeroDocumento y CodigoCotizacionA son redundantes de Documento, y
por lo tanto no son necesarias y deben eliminarse (normalizacion).
La vista podria quedar asi:
=>> CREATE VIEW MovimientosCompletos
AS
SELECT Movimientos.NumeroMovimiento AS Movimiento
, Movimientos.CodigoArticulo
, Articulo.descripcion
CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.TipoMovimiento
WHEN 'I' THEN 'Ingreso'
WHEN 'S' THEN 'Salida'
WHEN 'D' THEN 'Devolución'
WHEN 'J' THEN 'Ajuste'
END
, Movimientos.TipoDocumento
, Movimientos.NumeroDocumento
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.AlmacenOrigen
WHEN 'I' THEN Proveedor.Nombre
WHEN 'S' THEN 'ALMACEN CENTRAL'
WHEN 'D' THEN Clientes.Nombres
WHEN 'J' THEN Movimientos.AlmacenOrigen
END AS AlmacenOrigen
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.AlmacenDestino
WHEN 'I' THEN 'ALMACEN CENTRAL'
WHEN 'S' THEN Clientes.Nombres
WHEN 'D' THEN 'ALMACEN CENTRAL'
WHEN 'J' THEN Movimientos.AlmacenDestino
END AS AlmacenDestino
, Movimientos.FechaMovimiento
, CASE Movimientos.TipoMovimiento
WHEN 'T' THEN Movimientos.Cantidad
WHEN 'I' THEN Movimientos.Cantidad
WHEN 'S' THEN -Movimientos.Cantidad
WHEN 'D' THEN Movimientos.Cantidad
WHEN 'J' THEN Movimientos.Cantidad
END AS Cantidad
FROM Movimientos
JOIN Articulo
ON Movimientos.CodigoArticulo = Articulo.codigoarticulo
JOIN Documento
ON Documento.NumeroMovimiento=Movimientos.NumeroMovimiento
LEFT OUTER JOIN Proveedor
ON Documento.CodigoProveedor = Proveedor.CodigoProveedor
AND Movimientos.TipoMovimiento='I'
LEFT OUTER JOIN Clientes
ON Documento.CodigoCliente = Clientes.CodigoCliente
AND Movimientos.TipoMovimiento IN ('S', 'D')
WHERE (Movimientos.TipoMovimiento IN ('T', 'I', 'S', 'D', 'J')
=>> Va sin probar asi que disculpa cualquier error de sintaxis.
Prueba a ver como se comporta el rendimiento.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Ricardo Uribe escribio:
Aqui te adjunto los datos que me pides, las dos tablas
intervienen en mi consulta, la respectiva consulta y el
procedimiento que genero de esa consulta.

Gracias por tu interes.

y aqui esta la tabla Movimientos
"Javier Loria" escribió en el mensaje
news:
Hola Ricardo:
Si quieres mandar el DDL de algunas de las Tablas y una de las
consultas talvez podamos revisarlas.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Ricardo Uribe escribio:
Hola grupo, lo unico que queria saber es,como puedo
aumentar un mas la velocidad de mi consulta, primero me
dijeron que creara relaciones y campos clave.

Bueno despues de depurar los datos he podido hacerlo, pero
aun deseo hacerlo mas veloz.

Lo que sucede es que el sistema antiguo que tiene sus datos en
tablas .dbf realiza la misma consulta que yo hago en menos tiempo,
ese sistema esta en entorno DOS, y no se que mas hacer.

Gracias por su ayuda.

Si necesitan que les mande mis consultas y procedimientos o
la estructura de las tablas me lo dicen.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida