Mejoras de Rendimiento en entornos SQL CE – I

Una de las cosas que debemos de tener muy en cuenta a la hora de trabajar con dispositivos móviles, es el rendimiento. Ya sabemos que pronto saldrán, si es que no lo han echo ya móviles con doble procesador y demás, pero no dejamos de necesitar controlar mas nuestro entorno en un dispositivo móvil que en un equipo de sobremesa.

Últimamente a nadie se le escapa que cualquier desarrollador en entornos de escritorio, sencillos, ha (hemos) dejado un poco de lado esta parte de rendimiento, ordenadores con 8 Gb de Ram, 4 núcleos, etc, etc, hacen que el rendimiento este en tu lista de requisitos bastante alejado de las primeras posiciones.

Como he comentado, nos encontramos con otro tipo de entornos y si queremos hacer buenas aplicaciones empresariales para Windows Phone 7 ya no puede estar el rendimiento al fondo de la lista de requisitos, sino mas bien al contrario, si no es la primera será la segunda.

El uso de SQL CE como base de datos relacional en una de nuestras aplicaciones hace que tengamos a parte un elemento mas de saturación de rendimiento, nuestra aplicación y los propios procesos internos que debe de hacer SQL CE. Pero es bastante sencillo seguir una serie de consejos que aplicándolos nos ahorran bastante tiempo de proceso.

Inserción de Datos.

Nuestro amigo el Insert. Esto que voy a comentar es mas de sentido común que de forma de hacerlo especial para ganar rendimiento.

Pongamos por ejemplo el mapeo de esta sencilla tabla.

[Table]

public class Tabla1

{

    [Column(IsPrimaryKey=true, IsDbGenerated=true)]

    public int ID { get; set; }

 

    [Column]

    public string Nombre { get; set; }

 

    [Column]

    public string Apellidos { get; set; }

 

    [Column]

    public string Email { get; set; }

}

Como digo, una sencilla tabla con 4 campos y clave primaria entera auto incremental.

Si realizamos la inserción por ejemplo de 1000 filas, podemos hacerlo básicamente de 3 formas:

Utilizando InsertOnSubmit y seguidamente realizar un SubmitChanges

Tabla1 Dato;

using (ContextoDatos Contexto = new ContextoDatos(CadenadeConexion))

{

    for (int i = 0; i < int.Parse(NRegistros.Text); i++)

    {

        Dato = new Tabla1();

        Dato.Nombre = "Nombre " + i.ToString();

        Dato.Apellidos = "Apellidos " + i.ToString();

        Dato.Email = "Email" + i.ToString() + "@live" + i.ToString() + ".com";

 

        Contexto.Personas1.InsertOnSubmit(Dato);

        Contexto.SubmitChanges();

    }

}

Utilizando también el InsertOnSubmit pero dejar el SubmitChanges para el final

Tabla1 Dato;

using (ContextoDatos Contexto = new ContextoDatos(CadenadeConexion))

{

    for (int i = 0; i < int.Parse(NRegistros.Text); i++)

    {

        Dato = new Tabla1();

        Dato.Nombre = "Nombre " + i.ToString();

        Dato.Apellidos = "Apellidos " + i.ToString();

        Dato.Email = "Email" + i.ToString() + "@live" + i.ToString() + ".com";

 

        Contexto.Personas1.InsertOnSubmit(Dato);

    }

 

    Contexto.SubmitChanges();

}

Usar un elemento que sea IEnumerable, utilizar InsertAllOnSubmit y realizar un SubmitChanges.

List<Tabla1> Datos = new List<Tabla1>();

 

Tabla1 Dato;

using (ContextoDatos Contexto = new ContextoDatos(CadenadeConexion))

{

    for (int i = 0; i < int.Parse(NRegistros.Text); i++)

    {

        Dato = new Tabla1();

        Dato.Nombre = "Nombre " + i.ToString();

        Dato.Apellidos = "Apellidos " + i.ToString();

        Dato.Email = "Email" + i.ToString() + "@live" + i.ToString() + ".com";

 

        Datos.Add(Dato);

    }

 

    Contexto.Personas1.InsertAllOnSubmit(Datos);

    Contexto.SubmitChanges();

}

Como alguna que otra vez he oído decir a alguien, las cosas se pueden hacer mal, o muy mal y en este caso usar el SubmitChanges tras realizar un InsertOnSubmit, es sin lugar a dudas una opción malísima. Obviamente todo depende de que aplicación estemos desarrollando pero, tenemos que tener en cuenta que reflejar físicamente los datos en la base de datos y no mantenerlo en memoria hasta hacer un Submit final, salvo en casos en donde las transacciones de la información sea primordial es totalmente innecesario. Tenemos que tener en cuenta que el móvil solo lo usamos nosotros. 🙂

Insertando como decimos 1000 registros en 5 ocasiones diferentes el tiempo en realizar cada operación a sido el siguiente:

  Opción 1 Opción 2 Opción 3
1ª Inserción 28.294 ms 422 ms 529 ms
2ª Inserción 33.778 ms 399 ms 394 ms
3ª Inserción 27.331 ms 392 ms 381 ms
4ª Inserción 25.930 ms 504 ms 568 ms
5ª Inserción 26.876 ms 380 ms 390 ms

Es decir usar los métodos 2 y 3 apenas varia el rendimiento, pero estos son un 97% mas rápidos que la opción 1. Ahí queda eso.

En el siguiente post, ya veremos que realizando dos o tres toques sutiles en la definición de nuestras bases de datos, también podremos ganar mucho tiempo.

Un comentario en “Mejoras de Rendimiento en entornos SQL CE – I”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *