Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FACULTAD DE INGENIERÍA
INGENIERO MIGUEL LEMUS
BASE DE DATOS II
INVESTIGACIÓN
TIPS DE OPTIMIZACIÓN
1SELECT DISTINCT
2 PRODUCT.ProductID,
3 PRODUCT.Name
4FROM Production.Product PRODUCT
5INNER JOIN Sales.SalesOrderDetail DETAIL
6ON PRODUCT.ProductID = DETAIL.ProductID
7OR PRODUCT.rowguid = DETAIL.rowguid;
1 SELECT
2 PRODUCT.ProductID,
3 PRODUCT.Name
4 FROM Production.Product PRODUCT
5 INNER JOIN Sales.SalesOrderDetail DETAIL
6 ON PRODUCT.ProductID = DETAIL.ProductID
7 UNION
8 SELECT
9 PRODUCT.ProductID,
10 PRODUCT.Name
11FROM Production.Product PRODUCT
12INNER JOIN Sales.SalesOrderDetail DETAIL
13ON PRODUCT.rowguid = DETAIL.rowguid
Tenga en cuenta que todavía hay una gran cantidad de escaneos de índice en
el plan de ejecución, pero a pesar de la necesidad de escanear tablas cuatro
veces para satisfacer nuestra consulta, el rendimiento es mucho mejor que
antes.
Es importante tener cuidado al escribir consultas con una cláusula OR. Por ello,
es crítico que pruebe y verifique que el rendimiento sea adecuado y que no
esté introduciendo accidentalmente una bomba de tiempo de rendimiento
similar a lo que observamos anteriormente. Si está revisando una aplicación
de bajo rendimiento, la misma que se ejecuta en un OR en diferentes columnas
o tablas, usted deberá concentrarse en eso como una posible causa de los
problemas. Este es un patrón de consulta fácil de identificar que a menudo
conduce a un bajo rendimiento.
1SELECT
2 Person.BusinessEntityID,
3 Person.FirstName,
4 Person.LastName,
5 Person.MiddleName
6FROM Person.Person
7WHERE Person.LastName LIKE '%For%';
Hay que considerar que una vez que se evalúan estas consideraciones,
podemos tomar una columna de cadena y dividirla en segmentos de cadena.
Por ejemplo, en el caso de que debemos considerar un sistema de búsqueda
donde hay una longitud mínima de búsqueda de 3 caracteres y la palabra
almacenada “Dinosaurio”. Es aquí donde están las subcadenas de Dinosaurio
que tienen 3 caracteres de longitud o más (ignorando el inicio de la cadena,
que se puede reunir por separado y rápidamente con una búsqueda de índice
en esta columna):
ino, inos, inosa, inosau, inosaur, nos, nosa, nosau, nosaur, osa, osau, osaur,
sau, saur, aur.
Si tuviéramos que crear una tabla separada que almacenara cada una de estas
subcadenas (también conocidas como n-gramos), podemos vincular esos n-
gramos a la fila de nuestra gran tabla que tiene la palabra dinosaurio. Por esta
razón, en lugar de escanear una tabla grande para obtener resultados,
podemos hacer una búsqueda de igualdad contra la tabla de n-grams. Por
ejemplo, si tuve que elaborar una búsqueda comodín para “dino”, mi
búsqueda se puede redirigir a una búsqueda que se vería así:
1SELECT
2 n_gram_table.my_big_table_id_column
3FROM dbo.n_gram_table
4WHERE n_gram_table.n_gram_data = 'Dino';
Las operaciones comunes que pueden dar lugar a grandes escrituras son:
Índices faltantes
Esta advertencia es útil porque nos permite saber que a diferencia de otras
circunstancias que existe una solución potencialmente más fácil para mejorar
el rendimiento de las consultas. Por otra parte también tiene un lado obscuro
ya que también es engañoso porque un índice adicional puede no ser la mejor
manera de resolver un problema de atraso y de latencia. El texto verde nos
proporciona todos los detalles de un nuevo índice, pero tenemos que hacer un
poco de trabajo antes de considerar tomar el consejo de SQL Server:
• ¿Existen índices existentes que sean similares a este que puedan
modificarse para cubrir este caso de estudio?
• ¿Necesitamos todas las columnas de inclusión? ¿Sería suficiente un
índice en las columnas de clasificación?
• ¿Qué tan alto es el impacto del índice? ¿Mejorará una consulta en un 98
%, o solo en un 5 %?
• ¿Este índice ya existe, pero por alguna razón el optimizador de consultas
no lo elige?
A menudo, los índices sugeridos son excesivos. Por ejemplo, aquí está la
instrucción de creación de índice para el plan parcial que se muestra arriba:
Resulta bastante lógico que cuando una tabla tiene demasiados índices, las
operaciones de escritura se vuelven más lentas ya que cada ACTUALIZACIÓN,
BORRADO e INSERCIÓN que toca una columna indexada debe actualizar todos
los índices en ella. Además, esos índices ocupan espacio en el
almacenamiento, así como en las copias de seguridad de la base de datos. El
término de “Demasiados” es vago, pero enfatiza que, en última instancia, el
rendimiento de la aplicación es la clave para determinar si las cosas son
óptimas o no.
PLANES DE EJECUCIÓN
Ahora, cada vez que usted ejecute una consulta o procedimiento almacenado
ad hoc, una pestaña adicional aparecerá en el panel de resultados, al lado de
las pestañas Results y Messages.
1SELECT *
2 FROM person.PersonPhone
3 WHERE PhoneNumber LIKE '%697%'
Los planes de ejecución SQL Server pueden ser grabados como XML o archivos
sqlplan para análisis posterior. Para abrir un archivo sqlplan, haga doble clic en
el archivo en el explorador de archivos y será automáticamente abierto en SQL
Server Management Studio.
Los pasos son similares para usar la opción Display Estimated Execution Plan,
excepto que la consulta no tiene que ser ejecutada.
Los planes de consultas SQL Server también pueden ser mostrados en el Editor
de Consultas usando alguna de las siguientes opciones:
SHOWPLAN_XML
1. Ejecute:
1SET SHOWPLAN_XML ON
2. Note que esta es la única sentencia aquí que puede ser ejecutada.
3. Ejecute una consulta. La pestaña Results mostrará un enlace al plan de
consultas. Note que los resultados de la consulta no son mostrados, ya
que la consulta no es realmente ejecutada.
1 SELECT qp.query_plan,
2 CP.usecounts,
3 cp.cacheobjtype,
4 cp.size_in_bytes,
5 cp.usecounts,
6 SQLText.text
7 FROM sys.dm_exec_cached_plans AS CP
8 CROSS APPLY sys.dm_exec_sql_text( plan_handle)AS SQLText
9 CROSS APPLY sys.dm_exec_query_plan( plan_handle)AS QP
10 WHERE objtype = 'Adhoc' and cp.cacheobjtype = 'Compiled Plan'
Note que aparte del enlace al plan de consultas, los resultados de la consulta
son también mostrados.
See more
Check out ApexSQL Plan, to view SQL execution plans, including comparing
plans, stored procedure performance profiling, missing index details, lazy
profiling, wait times, plan execution history and more
Milena Petrovic
Milena es una profesional de SQL Server con más de 20 años de experiencia en
IT. Ella ha iniciado con programación de computadoras en la escuela
secundaria y continuó en la Universidad.
Ella ha estado trabajando con SQL Server desde 2005 y tiene experiencia con
SQL 2000 hasta SQL 2014.
Su tema favorito de SQL Server son las recuperaciones de desastres, la
auditoría y el monitoreo de desempeño.
https://www.sqlshack.com/es/planes-de-ejecucion-de-consultas-sql-server-viendo-los-planes/