Grandes cantidades de datos

14/04/2007 - 03:24 por SoftMedia | Informe spam
Hola a todos,
Estoy desarrollando una aplicación en Winform y una de las cosas que hace es
cargar unos datatable desde unos archivos de texto plano mediante un parser
de texto que me he fabricado, estos archivos cada semana tienen más registros
(ya van por alrededor de 1.000.000). Estos datatables los hago que se cargen
en la base de datos (SQL Server 2005 SE) como una transacción en bloque de
con la siguiente función:

Public Function cargar_tablas(ByVal dt() As DataTable) As Boolean
Dim qs(4) As String
qs(0) = "SELECT * FROM ASUNTOS"
qs(1) = "SELECT * FROM CONTRATOS"
qs(2) = "SELECT * FROM TITULARES"
qs(3) = "SELECT * FROM MOVIMIENTOS"
qs(4) = "SELECT * FROM INTERVINIENTES"

conexion.Open()

Dim trans As SqlTransaction = conexion.BeginTransaction

Try

Dim da0 As New SqlDataAdapter()
Dim cb0 As SqlCommandBuilder = New SqlCommandBuilder(da0)
da0.SelectCommand = New SqlCommand(qs(0), conexion)
da0.SelectCommand.Transaction = trans
da0.Fill(dt(0))
da0.Update(dt(0))

Dim da1 As New SqlDataAdapter()
Dim cb1 As SqlCommandBuilder = New SqlCommandBuilder(da1)
da1.SelectCommand = New SqlCommand(qs(1), conexion)
da1.SelectCommand.Transaction = trans
da1.Fill(dt(1))
da1.Update(dt(1))

Dim da2 As New SqlDataAdapter()
Dim cb2 As SqlCommandBuilder = New SqlCommandBuilder(da2)
da2.SelectCommand = New SqlCommand(qs(2), conexion)
da2.SelectCommand.Transaction = trans
da2.Fill(dt(2))
da2.Update(dt(2))

Dim da3 As New SqlDataAdapter()
Dim cb3 As SqlCommandBuilder = New SqlCommandBuilder(da3)
da3.SelectCommand = New SqlCommand(qs(3), conexion)
da3.SelectCommand.Transaction = trans
da3.Fill(dt(3))
da3.Update(dt(3))

Dim da4 As New SqlDataAdapter()
Dim cb4 As SqlCommandBuilder = New SqlCommandBuilder(da4)
da4.SelectCommand = New SqlCommand(qs(4), conexion)
da4.SelectCommand.Transaction = trans
da4.Fill(dt(4))
da4.Update(dt(4))


trans.Commit()
Catch ex As Exception
trans.Rollback()
conexion.Close()
Return False
End Try
conexion.Close()
Return True
End Function

Hasta aquí todo bien, trada en hacerlo, pero no importa demasiado porque
solo se hace una vez por semana, pero si supierais una mejor manera, mejor.
El problema gordo está en que cuando cargo una de las tablas con muchísimos
registros en un dataset y lo visualizo en un datagridview la operación puede
tardar más de 2 minutos y esto no se puede permitir porque eso si es una
práctica habitual y crítica. Yo solo he trabajado con datasets y pocos
registros y esto se me hace un poco cuesta arriba, ¿Hay alguna manera mejor
para optimizar la carga de este datagridview y en general para tratar con
estas grandes cantidades de registros?
Muchas gracias de antemano.
Un saludo.

Preguntas similare

Leer las respuestas

#16 Daniel A. Calvin - Cooperator Team
17/04/2007 - 02:01 | Informe spam
Hola SoftMedia

Recien leo tue email, busco algo sobre dts y te mando, no son dificiles de
construir.
Por otra parte veo que alguien, Alberto creo, te recomienda Bulk.
Esa es una opción mucho mejor que la del DTS, es mas simple de implementar,
yo seguiría su consejo. :))

Saludos

( ahh, me alegro que te gustarán mi ideas ) :-))
Daniel A. Calvin
Cooperator Team Member
http://www.cooperator.com.ar
Microsoft Certified Professional



