Since in the coming weeks I will be presenting a session on Execution plans at a few SQL Saturday events, I thought I would do a post on how to capture execution plans. Execution plans are a critical tool when attempting to troubleshoot a performance issue. SQL Server Management Studio is one of the common tools we use to get the plan, if we have the query. You can also use Extended Events and Query Store.
In SSMS there are two options to capture the execution plan, Actual and Estimated plan. The biggest difference between the two is that the Actual plan needs to execute the query, while the estimated plan uses statistics to create the plan and does not execute the query.
To get the Estimated Execution plan, you can use the Query menu. There you will find the Display Estimated Execution Plan menu item.
There a two ways to get the actual execution plan. One is on the tool bar and the other is on the Query menu.
When looking to capture the estimated execution plan, as soon as you click on the menu item, the plan will be returned. If you are looking for the actual execution plan, SQL Server will execute the query and when it is finished the plan will be returned. For simple queries the estimated execution plan will be returned very fast, however for more complex queries it might take some time.
When in SSMS, how can I tell if the plan is actual or estimated? There are a few ways. The easiest way is to check the number of tabs. As you can see below there are two tabs, one for messages and another for Execution Plan. There is a missing table, results.
Estimated Execution Plan: Two tabs
Actual Execution Plan: Three tabs
Another way to determine if the plan is actual or estimated will require us to dig a little deeper. We will need to look at the properties of a few of the operators.
When you float the cursor over the Index Scan you will see this popup. The items in the green boxes are for the actual execution while the items in the red boxes is for estimated execution. Although having the options for estimated execution, you might think this is for the estimated execution, it is not.
When both estimated and actual number of rows can be found in the pop up, this means that it is an actual execution plan. If it were an estimated execution plan, you will not see the actual items, as you can see in the image below.
If the estimated and actual plans are captured very close to each other, you will not see much difference. However, if there are a large period of time between them, there could be a number of differences.
This will work with both an on-prem instance of SQL Server as well as an Azure SQL Database.
Using SSMS works great if we have the query, however it is a manual process. What if you want to capture the plans after hours or automatically. This is where Extended Events comes into play. Just a word of warning, when capturing execution plans with Extended Events, you could actually cause a performance problem so be careful.
This is what Microsoft has placed in the description of the events related to Execution Plans. I think it is a pretty clear warning about using Extended Events to capture Execution plans.
“Using this event can have a significant performance overhead so it should only be used when troubleshooting or monitoring specific problems for brief periods of time.”
When working with an On-Prem instance of SQL Server, Extended Events can be found under “Management”. This is a server level setting, although you can limit the activity captured to a single database.
The location is slightly different for an Azure SQL Database. Extended Events can be found under the database.
You can right click on the “Sessions” folder under Extended Events and then click “New Session”.
When creating the session there are three events we will want to consider. These events can be found in both an on-prem instance as well as Azure SQL Database.
query_pre_execution_showplan – this event is the equivalent of an estimated execution plan
query_post_execution_showplan – this event can be used to capture the actual Execution plan.
query_post_compilation_showplan – Occurs after a SQL statement is compiled.
To create an Extended Event session you can either use SQL Server Management Studio by right clicking “Session” under the Extended Events item or using the CREATE SESSION statement.
If using SSMS graphical tool, you can right click on Sessions and then click “New Session” you will see something similar to this.
Once you give the session a name, the you are ready to move on to picking the proper events. Remember, there are three options for events, query_pre_execution_showplan and query_post_execution_showplan.
If you enter “showplan” into the Event Library search box. You will see four events, the three mentioned earlier and a fourth related to Query Store. We will discuss this one later.
Move the events over by clicking the “>” button and then you are ready to add the target. Once you do, save the session, start it and you will now be collecting execution plans.
You can also use the CREATE EVENT SESSION statement. The statement below collects all three events, again NOT recommended. Notice that this statement also has a filter for the AdventureWorks2014 database. If you do decide to attempt, what even Microsoft says you should use with caution, try to reduce activity by limiting the collection to a single database.
CREATE EVENT SESSION [ExecutionPlan] ON SERVER
ADD EVENT sqlserver.query_post_compilation_showplan,
ADD EVENT sqlserver.query_post_execution_showplan,
ADD EVENT sqlserver.query_pre_execution_showplan(SET collect_database_name=(1)
ADD TARGET package0.event_file(SET filename=N’ExecutionPlan’),
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON)
Now that we are collecting the plans all we have to do is right click on the target and then click view data. You will see something similar to below. Notice the Query Plan tab highlighted.
If you right click on the plan you will see this context menu. You can now save the plan, view the XML and even open the SentryOne Plan Explorer, if you have it installed. If you don’t have it installed…..go get it. It is a great tool.
Extended Events are a great tool to collect information about what is going on in your server. As stated several times, if you are looking to Extended Events to collect your execution plans, do so very cautiously. Also, limit the time the sessions is running and limit the activity to only the database you are looking to find a solution to a performance problem.
The last option we will cover is Query Store. This is a great tool!!! Query Store came out with SQL Server 2016. What I like about Query Store is that it allows me to collected the needed execution plans without the overhead of Extended Events.
To enable Query Store, simply go to the properties of the database and select Query Store. The Operation Mode Property is Off by default. Change this to either Read or Read Write. Now Query Store is enabled.
Notice that there are two Operation Mode properties. One is actual and the other is Requested. If you change Requested to something different than Actual, once you click OK, the requested setting will now become the actual setting.
Per Microsoft, here are a number of scenarios of why you might want to utilize Query Store.
Once you enable it and are collecting data, there are a number of reports that you can use to view the plans. Under that database, in this case, AdventureWorks2014, you will now see an option for Query Store. When you expand it, you will see the reports that are available to you.
When you right click on one of the reports you will see something similar to this. By clicking on the bar in the chart on the upper left, the other two panels will update. As you can see, the execution plan is in the bottom panel.
Once you have the plan visible, it works just like all the option methods of collecting the plan. You can view the properties of each operator as well as save the plan for analysis later.
If you utilize query store, there is an event in Extended Events you might want to consider. This event is query_store_generate_showplan_failure and will fire when the Query Store has an error creating the plan.
Here is the description from the event:
“Fired when Query Store failed to store a query plan because the showplan generation failed”
This post is about how to collect the Execution Plans, including Query Store. In this post, I am not going to get indepth about all the options of Query Store. There is some really great information out there, including some great videos. Eric Stellato has some great content on Query Store in a number of locations, including SQLSkills.com, SQLPerformance.com and yes, even YouTube.
There are number of options of collecting Execution plans. My preference would be to utilize Query Store. Mostly because it captures the plans automatically, has really good reporting and has very low overhead.
Thanks for visiting my blog!!!