Una tabla por cada año y UNION

09/10/2004 - 12:13 por Pedro Jose Caceres | Informe spam
Tengo una tabla de movimientos para cada año, MOV2003, MOV2004, etc.
Cuando se cierra un año por tanto, tengo que crear la nueva tabla
correspondiente al nuevo año. Puedo hacer el CREATE TABLE en t-sql sin
tener que sacar los usuarios del sistema ? Como puedo tomar la estructura de
otra de las tablas ya existentes para que se cree igual ?

Otra cosa es que para en una consulta ver movimientos que abarque dos o mas
años, hago una UNION, preparando dinamicamente la instruccion SELECT desde
la aplicacion y enviandola por odbc al servidor. Por ej. si la lista de
movimientos abarca va desde el 01/04/2001 al 31/03/2004, estoy armando desde
el front-end la union asi::


SELECT columna1, .., from MOV2001 WHERE ITEM='ELITEM' FECHA>/04/2001
UNION
SELECT columna1, .., from MOV2002 WHERE ITEM='ELITEM'
UNION
SELECT columna1, .., from MOV2003 WHERE ITEM='ELITEM'
UNION
SELECT columna1, .., from MOV2004 WHERE FECHA<1/03/2004
ORDER BY FECHA


Consideran que sea esta la mejor forma para hacer esto ?

De no ser, que otras opciones hay para extraer esta informacion quizas en un
SP del mismo servidor?

Gracias

Preguntas similare

Leer las respuestas

#1 Miguel Egea
09/10/2004 - 16:32 | Informe spam
1. No hace falta que saques a los usuarios, genera el script de tu tabla y
lo puedes lanzar con otro nombre cuando quieras
2.- No uses union, usa en todo caso UNION ALL, union te hace la intersección
(de elementos disjuntos en tu caso) después de traerse los daots.
3.- No se como es de grande tu tabla de movimientos ni que te ha llevado a
partirla, ni cual es su clave primaria y que tamaño tiene, así que si no te
va mal, debe ser una opción adecuada, si te va mal cuentanos que sintomas
tiene y vemos que remedios podemos poner..


-
Miguel Egea Gómez
Microsoft SQL-Server MVP
Webmaster de PortalSql.Com
¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?


"Pedro Jose Caceres" escribió en el mensaje
news:%
Tengo una tabla de movimientos para cada año, MOV2003, MOV2004, etc.
Cuando se cierra un año por tanto, tengo que crear la nueva tabla
correspondiente al nuevo año. Puedo hacer el CREATE TABLE en t-sql sin
tener que sacar los usuarios del sistema ? Como puedo tomar la estructura


de
otra de las tablas ya existentes para que se cree igual ?

Otra cosa es que para en una consulta ver movimientos que abarque dos o


mas
años, hago una UNION, preparando dinamicamente la instruccion SELECT


desde
la aplicacion y enviandola por odbc al servidor. Por ej. si la lista de
movimientos abarca va desde el 01/04/2001 al 31/03/2004, estoy armando


desde
el front-end la union asi::


SELECT columna1, .., from MOV2001 WHERE ITEM='ELITEM' FECHA>/04/2001
UNION
SELECT columna1, .., from MOV2002 WHERE ITEM='ELITEM'
UNION
SELECT columna1, .., from MOV2003 WHERE ITEM='ELITEM'
UNION
SELECT columna1, .., from MOV2004 WHERE FECHA<1/03/2004
ORDER BY FECHA


Consideran que sea esta la mejor forma para hacer esto ?

De no ser, que otras opciones hay para extraer esta informacion quizas en


un
SP del mismo servidor?

Gracias


Respuesta Responder a este mensaje
#2 Javier Loria
09/10/2004 - 16:46 | Informe spam
Hola:
El problema de esas tabla es que producen una perdida de desempeno
importante, asi que considera la posiblidad de unirlas en una sola tabla, a
menos que cada una de ellas tenga su propio disco duro o arreglo de discos.
Adicionalmente si no quieres fusionarlas lo mejor seria, usando la
recomendacion de Miguel, crear una vista del tipo:
CREATE VIEW Movimientos(Columna1, )
FROM
SELECT Columna1, Columna2 FROM Mov2001
UNION ALL -- *** ALL es muy importante
SELECT Columna1, Columna2 FROM Mov2002
UNION ALL

Luego podras hacer un SELECT:
SELECT Columna1, ... FROM Movimientos
WHERE ITEM='xyz' FECHA>='01/04/2001'
Que sera muy rapido, porque por las estadisticas de SQL el sabra que
ninguna de las tablas, excepto la de Mov2004 tiene datos que cumplan la
condicion de las fechas..
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