"SoftMedia" escribió en el mensaje
news:
Hola Daniel,
Muchas gracias por tus ideas, me han servido para recapacitar y he optado
por rediseñar el asunto de la grilla (como tu la llamas).
Con respecto al DTS decirte que soy un poco novato con estos temas y no se
exáctamente como se hace. ¿Serías tan amable de indicarme los pasos a
seguir
o alguna url donde venga bien explicado? Si ya tengo los datos de las
cinco
tabla sacadas de los archivos de texto en sendos datatables, ¿como hago
para
subirlas al servidor de sql server?

Muchas gracias de nuevo. Eres muy amable.
Recibe un cordial saludo.

"Daniel A. Calvin - Cooperator Team" wrote:

Hola SoftMedia

Dividiría el problema en dos:

1 - Pasar las tablas al SQL:
No sería mucho mas eficiente aramar un paquete DTS para eso?
Hasta podrías agendar su ejecución, el manejo de datos que hace el DTS
es
mucho mas eficiente y rapido.

2 -
> El problema gordo está en que cuando cargo una de las tablas con
> muchísimos
> registros en un dataset y lo visualizo en un datagridview la operación
> puede
> tardar más de 2 minutos y esto no se puede permitir porque eso si es
> una
> práctica habitual y crítica. Yo solo he trabajado con datasets y pocos
> registros y esto se me hace un poco cuesta arriba, ¿Hay alguna manera
> mejor
> para optimizar la carga de este datagridview y en general para tratar
> con
> estas grandes cantidades de registros?
Aquí te hago una pregunta, en realidad mas de unam que yo ya me he
hecho
hace mucho tiempo.

a - Que valor agregado tiene mostrar al usuario una grilla con 100.000
registros o 1000000 ???
b - El usuario puede explotar esa información con facilidad?
c - Que ve o que busca el usuario alli?

Mi conclusión fue:
a - no aporta nada concreto.
b - no puede explotar la información sin ayuda de alguna herramienta
adicional.
c - aquí la respuesta fue variada, tal vez lo que me ayudo a resolver el
problema fue esa variedad.

Que hice:
Cambie la forma de ver el problema, me concentre en el punto c.
Cual era la espectativa del usuario frente a la información ofrecida?
La palabra cñave es esa, INFORMACIÓN, si le muestro 100000 regiustros, o
5000, no le estoy dando información, en el mejor de los casos estoy
mostrando datos.
En función de eso ahora lo que hago es ver que información necesita el
usuario.
Ubicar un cliente?
Registros que cumplan una condición?
Valores agrupados por distintos conceptos?
Etc, etc...

Adopte entonces la filosofía de mostar aquello que represente un valor
concreto para el usuario. Ofreciendo los mecanismos para llegar al nivel
de
detalle necesario.
Pero con la premisa de brindar información, no datos.

Espero que te sirvan las ideas, si necesitas que aclare algo sobre el
particular o que lo haga con ejemplos lo vemos.

Saludos

Daniel A. Calvin
Cooperator Team Member
http://www.cooperator.com.ar
Microsoft Certified Professional






"SoftMedia" escribió en el mensaje
news:
> Hola a todos,
> Estoy desarrollando una aplicación en Winform y una de las cosas que
> hace
> es
> cargar unos datatable desde unos archivos de texto plano mediante un
> parser
> de texto que me he fabricado, estos archivos cada semana tienen más
> registros
> (ya van por alrededor de 1.000.000). Estos datatables los hago que se
> cargen
> en la base de datos (SQL Server 2005 SE) como una transacción en bloque
> de
> con la siguiente función:
>
> Public Function cargar_tablas(ByVal dt() As DataTable) As Boolean
> Dim qs(4) As String
> qs(0) = "SELECT * FROM ASUNTOS"
> qs(1) = "SELECT * FROM CONTRATOS"
> qs(2) = "SELECT * FROM TITULARES"
> qs(3) = "SELECT * FROM MOVIMIENTOS"
> qs(4) = "SELECT * FROM INTERVINIENTES"
>
> conexion.Open()
>
> Dim trans As SqlTransaction = conexion.BeginTransaction
>
> Try
>
> Dim da0 As New SqlDataAdapter()
> Dim cb0 As SqlCommandBuilder = New SqlCommandBuilder(da0)
> da0.SelectCommand = New SqlCommand(qs(0), conexion)
> da0.SelectCommand.Transaction = trans
> da0.Fill(dt(0))
> da0.Update(dt(0))
>
> Dim da1 As New SqlDataAdapter()
> Dim cb1 As SqlCommandBuilder = New SqlCommandBuilder(da1)
> da1.SelectCommand = New SqlCommand(qs(1), conexion)
> da1.SelectCommand.Transaction = trans
> da1.Fill(dt(1))
> da1.Update(dt(1))
>
> Dim da2 As New SqlDataAdapter()
> Dim cb2 As SqlCommandBuilder = New SqlCommandBuilder(da2)
> da2.SelectCommand = New SqlCommand(qs(2), conexion)
> da2.SelectCommand.Transaction = trans
> da2.Fill(dt(2))
> da2.Update(dt(2))
>
> Dim da3 As New SqlDataAdapter()
> Dim cb3 As SqlCommandBuilder = New SqlCommandBuilder(da3)
> da3.SelectCommand = New SqlCommand(qs(3), conexion)
> da3.SelectCommand.Transaction = trans
> da3.Fill(dt(3))
> da3.Update(dt(3))
>
> Dim da4 As New SqlDataAdapter()
> Dim cb4 As SqlCommandBuilder = New SqlCommandBuilder(da4)
> da4.SelectCommand = New SqlCommand(qs(4), conexion)
> da4.SelectCommand.Transaction = trans
> da4.Fill(dt(4))
> da4.Update(dt(4))
>
>
> trans.Commit()
> Catch ex As Exception
> trans.Rollback()
> conexion.Close()
> Return False
> End Try
> conexion.Close()
> Return True
> End Function
>
> Hasta aquí todo bien, trada en hacerlo, pero no importa demasiado
> porque
> solo se hace una vez por semana, pero si supierais una mejor manera,
> mejor.
> El problema gordo está en que cuando cargo una de las tablas con
> muchísimos
> registros en un dataset y lo visualizo en un datagridview la operación
> puede
> tardar más de 2 minutos y esto no se puede permitir porque eso si es
> una
> práctica habitual y crítica. Yo solo he trabajado con datasets y pocos
> registros y esto se me hace un poco cuesta arriba, ¿Hay alguna manera
> mejor
> para optimizar la carga de este datagridview y en general para tratar
> con
> estas grandes cantidades de registros?
> Muchas gracias de antemano.
> Un saludo.



Respuesta Responder a este mensaje
#17 Alberto Poblacion
17/04/2007 - 12:36 | Informe spam
"SoftMedia" wrote in message
news:
Te recuerdo que soy un poco novato en esto así que te voy a hacer una
pregunta puede que te resulte tonta: ¿Donde pongo la sentencia bulk insert



El Bulk Insert lo pones en el texto de un Sql Command, y lo ejecutas con
un ExecuteNonQuery:

void BotonImportarDatos_Click(object sender, EventArgs e)
{
string sentencia ="Bulk Insert etc etc";
SqlCommand cmd = new SqlCommand(sentencia, conexion);
conexion.Open();
cmd.ExecuteNonQuery();
conexion.Close();
}


y dónde he de ubicar los archivos txt y xml?



