SQL Server
120
0

Como optimizar el uso del operador OR en TSQL

[et_pb_section fb_built=”1″ admin_label=”section” _builder_version=”3.22″][et_pb_row admin_label=”row” _builder_version=”3.25″ background_size=”initial” background_position=”top_left” background_repeat=”repeat” custom_padding=”||13px|||”][et_pb_column type=”4_4″ _builder_version=”3.25″ custom_padding=”|||” custom_padding__hover=”|||”][et_pb_text admin_label=”Text” _builder_version=”4.0.7″ background_size=”initial” background_position=”top_left” background_repeat=”repeat”]Uno de los grandes problemas que nos podemos encontrar en una consulta TSQL es el uso del operador OR , el mismo es considerado un anti-patron de performance.

En este post veremos como podemos mejorar la performance de una consulta de SQL Server la cual contiene este operador.

Supongamos que tenemos la siguiente consulta:[/et_pb_text][et_pb_dmb_code_snippet code=”VVNFIEFkdmVudHVyZVdvcmtzMjAxNyAKR08KClNFTEVDVCBTYWxlc09yZGVySUQsCiAgICAgICBQcm9kdWN0SUQsIAogICAgICAgVW5pdFByaWNlLCAKICAgICAgIENhcnJpZXJUcmFja2luZ051bWJlcgpGUk9NIFNhbGVzLlNhbGVzT3JkZXJEZXRhaWwgCldIRVJFIFByb2R1Y3RJRCA9IDcwOSAgIApPUiBVbml0UHJpY2UgPSAgNS43Cg==” language=”sql” _builder_version=”4.0.7″]VVNFIEFkdmVudHVyZVdvcmtzMjAxNyAKR08KClNFTEVDVCBTYWxlc09yZGVySUQsCiAgICAgICBQcm9kdWN0SUQsIAogICAgICAgVW5pdFByaWNlLCAKICAgICAgIENhcnJpZXJUcmFja2luZ051bWJlcgpGUk9NIFNhbGVzLlNhbGVzT3JkZXJEZXRhaWwgCldIRVJFIFByb2R1Y3RJRCA9IDcwOSAgIApPUiBVbml0UHJpY2UgPSAgNS43Cg==[/et_pb_dmb_code_snippet][et_pb_text _builder_version=”4.0.7″]Si observamos su plan de ejecución nos encontraremos con un Scan sobre el índice clustered que es lo mismo que recorrer toda la tabla.[/et_pb_text][et_pb_image src=”https://blogs.triggerdb.com/wp-content/uploads/2019/11/tsql-or-01.png” _builder_version=”4.0.7″][/et_pb_image][et_pb_text _builder_version=”4.0.7″]Ahora vamos a cambiar nuestra consulta usando UNION en lugar del operador OR[/et_pb_text][et_pb_dmb_code_snippet code=”U0VMRUNUIFNhbGVzT3JkZXJJRCwKICAgICAgIFByb2R1Y3RJRCwgCiAgICAgICBVbml0UHJpY2UsIAogICAgICAgQ2FycmllclRyYWNraW5nTnVtYmVyCkZST00gU2FsZXMuU2FsZXNPcmRlckRldGFpbCAKV0hFUkUgUHJvZHVjdElEID0gNzA5ICAgClVOSU9OClNFTEVDVCBTYWxlc09yZGVySUQsCiAgICAgICBQcm9kdWN0SUQsIAogICAgICAgVW5pdFByaWNlLCAKICAgICAgIENhcnJpZXJUcmFja2luZ051bWJlcgpGUk9NIFNhbGVzLlNhbGVzT3JkZXJEZXRhaWwgCldIRVJFICBVbml0UHJpY2UgPSAgNS43″ _builder_version=”4.0.7″]U0VMRUNUIFNhbGVzT3JkZXJJRCwKICAgICAgIFByb2R1Y3RJRCwgCiAgICAgICBVbml0UHJpY2UsIAogICAgICAgQ2FycmllclRyYWNraW5nTnVtYmVyCkZST00gU2FsZXMuU2FsZXNPcmRlckRldGFpbCAKV0hFUkUgUHJvZHVjdElEID0gNzA5ICAgClVOSU9OClNFTEVDVCBTYWxlc09yZGVySUQsCiAgICAgICBQcm9kdWN0SUQsIAogICAgICAgVW5pdFByaWNlLCAKICAgICAgIENhcnJpZXJUcmFja2luZ051bWJlcgpGUk9NIFNhbGVzLlNhbGVzT3JkZXJEZXRhaWwgCldIRVJFICBVbml0UHJpY2UgPSAgNS43[/et_pb_dmb_code_snippet][et_pb_text _builder_version=”4.0.7″]Si observamos el plan de ejecución veremos que no solo ha cambiado sino que además nos sugiere crear índices [/et_pb_text][et_pb_image src=”https://blogs.triggerdb.com/wp-content/uploads/2019/11/tsql-or-02.png” _builder_version=”4.0.7″][/et_pb_image][et_pb_text _builder_version=”4.0.7″]Para mejorar nuestra nueva consulta con el UNION le crearemos los dos siguientes índices [/et_pb_text][et_pb_dmb_code_snippet code=”Q1JFQVRFIE5PTkNMVVNURVJFRCBJTkRFWCBbSVhfT1JdCk9OIFtTYWxlc10uW1NhbGVzT3JkZXJEZXRhaWxdIChbVW5pdFByaWNlXSkKSU5DTFVERSAoW0NhcnJpZXJUcmFja2luZ051bWJlcl0sW1Byb2R1Y3RJRF0pCgpDUkVBVEUgTk9OQ0xVU1RFUkVEIElOREVYIFtJWF9PUjJdCk9OIFtTYWxlc10uW1NhbGVzT3JkZXJEZXRhaWxdIChbcHJvZHVjdGlkXSkKSU5DTFVERSAoW0NhcnJpZXJUcmFja2luZ051bWJlcl0sW3VuaXRwcmljZV0p” _builder_version=”4.0.7″]Q1JFQVRFIE5PTkNMVVNURVJFRCBJTkRFWCBbSVhfT1JdCk9OIFtTYWxlc10uW1NhbGVzT3JkZXJEZXRhaWxdIChbVW5pdFByaWNlXSkKSU5DTFVERSAoW0NhcnJpZXJUcmFja2luZ051bWJlcl0sW1Byb2R1Y3RJRF0pCgpDUkVBVEUgTk9OQ0xVU1RFUkVEIElOREVYIFtJWF9PUjJdCk9OIFtTYWxlc10uW1NhbGVzT3JkZXJEZXRhaWxdIChbcHJvZHVjdGlkXSkKSU5DTFVERSAoW0NhcnJpZXJUcmFja2luZ051bWJlcl0sW3VuaXRwcmljZV0p[/et_pb_dmb_code_snippet][et_pb_text _builder_version=”4.0.7″]Ejecutaremos nuestra consulta original con el OR y la nueva con el UNION ya con los índices creados para ver los planes de ejecución y costos[/et_pb_text][et_pb_image src=”https://blogs.triggerdb.com/wp-content/uploads/2019/11/tsql-or-03.png” _builder_version=”4.0.7″][/et_pb_image][et_pb_text _builder_version=”4.0.7″]Como se puede observar en los planes de ejecución hay una gran mejora de performance usando el UNION, donde el plan con el OR tiene un costo de “0.63” haciendo un Index Scan vs los “0.023” usando el UNION y con Index Seek.[/et_pb_text][/et_pb_column][/et_pb_row][/et_pb_section]

You must be logged in to post a comment.