Displaying an Estimated Execution Plan generates CXPACKET, PAGELATCH_SH, and LATCH_EX [ACCESS_METHODS_DATASET_PARENT] waitsHow (and why) does TOP impact an execution plan?How is parallelism threshold (seconds) used if query CPU cost is actually unitlessHigh CXPACKET and LATCH_EX waitsHow does SQL Server's optimizer estimate the number of rows in a joined table?Long running query with index seekWhy is TOP operation in SQL execution planActual Query Plan Estimated Cost and dm_exec_query_stats worker time do not gelBad execution plan after stats update due to temp table100% CPU with bad execution planPlan changes to include Eager Spool causes the query to run slower
How come Arya Stark wasn't hurt by this in Game of Thrones Season 8 Episode 5?
Can 2 light bulbs of 120V in series be used on 230V AC?
How could the B-29 bomber back up under its own power?
What does this 'x' mean on the stem of the voice's note, above the notehead?
Why would Thor need to strike a building with lightning to attack enemies?
Is there any official Lore on Keraptis the Wizard, apart from what is in White Plume Mountain?
"File type Zip archive (application/zip) is not supported" when opening a .pdf file
Can the word crowd refer to just 10 people?
Character had a different name in the past. Which name should I use in a flashback?
Why could the Lunar Ascent Engine be used only once?
Solve intersection of the straight line with equation y=x-a and the circle equation x^2 + y^2 = 4
Why favour the standard WP loop over iterating over (new WP_Query())->get_posts()?
Why are Marine Le Pen's possible connections with Steve Bannon something worth investigating?
On a piano, are the effects of holding notes and the sustain pedal the same for a single chord?
Working hours and productivity expectations for game artists and programmers
Does ratifying USMCA imply a (stealth) ratification of UNCLOS?
What city and town structures are important in a low fantasy medieval world?
Are there any crystals that are theoretically possible, but haven't yet been made?
Is it appropriate to ask a professor to bump up a grade when I suspect it may be at the cutoff?
Was murdering a slave illegal in American slavery, and if so, what punishments were given for it?
How can I prevent Bash expansion from passing files starting with "-" as argument?
Why does snapping your fingers activate the Infinity Gauntlet?
Why does the U.S military use mercenaries?
What does it mean for a program to be 32 or 64 bit?
Displaying an Estimated Execution Plan generates CXPACKET, PAGELATCH_SH, and LATCH_EX [ACCESS_METHODS_DATASET_PARENT] waits
How (and why) does TOP impact an execution plan?How is parallelism threshold (seconds) used if query CPU cost is actually unitlessHigh CXPACKET and LATCH_EX waitsHow does SQL Server's optimizer estimate the number of rows in a joined table?Long running query with index seekWhy is TOP operation in SQL execution planActual Query Plan Estimated Cost and dm_exec_query_stats worker time do not gelBad execution plan after stats update due to temp table100% CPU with bad execution planPlan changes to include Eager Spool causes the query to run slower
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I'm running Microsoft SQL Server 2016 SP2-CU6 (13.0.5292.0) on a 4 vCPU VM with max degree of parallelism
set to 2
and cost threshold for parallelism
set to 50
.
In the mornings, when trying to display an Estimated Execution Plan for a SELECT TOP 100 query, I run into massive waits and the operation to render the estimated plan takes minutes, often times in the 5 - 7 minute range. Again, this is not the actual execution of the query, this is just the process to display an Estimated Execution Plan.
sp_WhoIsActive
will show either PAGEIOLATCH_SH
waits or LATCH_EX [ACCESS_METHODS_DATASET_PARENT]
waits and when I run Paul Randal's WaitingTasks.sql script during the operation it shows CXPACKET
waits with the worker threads showing PAGEIOLATCH_SH
waits:
*resource description field = exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
The worker threads look to be bringing the entire stats
table into memory (as those page numbers as well as subsequent page numbers shown from Paul Randal's query point back to clustered key for the stats
table). Once the plan does come back, it's basically instantaneous for the remainder of the day, even after I see most of the stats
table attrition from cache with only various records remaining (that I assume were pulled due to seek operations from similar queries).
I would expect this initial behavior if the query was actually executing with a plan that used SCAN operators, but why is it doing this when evaluating execution plans only to arrive at a SEEK operator as shown in the plan linked above? What can I do (aside from running this statement before office hours so my data is appropriately cached) to help improve performance here? I'm assuming a pair of covering indexes would be beneficial, but would they really guarantee any changes in behavior? I have to work within some storage and maintenance window limitations here, and the query itself is generated from a vendor solution, so any other suggestions (besides better indexing) would be welcome at this point.
sql-server performance sql-server-2016
add a comment |
I'm running Microsoft SQL Server 2016 SP2-CU6 (13.0.5292.0) on a 4 vCPU VM with max degree of parallelism
set to 2
and cost threshold for parallelism
set to 50
.
In the mornings, when trying to display an Estimated Execution Plan for a SELECT TOP 100 query, I run into massive waits and the operation to render the estimated plan takes minutes, often times in the 5 - 7 minute range. Again, this is not the actual execution of the query, this is just the process to display an Estimated Execution Plan.
sp_WhoIsActive
will show either PAGEIOLATCH_SH
waits or LATCH_EX [ACCESS_METHODS_DATASET_PARENT]
waits and when I run Paul Randal's WaitingTasks.sql script during the operation it shows CXPACKET
waits with the worker threads showing PAGEIOLATCH_SH
waits:
*resource description field = exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
The worker threads look to be bringing the entire stats
table into memory (as those page numbers as well as subsequent page numbers shown from Paul Randal's query point back to clustered key for the stats
table). Once the plan does come back, it's basically instantaneous for the remainder of the day, even after I see most of the stats
table attrition from cache with only various records remaining (that I assume were pulled due to seek operations from similar queries).
I would expect this initial behavior if the query was actually executing with a plan that used SCAN operators, but why is it doing this when evaluating execution plans only to arrive at a SEEK operator as shown in the plan linked above? What can I do (aside from running this statement before office hours so my data is appropriately cached) to help improve performance here? I'm assuming a pair of covering indexes would be beneficial, but would they really guarantee any changes in behavior? I have to work within some storage and maintenance window limitations here, and the query itself is generated from a vendor solution, so any other suggestions (besides better indexing) would be welcome at this point.
sql-server performance sql-server-2016
add a comment |
I'm running Microsoft SQL Server 2016 SP2-CU6 (13.0.5292.0) on a 4 vCPU VM with max degree of parallelism
set to 2
and cost threshold for parallelism
set to 50
.
In the mornings, when trying to display an Estimated Execution Plan for a SELECT TOP 100 query, I run into massive waits and the operation to render the estimated plan takes minutes, often times in the 5 - 7 minute range. Again, this is not the actual execution of the query, this is just the process to display an Estimated Execution Plan.
sp_WhoIsActive
will show either PAGEIOLATCH_SH
waits or LATCH_EX [ACCESS_METHODS_DATASET_PARENT]
waits and when I run Paul Randal's WaitingTasks.sql script during the operation it shows CXPACKET
waits with the worker threads showing PAGEIOLATCH_SH
waits:
*resource description field = exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
The worker threads look to be bringing the entire stats
table into memory (as those page numbers as well as subsequent page numbers shown from Paul Randal's query point back to clustered key for the stats
table). Once the plan does come back, it's basically instantaneous for the remainder of the day, even after I see most of the stats
table attrition from cache with only various records remaining (that I assume were pulled due to seek operations from similar queries).
I would expect this initial behavior if the query was actually executing with a plan that used SCAN operators, but why is it doing this when evaluating execution plans only to arrive at a SEEK operator as shown in the plan linked above? What can I do (aside from running this statement before office hours so my data is appropriately cached) to help improve performance here? I'm assuming a pair of covering indexes would be beneficial, but would they really guarantee any changes in behavior? I have to work within some storage and maintenance window limitations here, and the query itself is generated from a vendor solution, so any other suggestions (besides better indexing) would be welcome at this point.
sql-server performance sql-server-2016
I'm running Microsoft SQL Server 2016 SP2-CU6 (13.0.5292.0) on a 4 vCPU VM with max degree of parallelism
set to 2
and cost threshold for parallelism
set to 50
.
In the mornings, when trying to display an Estimated Execution Plan for a SELECT TOP 100 query, I run into massive waits and the operation to render the estimated plan takes minutes, often times in the 5 - 7 minute range. Again, this is not the actual execution of the query, this is just the process to display an Estimated Execution Plan.
sp_WhoIsActive
will show either PAGEIOLATCH_SH
waits or LATCH_EX [ACCESS_METHODS_DATASET_PARENT]
waits and when I run Paul Randal's WaitingTasks.sql script during the operation it shows CXPACKET
waits with the worker threads showing PAGEIOLATCH_SH
waits:
*resource description field = exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
The worker threads look to be bringing the entire stats
table into memory (as those page numbers as well as subsequent page numbers shown from Paul Randal's query point back to clustered key for the stats
table). Once the plan does come back, it's basically instantaneous for the remainder of the day, even after I see most of the stats
table attrition from cache with only various records remaining (that I assume were pulled due to seek operations from similar queries).
I would expect this initial behavior if the query was actually executing with a plan that used SCAN operators, but why is it doing this when evaluating execution plans only to arrive at a SEEK operator as shown in the plan linked above? What can I do (aside from running this statement before office hours so my data is appropriately cached) to help improve performance here? I'm assuming a pair of covering indexes would be beneficial, but would they really guarantee any changes in behavior? I have to work within some storage and maintenance window limitations here, and the query itself is generated from a vendor solution, so any other suggestions (besides better indexing) would be welcome at this point.
sql-server performance sql-server-2016
sql-server performance sql-server-2016
asked May 6 at 20:48
John EisbrenerJohn Eisbrener
5,64321443
5,64321443
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
It appears your request for an actual execution plan triggered stats updates. Since you mention this happens in the mornings, I imagine there's an overnight process that does a lot of modifications to the tables involved?
Thus SQL Server uses the stats to create the plan, has hit the modification threshold, and executes automatic stats updates as part of the operation.
In the XML for the estimated plan you shared, I see these close-together update dates for stats from this morning:
LastUpdate="2019-05-06T09:12:49.92"
LastUpdate="2019-05-06T09:12:58.3"
LastUpdate="2019-05-06T09:13:20.33"
LastUpdate="2019-05-06T09:13:09.67"
LastUpdate="2019-05-06T09:12:59.05"
LastUpdate="2019-05-06T09:12:39.56"
If these are very large, busy tables (seems likely based on the sampling percentages), then it's not too surprising that the stats updates are taking a lot of horsepower.
add a comment |
When I see long estimated plan times in SSMS it's one of the following in order of likelihood:
- The query optimizer decided that it needed to create or update statistics.
- The size of the estimated plan is very large (say, >10 MB) and it simply takes SSMS a long time to display it.
- Query compilation itself actually took a long time due to CPU usage in looking for a good enough plan.
- The server is under extreme duress. For example, I might have to wait for a gateway to become available.
- Various bugs that lead to extremely long running compile times.
For your situation the answer is almost certainly that SQL Server is updating or creating statistics. There are a few clues: the size of the query plan is small, the query plan is relatively simple with a low cost, and compile CPU is significantly lower than compile time:
New contributor Josh Darnell also pointed out a good clue with the last updated time for statistics in the XML.
SQL Server 2019 introduces a new wait type, WAIT_ON_SYNC_STATISTICS_REFRESH, for when queries are waiting on stats updates. It's much easier to diagnosis this issue on that version. Until then you'll just have to rely on indirect techniques.
Workarounds include updating statistics during a maintenance period or enabling Auto Update Stats Async for the database. Please understand the full ramifications of that option before changing it. Query plans will be created before statistics are updated instead of after statistics updates. For some workloads that can be a huge win. For others it can do more harm than good.
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "182"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f237509%2fdisplaying-an-estimated-execution-plan-generates-cxpacket-pagelatch-sh-and-lat%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
It appears your request for an actual execution plan triggered stats updates. Since you mention this happens in the mornings, I imagine there's an overnight process that does a lot of modifications to the tables involved?
Thus SQL Server uses the stats to create the plan, has hit the modification threshold, and executes automatic stats updates as part of the operation.
In the XML for the estimated plan you shared, I see these close-together update dates for stats from this morning:
LastUpdate="2019-05-06T09:12:49.92"
LastUpdate="2019-05-06T09:12:58.3"
LastUpdate="2019-05-06T09:13:20.33"
LastUpdate="2019-05-06T09:13:09.67"
LastUpdate="2019-05-06T09:12:59.05"
LastUpdate="2019-05-06T09:12:39.56"
If these are very large, busy tables (seems likely based on the sampling percentages), then it's not too surprising that the stats updates are taking a lot of horsepower.
add a comment |
It appears your request for an actual execution plan triggered stats updates. Since you mention this happens in the mornings, I imagine there's an overnight process that does a lot of modifications to the tables involved?
Thus SQL Server uses the stats to create the plan, has hit the modification threshold, and executes automatic stats updates as part of the operation.
In the XML for the estimated plan you shared, I see these close-together update dates for stats from this morning:
LastUpdate="2019-05-06T09:12:49.92"
LastUpdate="2019-05-06T09:12:58.3"
LastUpdate="2019-05-06T09:13:20.33"
LastUpdate="2019-05-06T09:13:09.67"
LastUpdate="2019-05-06T09:12:59.05"
LastUpdate="2019-05-06T09:12:39.56"
If these are very large, busy tables (seems likely based on the sampling percentages), then it's not too surprising that the stats updates are taking a lot of horsepower.
add a comment |
It appears your request for an actual execution plan triggered stats updates. Since you mention this happens in the mornings, I imagine there's an overnight process that does a lot of modifications to the tables involved?
Thus SQL Server uses the stats to create the plan, has hit the modification threshold, and executes automatic stats updates as part of the operation.
In the XML for the estimated plan you shared, I see these close-together update dates for stats from this morning:
LastUpdate="2019-05-06T09:12:49.92"
LastUpdate="2019-05-06T09:12:58.3"
LastUpdate="2019-05-06T09:13:20.33"
LastUpdate="2019-05-06T09:13:09.67"
LastUpdate="2019-05-06T09:12:59.05"
LastUpdate="2019-05-06T09:12:39.56"
If these are very large, busy tables (seems likely based on the sampling percentages), then it's not too surprising that the stats updates are taking a lot of horsepower.
It appears your request for an actual execution plan triggered stats updates. Since you mention this happens in the mornings, I imagine there's an overnight process that does a lot of modifications to the tables involved?
Thus SQL Server uses the stats to create the plan, has hit the modification threshold, and executes automatic stats updates as part of the operation.
In the XML for the estimated plan you shared, I see these close-together update dates for stats from this morning:
LastUpdate="2019-05-06T09:12:49.92"
LastUpdate="2019-05-06T09:12:58.3"
LastUpdate="2019-05-06T09:13:20.33"
LastUpdate="2019-05-06T09:13:09.67"
LastUpdate="2019-05-06T09:12:59.05"
LastUpdate="2019-05-06T09:12:39.56"
If these are very large, busy tables (seems likely based on the sampling percentages), then it's not too surprising that the stats updates are taking a lot of horsepower.
edited May 6 at 21:57
answered May 6 at 21:33
Josh DarnellJosh Darnell
9,07732345
9,07732345
add a comment |
add a comment |
When I see long estimated plan times in SSMS it's one of the following in order of likelihood:
- The query optimizer decided that it needed to create or update statistics.
- The size of the estimated plan is very large (say, >10 MB) and it simply takes SSMS a long time to display it.
- Query compilation itself actually took a long time due to CPU usage in looking for a good enough plan.
- The server is under extreme duress. For example, I might have to wait for a gateway to become available.
- Various bugs that lead to extremely long running compile times.
For your situation the answer is almost certainly that SQL Server is updating or creating statistics. There are a few clues: the size of the query plan is small, the query plan is relatively simple with a low cost, and compile CPU is significantly lower than compile time:
New contributor Josh Darnell also pointed out a good clue with the last updated time for statistics in the XML.
SQL Server 2019 introduces a new wait type, WAIT_ON_SYNC_STATISTICS_REFRESH, for when queries are waiting on stats updates. It's much easier to diagnosis this issue on that version. Until then you'll just have to rely on indirect techniques.
Workarounds include updating statistics during a maintenance period or enabling Auto Update Stats Async for the database. Please understand the full ramifications of that option before changing it. Query plans will be created before statistics are updated instead of after statistics updates. For some workloads that can be a huge win. For others it can do more harm than good.
add a comment |
When I see long estimated plan times in SSMS it's one of the following in order of likelihood:
- The query optimizer decided that it needed to create or update statistics.
- The size of the estimated plan is very large (say, >10 MB) and it simply takes SSMS a long time to display it.
- Query compilation itself actually took a long time due to CPU usage in looking for a good enough plan.
- The server is under extreme duress. For example, I might have to wait for a gateway to become available.
- Various bugs that lead to extremely long running compile times.
For your situation the answer is almost certainly that SQL Server is updating or creating statistics. There are a few clues: the size of the query plan is small, the query plan is relatively simple with a low cost, and compile CPU is significantly lower than compile time:
New contributor Josh Darnell also pointed out a good clue with the last updated time for statistics in the XML.
SQL Server 2019 introduces a new wait type, WAIT_ON_SYNC_STATISTICS_REFRESH, for when queries are waiting on stats updates. It's much easier to diagnosis this issue on that version. Until then you'll just have to rely on indirect techniques.
Workarounds include updating statistics during a maintenance period or enabling Auto Update Stats Async for the database. Please understand the full ramifications of that option before changing it. Query plans will be created before statistics are updated instead of after statistics updates. For some workloads that can be a huge win. For others it can do more harm than good.
add a comment |
When I see long estimated plan times in SSMS it's one of the following in order of likelihood:
- The query optimizer decided that it needed to create or update statistics.
- The size of the estimated plan is very large (say, >10 MB) and it simply takes SSMS a long time to display it.
- Query compilation itself actually took a long time due to CPU usage in looking for a good enough plan.
- The server is under extreme duress. For example, I might have to wait for a gateway to become available.
- Various bugs that lead to extremely long running compile times.
For your situation the answer is almost certainly that SQL Server is updating or creating statistics. There are a few clues: the size of the query plan is small, the query plan is relatively simple with a low cost, and compile CPU is significantly lower than compile time:
New contributor Josh Darnell also pointed out a good clue with the last updated time for statistics in the XML.
SQL Server 2019 introduces a new wait type, WAIT_ON_SYNC_STATISTICS_REFRESH, for when queries are waiting on stats updates. It's much easier to diagnosis this issue on that version. Until then you'll just have to rely on indirect techniques.
Workarounds include updating statistics during a maintenance period or enabling Auto Update Stats Async for the database. Please understand the full ramifications of that option before changing it. Query plans will be created before statistics are updated instead of after statistics updates. For some workloads that can be a huge win. For others it can do more harm than good.
When I see long estimated plan times in SSMS it's one of the following in order of likelihood:
- The query optimizer decided that it needed to create or update statistics.
- The size of the estimated plan is very large (say, >10 MB) and it simply takes SSMS a long time to display it.
- Query compilation itself actually took a long time due to CPU usage in looking for a good enough plan.
- The server is under extreme duress. For example, I might have to wait for a gateway to become available.
- Various bugs that lead to extremely long running compile times.
For your situation the answer is almost certainly that SQL Server is updating or creating statistics. There are a few clues: the size of the query plan is small, the query plan is relatively simple with a low cost, and compile CPU is significantly lower than compile time:
New contributor Josh Darnell also pointed out a good clue with the last updated time for statistics in the XML.
SQL Server 2019 introduces a new wait type, WAIT_ON_SYNC_STATISTICS_REFRESH, for when queries are waiting on stats updates. It's much easier to diagnosis this issue on that version. Until then you'll just have to rely on indirect techniques.
Workarounds include updating statistics during a maintenance period or enabling Auto Update Stats Async for the database. Please understand the full ramifications of that option before changing it. Query plans will be created before statistics are updated instead of after statistics updates. For some workloads that can be a huge win. For others it can do more harm than good.
answered May 6 at 23:29
Joe ObbishJoe Obbish
22.9k43498
22.9k43498
add a comment |
add a comment |
Thanks for contributing an answer to Database Administrators Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f237509%2fdisplaying-an-estimated-execution-plan-generates-cxpacket-pagelatch-sh-and-lat%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown