Estoy haciendo algunos benchmarks crudos con el tipo de datos xml de SQL Server 2008. He visto muchos lugares donde .exist
se usa en where
cláusulas. Recientemente comparé dos consultas y obtuve resultados extraños.¿Cuál es más rápido .exist o .value en una cláusula where?
select count(testxmlrid) from testxml
where Attributes.exist('(form/fields/field)[@id="1"]')=1
Esta consulta tarda aproximadamente 1,5 segundos para correr, sin índices en otra cosa que la clave principal (testxmlrid)
select count(testxmlrid) from testxml
where Attributes.value('(/form/fields/field/@id)[1]','integer')=1
Esta consulta en el otherhand toma alrededor de 0,75 segundos para funcionar.
Estoy usando XML sin tipo y mi evaluación comparativa tiene lugar en una instancia de SQL Server 2008 Express. Hay aproximadamente 15,000 filas en el conjunto de datos y cada cadena XML tiene alrededor de 25 líneas.
¿Estos resultados me están dando? Si es así, ¿por qué todos usan .exist
? ¿Estoy haciendo algo mal y .exist
podría ser más rápido?
¿El 'existir()' No provoque un cortocircuito en cuanto se encuentra la primera aparición de todos modos? – Yuck
@Yuck - Sí, pero en este caso la consulta '.exist' está buscando la presencia de' @ id = 1'. Si la primera aparición es '@ id' es algo más que 1, continúa la búsqueda. La consulta '.value' observa el valor de la primera aparición de' @ id' y no continúa buscando si esos valores no son 1. –