Replicacion Manual con VB6 y SQL2000

14/12/2004 - 16:53 por Davo | Informe spam
Que tal amigos. Tengo el siguiente problema.

Introduccion:
Desde hace un año implemente un metodo de replicación entre varios puntos de
venta y el servidor principal, diariamente, en las noches, genero un archivo
al que llamo ORIGEN, por cada punto de venta que contiene los registros
modificados o incluidos en el sistema de todas las tablas, esto por medio de
dos campos fecha_inclusion y fecha_modifico.

Problema:
el proceso completo funciona muy bien, pero han crecido los puntos de venta
y la informacion tambien, y necesito agilizar el proceso de replicacion en el
servidor principal para poder meter otras funcionalidades y todo se pueda
realizar en la misma noche.

El atraso principal se produce en dos tablas: la primera es CLI_CLIENTES que
almacena un 3.5 millones de registros y la otra es FACTURAS que tiene unos
100,000 registros, la primera es muy lenta, el proceso de actualizacion o
inclusio de un registro dura aprox. 1 segundo, que me parece es mucho. Estas
tablas son las que mas relaciones guardan con otras tablas, y tienen mas
indices:

CLI_CLIENTES
- 3.5 millones de registros
- 10 referencia de llaves foraneas (le hacen referencia).
- Llave primaria Clustered (Tipo ID y ID)
- Indice (Nombre, Apellido1, Apellido2) Fillfactor 90
- Indice (Nombre, clase cliente) Fillfactor 90
- Indice (Sucursal, Fecha modifico) Fillfactor 90
- Tiene 50 campos

FACTURAS
- 100,000 registros
- 15 referencias de llaves foraneas
- Llave primaria Clustered (Sucursal, Numero, Tipo, Fecha)
- Tiene 36 campos

El programa replicador esta hecho en Visual Basic 6.0, y a continuacion esta
el codigo principal:

'Esto por cada tabla
While Not Origen.EOF
g_cnnBaseDato.BeginTransaction

'crea un select con las llaves primarias que consulta el registro en el
servidor principal
strSQL = CrearSQLReplica(txtTablaActual, Origen.Fields, oTable.Columns)

'abro el registro
Set rstReplica = g_cnnBaseDato.AbrirRecordset(strSQL, adOpenDynamic,
adLockOptimistic)

'verifica si actualiza o inserta
If rstReplica.EOF And rstReplica.BOF Then 'nuevo
rstReplica.AddNew
nContInserta = nContInserta + 1
Else
nContActualiza = nContActualiza + 1
End if

'procede a replicar todos los campos de la tabla
For Each rstField In rstOrigen.Fields
rstReplica(rstField.Name) = rstField.Value
Next rstField

rstReplica.Update

g_cnnBaseDato.CommitTransaction

rstOrigen.MoveNext
Wend

Me gustaria saber que soluciones o pruebas puedo hacer para poder mejorar el
tiempo de replicacion especificamente en esas tablas, quizas el problema
pueda estar en los indices o las referencias con otras tablas o alguna
configuracion que no he aplicado, tambien podría estar mal el codigo que
implemente. Espero me puedan dar alguna referencia de como solucionar este
problema.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristán
14/12/2004 - 16:58 | Informe spam
Bueno, si no puedes usar alguna de las opciones de replicación que tiene
ya SQL Server, también podrías usar los DTS para exportar e importar esos
datos. En cualquiera de los casos, te aseguro que va a ser más rápido y más
seguro que el programa que realizaste


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Davo" escribió en el mensaje
news:
Que tal amigos. Tengo el siguiente problema.

Introduccion:
Desde hace un año implemente un metodo de replicación entre varios puntos


de
venta y el servidor principal, diariamente, en las noches, genero un


archivo
al que llamo ORIGEN, por cada punto de venta que contiene los registros
modificados o incluidos en el sistema de todas las tablas, esto por medio


de
dos campos fecha_inclusion y fecha_modifico.

