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