Cuando analizamos el plan de ejecución de una instrucción, podemos ver en las propiedades del operador el coste estimado, tal como se ve en la siguiente imagen:
Sin embargo, ¿qué es lo que mide? ¿CPU? ¿IO? En realidad no puede ser ninguno de esos dos porque ya tenemos un apartado específico de coste de CPU e IO, así que quedan descartados. Por otro lado, si pensamos que es tiempo y lo comparamos con los resultados que arroja SET STATISTICS TIME ON, vemos que no concuerdan mucho.
En realidad, hay un artículo del blog del equipo de SQL Server que se encarga del motor de ejecución que lo explica en el que viene a decir que esas unidades son de… nada. Es decir, que no hacen referencia a ningún objeto o valor de referencia, sino que son simplemente una forma de indicar el coste relativo de ese operador. Ok, podría valernos esa explicación, pero en algún momento alguien habrá tenido que tomar como referencia «algo» para que a partir de ahí, al aplicar los algoritmos correspondientes, podamos tener como resultado el coste. Así que volvemos a la pregunta inicial: ¿qué es lo que mide ese valor?
Afotunadamente hace poco encontré una respuesta a esta curiosidad en un blog que no conocía y que, seamos sinceros, podría ser una leyenda urbana como cualquier otra, pero que al menos merece la pena leer: «what “estimated subtree cost = 1” means ? or a great SQL server history story» Para quien no quiera leerlo (o no sepa inglés), todo viene de un programador del equipo del motor de procesamiento de SQL Server 7.0 llamado Nick que decidió que si la consulta que ejecutaba en su PC tardaba 1 segundo, le asignaría 1 al coste de la misma, y a partir de ese valor calcular el resto.
Así que, según dicha historia, en el ejemplo que os mostraba en la imagen, el coste 0.0032831 del operador Index Seek es porque en el antiguo ordenador de Nick habría tardado en ejecutarse 0.0032831 segundos (salvando las distancias, claro)
Bonita historia, ¿no creéis? 🙂