Muchos preguntarán el porqué de ésto, tomando en cuenta las capacidades procesales de las máquinas de hoy en día pero la respuesta es justamente que la capacidad de procesamiento es costosa, y debemos llegar a un punto de equilibrio muy por debajo del techo de la capacidad promedio de procesamiento si deseamos estar preparados para las "horas pico"
Los motores de bases de datos actuales nos permiten hacer búsquedas muy específicas y aunque nos parezcan ínfimas las velocidades de búsqueda, la cantidad de éstas es simplemente inmensa y una diferencia de 0.1 segundo entre una búsqueda y otra es una ventaja enorme.
Optimizar sentencias pequeñas no presenta problema, pero que tal una de ésta categoría?
SELECT C.Phone_Number, C.Honorific, C.First_Name, C.Last_Name,
C.Suffix, C.Address_ID, A.Address_ID, A.Street_Address_Line1,
A.Street_Address_Line2, A.City_Name, A.State_Abbreviation,
A.ZIP_Code, OD.Deferred_Shipment_Date, OD.Item_Count,
ODT.Text, OT.Text, P.Product_Description, S.Shipment_Date
FROM Orders O, Order_Details OD, Products P, Customers C, Shipments S,
Addresses A, Code_Translations ODT, Code_Translations OT
WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%'
AND UPPER(C.First_Name) LIKE :First_Name||'%'
AND OD.Order_ID = O.Order_ID
AND O.Customer_ID = C.Customer_ID
AND OD.Product_ID = P.Product_ID(+)
AND OD.Shipment_ID = S.Shipment_ID(+)
AND S.Address_ID = A.Address_ID(+)
AND O.Status_Code = OT.Code
AND OT.Code_Type = 'ORDER_STATUS'
AND OD.Status_Code = ODT.Code
AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
AND O.Order_Date > :Now - 366
ORDER BY C.Customer_ID, O.Order_ID DESC, S.Shipment_ID, OD.Order_Detail_ID;
Por eso hoy voy a mostrar un método muy usado, VST
Para empezar vamos a clasificar las partes de la consulta de la siguiente manera, vamos a crear un diagrama de tipo autómata en la que:
Las tablas usadas en la consulta serán los nodos.
Los Joins serán las líneas de conexión entre los nodos
y los filtros nos guiarán con la ruta a seguir.
De ésta manera la consulta anterior se reclasificaría así:
Tablas
Orders O,
Order_Details OD,
Products P,
Customers C,
Shipments S,
Addresses A,
Code_Translations ODT,
Code_Translations OT
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%'
AND UPPER(C.First_Name) LIKE :First_Name||'%'
AND OT.Code_Type = 'ORDER_STATUS'
AND O.Order_Date > :Now – 366
AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
y armamos el diagrama de la siguiente manera
Para que quede un diagrama como éste
El siguiente paso es ordenarlo para que nos permita determinar la ruta más discriminatoria y por lo tanto la que va a acelerar nuestra consulta:
Aquí podemos definir que la ruta mas restrictiva es ésta:
Por lo tanto nuestra consulta debe empezar por efectuar los joins a las tablas OD, O y C antes de continuar con las demás para considerarla optimizada.
No comments:
Post a Comment