• Home
  • Artículos
  • La importancia de especificar las columnas en una query en CRM

La importancia de especificar las columnas en una query en CRM

Hace poco, os hablaba de buenas prácticas en el desarrollo de plugins en Dynamics CRM, en este caso y en relación a las buenas prácticas, vamos a hablar de la importancia que tiene seleccionar únicamente las columnas que vamos a usar a la hora de hacer una consulta.

Siempre que se haga una query a CRM bien por QueryExpression o por FetchXml es importante especificar únicamente aquellas columnas que queremos recuperar.

Para que veáis el impacto que esto puede tener, he preparado un pequeño ejemplo donde se puede apreciar la diferencia entre especificar las columnas o recuperarlas todas.

En este primer ejemplo voy a recuperar todos los registros de la entidad estándar account con todas sus columnas. En este caso concreto, la entidad tiene más de 130.000 registros, pero como sabéis solo se recuperan 5000.

1
2
3
4
5
6
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet(true)
            };
            var entityCollection = service.RetrieveMultiple(qe);

Vamos a añadir un Stopwatch para ver cuanto tiempo tarda en recuperar esa información con todas sus columnas. Veamos cuanto tarda…

1
2
3
4
5
6
7
8
9
10
11
            var watch = System.Diagnostics.Stopwatch.StartNew();
 
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet(true)
            };
            var entityCollection = service.RetrieveMultiple(qe);
 
            watch.Stop();
            Console.WriteLine("{0} Segundos [AllColumns = true]", watch.ElapsedMilliseconds / 1000);

Ahora haremos lo mismo pero esta vez especificando algunas columnas

1
2
3
4
5
6
7
8
9
10
11
            var watch = System.Diagnostics.Stopwatch.StartNew();
 
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet("accountid", "name", "emailaddress1", "emailaddress2")
            };
            var entityCollection = service.RetrieveMultiple(qe);
 
            watch.Stop();
            Console.WriteLine("{0} Segundos [Columns (accountid, name, emailaddress1, emailaddress2)]", watch.ElapsedMilliseconds / 1000);

Como veis, la diferencia es importante, en este caso estamos hablando de 83 segundos de diferencia. Bien es cierto que estamos ante un ejemplo muy extremo, en cualquier caso SIEMPRE se deben de especificar las columnas que vayamos a usar. Incluso, si quisiésemos obtener todas las columnas, también debemos especificarlas, ya que si en el futuro se añaden nuevas, estas se obtendrían penalizando el rendimiento.

Hasta la próxima

Etiquetas:, , , , , , ,

"Trackback" Enlace desde tu web.

Deja un comentario

Time limit is exhausted. Please reload CAPTCHA.

AX3