Estos dos archivos tienen que estar en una ruta que sea accesible al
SERVIDOR Sql, ya que es éste el que los tiene que leer. Cada uno de ellos
puede estar en cualquier carpeta que quieras dentro del disco del servidor.
Lógicamente hay que ponerles en el sistema de archivos los permisos
necesarios para que los pueda leer el usuario bajo el que se ejecuta el
Servicio sql (no el usuario que está lanzando la aplicación cliente).
Respuesta Responder a este mensaje
#18 SoftMedia
17/04/2007 - 13:50 | Informe spam
Gracias de nuevo Alberto,
Siento darte tanto la lata, pero te voy a preguntar una cosa más: Antes de
hacer la carga a la base de datos con el BULK INSERT he de eliminar todos los
registros de la misma si los hubiera, ten en cuenta que esta operación se
hace cada semana. ¿Hay alguna opción parcecida al BULK INSERT para borrar
masivamente los registros de una tabla (o varias tablas a la vez)? ¿Algo como
BULK DELETE?
Muchas gracias por todo, de verdad, me estás siendo de gran ayuda.
Un cordial saludo.

"Alberto Poblacion" wrote:

"SoftMedia" wrote in message
news:
> Te recuerdo que soy un poco novato en esto así que te voy a hacer una
> pregunta puede que te resulte tonta: ¿Donde pongo la sentencia bulk insert

El Bulk Insert lo pones en el texto de un Sql Command, y lo ejecutas con
un ExecuteNonQuery:

void BotonImportarDatos_Click(object sender, EventArgs e)
{
string sentencia ="Bulk Insert etc etc";
SqlCommand cmd = new SqlCommand(sentencia, conexion);
conexion.Open();
cmd.ExecuteNonQuery();
conexion.Close();
}


> y dónde he de ubicar los archivos txt y xml?

Estos dos archivos tienen que estar en una ruta que sea accesible al
SERVIDOR Sql, ya que es éste el que los tiene que leer. Cada uno de ellos
puede estar en cualquier carpeta que quieras dentro del disco del servidor.
Lógicamente hay que ponerles en el sistema de archivos los permisos
necesarios para que los pueda leer el usuario bajo el que se ejecuta el
Servicio sql (no el usuario que está lanzando la aplicación cliente).



Respuesta Responder a este mensaje
#19 Alberto Poblacion
17/04/2007 - 16:33 | Informe spam
"SoftMedia" wrote in message
news:
Siento darte tanto la lata, pero te voy a preguntar una cosa más: Antes de
hacer la carga a la base de datos con el BULK INSERT he de eliminar todos
los
registros de la misma si los hubiera, ten en cuenta que esta operación se
hace cada semana. ¿Hay alguna opción parcecida al BULK INSERT para borrar
masivamente los registros de una tabla (o varias tablas a la vez)? ¿Algo
como
BULK DELETE?



Si: TRUNCATE TABLE
Respuesta Responder a este mensaje
#20 SoftMedia
19/04/2007 - 21:52 | Informe spam
Hola Alberto, muchas gracias por toda tu ayuda.
Ha habido un cambio en la forma de actuar por parte de mi cliente. Hasta
ahora la forma de actuar era la siguiente: Se elimina la tabla de la base de
datos que contenía los datos del último archivo de texto recibido y se
introducen los datos del nuevo archivo recibido, con lo cual se machaca toda
la información anterior al ser borrado los anteriores datos de la tabla.
Ahora este señor quiere que cuando les llegue el nuevo archivo no machaque
los datos anteriores, sino que solo modifique los datos diferentes (a nivel
de campo) e inserte los nuevos registros.
¿Hay alguna manera fácil de hacer esto en SQL Server 2005/ADO.NET?
Muchas gracias de nuevo.


"Alberto Poblacion" wrote:

"SoftMedia" wrote in message
news:
> Siento darte tanto la lata, pero te voy a preguntar una cosa más: Antes de
> hacer la carga a la base de datos con el BULK INSERT he de eliminar todos
> los
> registros de la misma si los hubiera, ten en cuenta que esta operación se
> hace cada semana. ¿Hay alguna opción parcecida al BULK INSERT para borrar
> masivamente los registros de una tabla (o varias tablas a la vez)? ¿Algo
> como
> BULK DELETE?

Si: TRUNCATE TABLE



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