"Pedro Jose Caceres" wrote in message
news:#
Tengo una tabla de movimientos para cada año, MOV2003, MOV2004, etc.
Cuando se cierra un año por tanto, tengo que crear la nueva tabla
correspondiente al nuevo año. Puedo hacer el CREATE TABLE en t-sql sin
tener que sacar los usuarios del sistema ? Como puedo tomar la estructura


de
otra de las tablas ya existentes para que se cree igual ?

Otra cosa es que para en una consulta ver movimientos que abarque dos o


mas
años, hago una UNION, preparando dinamicamente la instruccion SELECT


desde
la aplicacion y enviandola por odbc al servidor. Por ej. si la lista de
movimientos abarca va desde el 01/04/2001 al 31/03/2004, estoy armando


desde
el front-end la union asi::


SELECT columna1, .., from MOV2001 WHERE ITEM='ELITEM' FECHA>/04/2001
UNION
SELECT columna1, .., from MOV2002 WHERE ITEM='ELITEM'
UNION
SELECT columna1, .., from MOV2003 WHERE ITEM='ELITEM'
UNION
SELECT columna1, .., from MOV2004 WHERE FECHA<1/03/2004
ORDER BY FECHA


Consideran que sea esta la mejor forma para hacer esto ?

De no ser, que otras opciones hay para extraer esta informacion quizas en


un
SP del mismo servidor?

Gracias


Respuesta Responder a este mensaje
#3 Claudio Valdés
09/10/2004 - 17:20 | Informe spam
Hola te recomeindo generar un SP parecido al siguiente, solo tendrias que
cambiar la definición de la tabla

Create procedure TabladeMovimientos @ANO nvarchar(4)
As
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MOV' +
@ANO + ']') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
RAISERROR('La tabla de movimientos que intenta crear para el año ' +
@ANO + ' ya existe...',16,1)
Else
Begin
declare @sql nvarchar(4000)
set @sql='CREATE TABLE [dbo].[MOV'+ @ANO +'] (
[prodcodbar] [nvarchar] (15) COLLATE
Modern_Spanish_CI_AS NOT NULL ,
[Description] [ntext] COLLATE Modern_Spanish_CI_AS
NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]'
exec(@sql)
End

de esta forma solo le pasas el año

exec TabladeMovimientos '2004'

Para el asunto de la consulta sobre todas las tablas, no se si el campo por
el que estas comparando sea de tipo fecha y si es así te aconsejaria hacer
una pequeña conversión para que puedas hacer una buena comparación de la
fecha

cast(select convert(nvarchar(10),FECHA,112) as int) 010401

Atte,
Claudio Valdés

"Pedro Jose Caceres" escribió en el mensaje
news:#
Tengo una tabla de movimientos para cada año, MOV2003, MOV2004, etc.
Cuando se cierra un año por tanto, tengo que crear la nueva tabla
correspondiente al nuevo año. Puedo hacer el CREATE TABLE en t-sql sin
tener que sacar los usuarios del sistema ? Como puedo tomar la estructura


de
otra de las tablas ya existentes para que se cree igual ?

Otra cosa es que para en una consulta ver movimientos que abarque dos o


mas
años, hago una UNION, preparando dinamicamente la instruccion SELECT


desde
la aplicacion y enviandola por odbc al servidor. Por ej. si la lista de
movimientos abarca va desde el 01/04/2001 al 31/03/2004, estoy armando


desde
el front-end la union asi::


SELECT columna1, .., from MOV2001 WHERE ITEM='ELITEM' FECHA>/04/2001
UNION
SELECT columna1, .., from MOV2002 WHERE ITEM='ELITEM'
UNION
SELECT columna1, .., from MOV2003 WHERE ITEM='ELITEM'
UNION
SELECT columna1, .., from MOV2004 WHERE FECHA<1/03/2004
ORDER BY FECHA


Consideran que sea esta la mejor forma para hacer esto ?

De no ser, que otras opciones hay para extraer esta informacion quizas en


un
SP del mismo servidor?

Gracias


Respuesta Responder a este mensaje
#4 Pedro Jose Caceres
09/10/2004 - 18:04 | Informe spam
2.- No uses union, usa en todo caso UNION ALL, union te hace la


intersección
(de elementos disjuntos en tu caso) después de traerse los daots.



Si.. fue un error de redaccion.

3.- No se como es de grande tu tabla de movimientos ni que te ha llevado a
partirla, ni cual es su clave primaria y que tamaño tiene, así que si no


