The aim of this chapter is to help you understand the SQL
Server Execution plan and how to use them to optimize the queries.
Let's first start with What's an Execution Plan is:
An execution plan, simply put, is the result of the query
optimizer's attempt to calculate the most efficient way to implement
the request represented by the T-SQL query you submitted.
Execution plans can tell you how a query will be executed, or
how a query was executed. They are, therefore, the DBA's primary means of troubleshooting
a poorly performing query. Rather than guess at why a given query is performing
thousands of scans, putting your I/O through the roof, you can use the
execution plan to identify the exact piece of SQL code that is causing the
problem. For example, it may be scanning an entire table-worth of data when,
with the proper index, it could simply backpack out only the rows you need. All
this and more is displayed in the execution plan.
Guidelines for reading a SQL Server query
execution plan
·
The graphical query execution plan
has a shape of a tree. The tree structure depends on the statements in the
query
- Each query in a batch is shown in the plan
- Each icon presents an operator
- Icons are read from left to right, top to bottom
- The tree shows parent and children-level nodes
- Every child node is connected to a parent node by arrows
- The cost of each query is presented as a percentage of the total batch cost. The cost is the time needed to execute a statement/query/batch. Total cost of every batch, i.e. the sum of individual query costs should be 100%. However, it is possible that even in the actual query execution plans for costly queries, these costs are miscalculated and the sum is over 100%
·
- Children of the same parents are placed in the same column. This doesn’t mean that all operators in the same column have the same parent
· ![](data:image/png;base64,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)
- The arrow width depends on the actual/estimated number of rows. The arrows that represent a large number of rows are thicker
- ·If a query has multiple queries, query execution plans are drawn one under another. The relative cost for each query is presented as a percentage of total cost of all statements. The sum of all query costs is 100%
Operators show how queries and statements are executed. They can
be physical and logical. Logical operators present an operation on a conceptual
level, while physical operators implement the operation defined by the logical
operator using a specific method. In other words, a physical operator is an
object or routine that executes an operation. Physical operators access columns
and rows in tables and views, calculate expressions, create joins, etc.
Optimizing query by reading plan
Let's take the below query as an example:
DECLARE @LocationName AS NVARCHAR(50);
SET @LocationName = 'Paint';
SELECT p.Name AS ProductName ,
pi.Shelf ,
l.Name AS LocationName
FROM Production.Product AS p
JOIN Production.ProductInventory AS pi ON pi.ProductID = p.ProductID
JOIN Production.Location AS l ON l.LocationID = pi.LocationID
WHERE LTRIM(RTRIM(l.Name)) = @LocationName;
GO
When this query is executed, you'll see the execution plan as
below:
There are several issues that needs to be addressed in this plan:
1.
The Index Scan on
the Location.Name column – there's an index on that column it should
have used the seek
2.
The fat pipe coming
out of the Clustered Index Scan on the ProductInventory table
– in this example, it's processing over 1000 rows at this stage, and eventually
only returning 9 rows.
3.
The Hash Match join
– for the number of rows returned where we are expecting a Nested Loops join.
4.
The Clustered
Index Seek on the Product table looks very expensive relative
to the other operators.
When we look into the code, it becomes clear that its not using
the SEEK because of the function used on the Location.Name column, LTRIM(RTRIM(l.Name)).
We can then remove that function and rerun the query and the plan would change
to:
Now that the Location rows are accesses with a seek instead of a
scan, SQL Server has a better idea how many rows to expect and so switches to a
more appropriate join type. This is why it's pretty common to see Hash Matches
where there are bad or missing indexes.
To remove the fat pipe connected to the Clustered Index
Scan on ProductInventory, we can create a new index on
ProductInventory table
CREATE INDEX ProductionLocation ON Production.ProductInventory(LocationID)
INCLUDE (Shelf);
New plan look like below
The only thing remaining is to look into the high-cost Clustered
Index Seek. However, once we understand the nature of the Nested
Loops join, it becomes apparent that this is not actually a problem in
this case. During a Nested Loops operation, for each row returned
by the inner data set, it compares it to the outer data set, looking for
matches. In this case, for each row returned fromLocation, SQL Server performs
a seek on the Product table. That explains why the cost is higher.
Operator tooltips
Besides the information presented by the icons and nodes, SQL
Server query execution plans provide much more details in the icon tooltips. To
see the tooltip:
·
Place the mouse over
the icon in the plan, or
·
Right-click the icon
and in the context menu select Properties
The information shown in tooltips is various and depends on the
operator type. The items shown in the tooltips are different for actual and
estimated plans. The tooltip on the left is for the actual and on the right for
the estimated plan for the same operator
The estimated and actual values for the same parameters may not
be equal in some scenarios
The information available in a tooltip is:
Physical Operation – the object or routine executed, the operator name
presented in the plan
Estimated Operator Cost – the cost of the operation, presented as a percentage of
total batch cost
Estimated I/O Cost, Estimated CPU Cost – Query Analyzer creates several
execution plans, calculates the cost of each (how much I/O and processor
resources are needed to complete the operation), and determines the most
efficient one
Estimated Row Size – the number of rows that is believed to be affected by
the operation, useful for determining how much memory is needed
Actual and Estimate Number of Rows – even if there is significant
discrepancy between these two values, it doesn’t indicate a problem. It’s
usually caused by out of date statistics
Actual and Estimate Execution mode – row or batch, shows whether the rows
are processed one at a time, or in batches