Problema:
el proceso completo funciona muy bien, pero han crecido los puntos de


venta
y la informacion tambien, y necesito agilizar el proceso de replicacion en


el
servidor principal para poder meter otras funcionalidades y todo se pueda
realizar en la misma noche.

El atraso principal se produce en dos tablas: la primera es CLI_CLIENTES


que
almacena un 3.5 millones de registros y la otra es FACTURAS que tiene unos
100,000 registros, la primera es muy lenta, el proceso de actualizacion o
inclusio de un registro dura aprox. 1 segundo, que me parece es mucho.


Estas
tablas son las que mas relaciones guardan con otras tablas, y tienen mas
indices:

CLI_CLIENTES
- 3.5 millones de registros
- 10 referencia de llaves foraneas (le hacen referencia).
- Llave primaria Clustered (Tipo ID y ID)
- Indice (Nombre, Apellido1, Apellido2) Fillfactor 90
- Indice (Nombre, clase cliente) Fillfactor 90
- Indice (Sucursal, Fecha modifico) Fillfactor 90
- Tiene 50 campos

FACTURAS
- 100,000 registros
- 15 referencias de llaves foraneas
- Llave primaria Clustered (Sucursal, Numero, Tipo, Fecha)
- Tiene 36 campos

El programa replicador esta hecho en Visual Basic 6.0, y a continuacion


esta
el codigo principal:

'Esto por cada tabla
While Not Origen.EOF
g_cnnBaseDato.BeginTransaction

'crea un select con las llaves primarias que consulta el registro en el
servidor principal
strSQL = CrearSQLReplica(txtTablaActual, Origen.Fields, oTable.Columns)

'abro el registro
Set rstReplica = g_cnnBaseDato.AbrirRecordset(strSQL, adOpenDynamic,
adLockOptimistic)

'verifica si actualiza o inserta
If rstReplica.EOF And rstReplica.BOF Then 'nuevo
rstReplica.AddNew
nContInserta = nContInserta + 1
Else
nContActualiza = nContActualiza + 1
End if

'procede a replicar todos los campos de la tabla
For Each rstField In rstOrigen.Fields
rstReplica(rstField.Name) = rstField.Value
Next rstField

rstReplica.Update

g_cnnBaseDato.CommitTransaction

rstOrigen.MoveNext
Wend

Me gustaria saber que soluciones o pruebas puedo hacer para poder mejorar


el
tiempo de replicacion especificamente en esas tablas, quizas el problema
pueda estar en los indices o las referencias con otras tablas o alguna
configuracion que no he aplicado, tambien podría estar mal el codigo que
implemente. Espero me puedan dar alguna referencia de como solucionar este
problema.
Respuesta Responder a este mensaje
#2 Davo
14/12/2004 - 17:29 | Informe spam
Lo que pasa es que todos los puntos de venta no estan en línea, en la noche
se hace un conexion conmutada y se traen los archivos, que son select
salvados a un archivo y compresos.

Para aplicar DTS implicaria cambiar completamente el proceso de migración y
no podemos darnos ese lujo, por ahora no, ademas siento que tengo mas control
de todo el proceso de la migración por medio de VB6, en primera instancia los
DTS fueron una opción, pero estamos tratando de implementar un replicacion
manual de dos vias, no solo traer sino tambien enviarle todos los datos
procesados a los puntos de venta, ademas de guardar bitacoras y tirar
reportes que indiquen las fallas de la migración y por nos inclinamos por VB6.

Quizas me podrías dar alguna pista de como agarrar un recordset guardado en
disco y procesarlo con DTS, porque podria hacer un hibrido, el codigo que
puse indica claramente el proceso que se hace con cada recordset.

Gracias por tu aporte y tu tiempo.

"Carlos Sacristán" escribió:

Bueno, si no puedes usar alguna de las opciones de replicación que tiene
ya SQL Server, también podrías usar los DTS para exportar e importar esos
datos. En cualquiera de los casos, te aseguro que va a ser más rápido y más
seguro que el programa que realizaste


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Davo" escribió en el mensaje
news:
> Que tal amigos. Tengo el siguiente problema.
>
> Introduccion:
> Desde hace un año implemente un metodo de replicación entre varios puntos
de
> venta y el servidor principal, diariamente, en las noches, genero un
archivo
> al que llamo ORIGEN, por cada punto de venta que contiene los registros
> modificados o incluidos en el sistema de todas las tablas, esto por medio
de
> dos campos fecha_inclusion y fecha_modifico.
>
> Problema:
> el proceso completo funciona muy bien, pero han crecido los puntos de
venta
> y la informacion tambien, y necesito agilizar el proceso de replicacion en
el
> servidor principal para poder meter otras funcionalidades y todo se pueda
> realizar en la misma noche.
>
> El atraso principal se produce en dos tablas: la primera es CLI_CLIENTES
que
> almacena un 3.5 millones de registros y la otra es FACTURAS que tiene unos
> 100,000 registros, la primera es muy lenta, el proceso de actualizacion o
> inclusio de un registro dura aprox. 1 segundo, que me parece es mucho.
Estas
> tablas son las que mas relaciones guardan con otras tablas, y tienen mas
> indices:
>
> CLI_CLIENTES
> - 3.5 millones de registros
> - 10 referencia de llaves foraneas (le hacen referencia).
> - Llave primaria Clustered (Tipo ID y ID)
> - Indice (Nombre, Apellido1, Apellido2) Fillfactor 90
> - Indice (Nombre, clase cliente) Fillfactor 90
> - Indice (Sucursal, Fecha modifico) Fillfactor 90
> - Tiene 50 campos
>
> FACTURAS
> - 100,000 registros
> - 15 referencias de llaves foraneas
> - Llave primaria Clustered (Sucursal, Numero, Tipo, Fecha)
> - Tiene 36 campos
>
> El programa replicador esta hecho en Visual Basic 6.0, y a continuacion
esta
> el codigo principal:
>
> 'Esto por cada tabla
> While Not Origen.EOF
> g_cnnBaseDato.BeginTransaction
>
> 'crea un select con las llaves primarias que consulta el registro en el
> servidor principal
> strSQL = CrearSQLReplica(txtTablaActual, Origen.Fields, oTable.Columns)
>
> 'abro el registro
> Set rstReplica = g_cnnBaseDato.AbrirRecordset(strSQL, adOpenDynamic,
> adLockOptimistic)
>
> 'verifica si actualiza o inserta
> If rstReplica.EOF And rstReplica.BOF Then 'nuevo
> rstReplica.AddNew
> nContInserta = nContInserta + 1
> Else
> nContActualiza = nContActualiza + 1
> End if
>
> 'procede a replicar todos los campos de la tabla
> For Each rstField In rstOrigen.Fields
> rstReplica(rstField.Name) = rstField.Value
> Next rstField
>
> rstReplica.Update
>
> g_cnnBaseDato.CommitTransaction
>
> rstOrigen.MoveNext
> Wend
>
> Me gustaria saber que soluciones o pruebas puedo hacer para poder mejorar
el
> tiempo de replicacion especificamente en esas tablas, quizas el problema
> pueda estar en los indices o las referencias con otras tablas o alguna
> configuracion que no he aplicado, tambien podría estar mal el codigo que
> implemente. Espero me puedan dar alguna referencia de como solucionar este
> problema.



Respuesta Responder a este mensaje
#3 Javier Loria
14/12/2004 - 22:29 | Informe spam
Hola:
Es natural que tarde tanto si lo haces de esta forma, 1 segundo por fila
me parece "razonable".
Otra forma de hacerlo seria:
a) Traer el archivo Origen
b) Subirlo por BCP a una Tabla Temporal o Intermedia
c) En codigo T-SQL hacer las comparaciones y modificar los datos en
bloque. Realizar las 3 operaciones, Borrado, Actualizacion e Insercion.
Esto debe ser varios cientos de veces mas rapido, pero requiere mas
trabajo.
Si es una arquitectura que quisieras hacer podriamos revisar los
detalles,
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

"Davo" wrote in message
news:
Que tal amigos. Tengo el siguiente problema.

Introduccion:
Desde hace un año implemente un metodo de replicación entre varios puntos


de
venta y el servidor principal, diariamente, en las noches, genero un


archivo
al que llamo ORIGEN, por cada punto de venta que contiene los registros
modificados o incluidos en el sistema de todas las tablas, esto por medio


de
dos campos fecha_inclusion y fecha_modifico.

Problema:
el proceso completo funciona muy bien, pero han crecido los puntos de


venta
y la informacion tambien, y necesito agilizar el proceso de replicacion en


el
servidor principal para poder meter otras funcionalidades y todo se pueda
realizar en la misma noche.

El atraso principal se produce en dos tablas: la primera es CLI_CLIENTES


que
almacena un 3.5 millones de registros y la otra es FACTURAS que tiene unos
100,000 registros, la primera es muy lenta, el proceso de actualizacion o
inclusio de un registro dura aprox. 1 segundo, que me parece es mucho.


Estas
tablas son las que mas relaciones guardan con otras tablas, y tienen mas
indices:

CLI_CLIENTES
- 3.5 millones de registros
- 10 referencia de llaves foraneas (le hacen referencia).
- Llave primaria Clustered (Tipo ID y ID)
- Indice (Nombre, Apellido1, Apellido2) Fillfactor 90
- Indice (Nombre, clase cliente) Fillfactor 90
- Indice (Sucursal, Fecha modifico) Fillfactor 90
- Tiene 50 campos

FACTURAS
- 100,000 registros
- 15 referencias de llaves foraneas
- Llave primaria Clustered (Sucursal, Numero, Tipo, Fecha)
- Tiene 36 campos

El programa replicador esta hecho en Visual Basic 6.0, y a continuacion


esta
el codigo principal:

'Esto por cada tabla
While Not Origen.EOF
g_cnnBaseDato.BeginTransaction

'crea un select con las llaves primarias que consulta el registro en el
servidor principal
strSQL = CrearSQLReplica(txtTablaActual, Origen.Fields, oTable.Columns)

'abro el registro
Set rstReplica = g_cnnBaseDato.AbrirRecordset(strSQL, adOpenDynamic,
adLockOptimistic)

'verifica si actualiza o inserta
If rstReplica.EOF And rstReplica.BOF Then 'nuevo
rstReplica.AddNew
nContInserta = nContInserta + 1
Else
nContActualiza = nContActualiza + 1
End if

'procede a replicar todos los campos de la tabla
For Each rstField In rstOrigen.Fields
rstReplica(rstField.Name) = rstField.Value
Next rstField

rstReplica.Update

g_cnnBaseDato.CommitTransaction

rstOrigen.MoveNext
Wend

Me gustaria saber que soluciones o pruebas puedo hacer para poder mejorar


el
tiempo de replicacion especificamente en esas tablas, quizas el problema
pueda estar en los indices o las referencias con otras tablas o alguna
configuracion que no he aplicado, tambien podría estar mal el codigo que
implemente. Espero me puedan dar alguna referencia de como solucionar este
problema.
Respuesta Responder a este mensaje
#4 Davo
15/12/2004 - 18:05 | Informe spam
Gracias Javier, como dices eso implicaria mas trabajo, y cambiar todo el
procedimiento actual, ayer me puse a hacer pruebas quitando referencias,
indices y llaves a la tabla problematica y he logrado mejorar el tiempo de
actualizacion por registro, ademas encontre unos trigers que afectaban el
rendimiento, con todo eso he logrado bajar el tiempo de todo el procesamiento
en un 50%, que es mas que suficiente.

"Javier Loria" wrote:

Hola:
Es natural que tarde tanto si lo haces de esta forma, 1 segundo por fila
me parece "razonable".
Otra forma de hacerlo seria:
a) Traer el archivo Origen
b) Subirlo por BCP a una Tabla Temporal o Intermedia
c) En codigo T-SQL hacer las comparaciones y modificar los datos en
bloque. Realizar las 3 operaciones, Borrado, Actualizacion e Insercion.
Esto debe ser varios cientos de veces mas rapido, pero requiere mas
trabajo.
Si es una arquitectura que quisieras hacer podriamos revisar los
detalles,
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

"Davo" wrote in message
news:
> Que tal amigos. Tengo el siguiente problema.
>
> Introduccion:
> Desde hace un año implemente un metodo de replicación entre varios puntos
de
> venta y el servidor principal, diariamente, en las noches, genero un
archivo
> al que llamo ORIGEN, por cada punto de venta que contiene los registros
> modificados o incluidos en el sistema de todas las tablas, esto por medio
de
> dos campos fecha_inclusion y fecha_modifico.
>
> Problema:
> el proceso completo funciona muy bien, pero han crecido los puntos de
venta
> y la informacion tambien, y necesito agilizar el proceso de replicacion en
el
> servidor principal para poder meter otras funcionalidades y todo se pueda
> realizar en la misma noche.
>
> El atraso principal se produce en dos tablas: la primera es CLI_CLIENTES
que
> almacena un 3.5 millones de registros y la otra es FACTURAS que tiene unos
> 100,000 registros, la primera es muy lenta, el proceso de actualizacion o
> inclusio de un registro dura aprox. 1 segundo, que me parece es mucho.
Estas
> tablas son las que mas relaciones guardan con otras tablas, y tienen mas
> indices:
>
> CLI_CLIENTES
> - 3.5 millones de registros
> - 10 referencia de llaves foraneas (le hacen referencia).
> - Llave primaria Clustered (Tipo ID y ID)
> - Indice (Nombre, Apellido1, Apellido2) Fillfactor 90
> - Indice (Nombre, clase cliente) Fillfactor 90
> - Indice (Sucursal, Fecha modifico) Fillfactor 90
> - Tiene 50 campos
>
> FACTURAS
> - 100,000 registros
> - 15 referencias de llaves foraneas
> - Llave primaria Clustered (Sucursal, Numero, Tipo, Fecha)
> - Tiene 36 campos
>
> El programa replicador esta hecho en Visual Basic 6.0, y a continuacion
esta
> el codigo principal:
>
> 'Esto por cada tabla
> While Not Origen.EOF
> g_cnnBaseDato.BeginTransaction
>
> 'crea un select con las llaves primarias que consulta el registro en el
> servidor principal
> strSQL = CrearSQLReplica(txtTablaActual, Origen.Fields, oTable.Columns)
>
> 'abro el registro
> Set rstReplica = g_cnnBaseDato.AbrirRecordset(strSQL, adOpenDynamic,
> adLockOptimistic)
>
> 'verifica si actualiza o inserta
> If rstReplica.EOF And rstReplica.BOF Then 'nuevo
> rstReplica.AddNew
> nContInserta = nContInserta + 1
> Else
> nContActualiza = nContActualiza + 1
> End if
>
> 'procede a replicar todos los campos de la tabla
> For Each rstField In rstOrigen.Fields
> rstReplica(rstField.Name) = rstField.Value
> Next rstField
>
> rstReplica.Update
>
> g_cnnBaseDato.CommitTransaction
>
> rstOrigen.MoveNext
> Wend
>
> Me gustaria saber que soluciones o pruebas puedo hacer para poder mejorar
el
> tiempo de replicacion especificamente en esas tablas, quizas el problema
> pueda estar en los indices o las referencias con otras tablas o alguna
> configuracion que no he aplicado, tambien podría estar mal el codigo que
> implemente. Espero me puedan dar alguna referencia de como solucionar este
> problema.



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