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.
 

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.

Preguntas similares