te
va mal, debe ser una opción adecuada, si te va mal cuentanos que sintomas
tiene y vemos que remedios podemos poner..




Tienen varios millones de registros cada tabla. La clave primaria es Doc_No,
Acc_No (documento y cuenta). Lo que me ha llevado a partirlas es que la
mayoria de los registros (se registran muchas operaciones diarias) se hacen
con fecha del año actual, por tanto no veo la necesidad de tener todo
junto.. Las de los años anteriores se consultan de vez en cuando pero para
reportes historicos o estadisticos o lista de movimientos por cuenta o
documento o fecha.

Ademas, es que lei creo en este mismo foro que mientras mayor es la tabla
mas lento se hace todo, las actualizaciones, triggers, etc. etc.. A veces
uno se confunde pues las opiniones son en algunos casos contradictorias.

Ahora bien, es que la UNION no es del todo recomendable ? que diferencia
habria en yo entonces recorrerlas desde mi aplicacion e ir posteando un
query separado para cada tabla y luego hacer la union ya en la aplicacion ?
Respuesta Responder a este mensaje
#5 Pedro Jose Caceres
09/10/2004 - 18:12 | Informe spam
Hola:
El problema de esas tabla es que producen una perdida de desempeno
importante, asi que considera la posiblidad de unirlas en una sola tabla,




Muchas gracias por la respuesta. Pero
Ok.. entonces por qué algunos dicen que el tamaño de las tablas es
inversamente proporcional al buen desempeño ?
A saber, son tablas de varios millones de registros (entre 4 y 5 millones) y
son de operaciones diarias de uso intensivo y lo de la separacion viene
porque los nuevos registros son casi invariablemente de fecha del año
actual, por tanto las demas no se utilizan a menos que sea en reportes y
consultas historicas.
Como le dije a Miguel arriba, la razon de partirlas fue basicamente buscando
mayor eficiencia en el registro diario de operaciones y creo que lei por ahi
que esa era una forma de eficientizarlo.
La verdad que a veces uno leyendo tantas opiniones distintas no sabe por
donde irse. :)

a
menos que cada una de ellas tenga su propio disco duro o arreglo de


discos.
Adicionalmente si no quieres fusionarlas lo mejor seria, usando la
recomendacion de Miguel, crear una vista del tipo:
> CREATE VIEW Movimientos(Columna1, )
FROM
SELECT Columna1, Columna2 FROM Mov2001
UNION ALL -- *** ALL es muy importante
SELECT Columna1, Columna2 FROM Mov2002
UNION ALL





El problema es que la cerrar cada año, como dije arriba hay que crear una
nueva tabla MovAAAA entonces implicaria modificar la vista ? esto se podria
hacer en t-sql tambien ?


> Luego podras hacer un SELECT:
> SELECT Columna1, ... FROM Movimientos
WHERE ITEM='xyz' FECHA>='01/04/2001'
> Que sera muy rapido, porque por las estadisticas de SQL el sabra que
ninguna de las tablas, excepto la de Mov2004 tiene datos que cumplan la
condicion de las fechas..
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

"Pedro Jose Caceres" wrote in message
news:#
> Tengo una tabla de movimientos para cada año, MOV2003, MOV2004, etc.
> Cuando se cierra un año por tanto, tengo que crear la nueva tabla
> correspondiente al nuevo año. Puedo hacer el CREATE TABLE en t-sql sin
> tener que sacar los usuarios del sistema ? Como puedo tomar la


estructura
de
> otra de las tablas ya existentes para que se cree igual ?
>
> Otra cosa es que para en una consulta ver movimientos que abarque dos o
mas
> años, hago una UNION, preparando dinamicamente la instruccion SELECT
desde
> la aplicacion y enviandola por odbc al servidor. Por ej. si la lista de
> movimientos abarca va desde el 01/04/2001 al 31/03/2004, estoy armando
desde
> el front-end la union asi::
>
>
> SELECT columna1, .., from MOV2001 WHERE ITEM='ELITEM'


FECHA>/04/2001
> UNION
> SELECT columna1, .., from MOV2002 WHERE ITEM='ELITEM'
> UNION
> SELECT columna1, .., from MOV2003 WHERE ITEM='ELITEM'
> UNION
> SELECT columna1, .., from MOV2004 WHERE FECHA<1/03/2004
> ORDER BY FECHA
>
>
> Consideran que sea esta la mejor forma para hacer esto ?
>
> De no ser, que otras opciones hay para extraer esta informacion quizas


en
un
> SP del mismo servidor?
>
> Gracias
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida