Great fun all around, I just need to get back to a normal sleeping schedule, this 4 hours a night thing is exhausting.
Technical notes below!
The session that Adam Machanic did about forcing better parallel execution plans was astounding. He took a 28 minute query and optimized it to about 3 seconds and by improving the parallelization.
The Optimizer Issue
The premise is that optimizer is outdated because the Memory to Data Volume ratio (size or speed) is nothing like the way it was 1997 (when the last big optimizer rewrite happened). This means the optimizer needs to be coaxed into doing the right thing.
The optimizer tends to serialize a lot of processing for a number of reasons that may not make sense now. The problem with serializing all of these processes is that Amdahl's Law (not theory, LAW) says that the number of serial processes substantially impacts performance as the number of processors increases. The goal is to make as many parallel as possible. The reason the optimizer does not default to this behaviour is because it is expecting greater disk latency than we have now that would have rendered this point moot.
Possible Approach
An example of a common item that inhibit can parallelism is the Scalar Function. Potential solutions to this are:
- Convert it to an in-line TVF and CROSS APPLY it.
- Create a CLR scalar function (weird but true, it works much faster)
To check how balanced the parallelism is you can open the properties of any step of the query plan and check view the actual number of rows returned for each thread (there is a little arrow thing hiding there).
There is a traceflag that will force the optimizer to try to make some part of query parallel (Trace Flag 8649) but this is not a good answer. The issue is that it doesn't ensure that you are actually removing the serial parts to balance the load.
One way to encourage the optimizer to seek the parallelism path without the Trace Flag is to use a TOP(@i) with an OPTION(OPTIMIZE FOR (@i = 2000000000)). This will make the optimizer expect 2 billion rows even if there are only 10,000 in the table. This will top the estimated cost calculate to the side of making the query parallel.
MAXDOP should be configured to less than the number of processing cores for each numa node. This avoids making for foreign memory requests which may be slow. It is ok to go higher, but this is a very sensible starting spot, be sure to test carefully.
Parallel Apply Pattern
The Parallel Apply Pattern can be used to enourage working with an managing efficient streams with the optimizer. The abstract form of this query is:
SELECT
myfields
FROM
[DRIVER TABLE]
CROSS APPLY
(
[CORRELATED PAYLOAD]
)
To execute this pattern the DRIVER of your query must be identified, for example is it really just calculating information about product stock levels? Then the driver table would be Product and the CORRELATED PAYLOAD would be the sophisticated joins, aggregations and calculations.
Roughly speaking, for each record in the DRIVER TABLE the CORRELATED PAYLOAD executes all of it's heavy set based work as a smaller piece rather than against the full DRIVER TABLE set. This is more efficient for parallel loads.
DRIVER TABLE issues
If the driver table is not going parallel there are a couple of choices after turning it into a derived table
1. Use the TOP techique mentioned above. The optimizer will think there are more rows.
2. Use a DISTINCT 0%ColA + ColA calculation in the select list to prevent a calculation from being extracted from the parallel stream.
CORRELATED PAYLOAD issues
If the CORRELATED PAYLOAD is still having it's calculations pulled away from the parallel stream that change the CROSS APPLY to an OUTER APPLY. This prevents the optimizer from knowing if it is safe to pull the calculations up (as a poor optimization choice).
Excellent synapsis...
ReplyDeleteI just listened to (Adam's PASS) recording (took three times to get it right!), and can't wait to test it out on a couple of long-running warehouse queries I have.
@SixStringSQL
Thanks! It was a really great session, I was surprised that I didn't see it discussed on many blog posts.
DeleteUpdating with the current trend is strictly advisable and the content furnished here also states the same.
ReplyDeleteThanks for sharing this wonderful and worth able article in here. The way to expressed is simply awesome.
Keep doing this job. Thanks :)
seo training institute
seo training
seo services
seo company
seo digital marketing course
seo training institute
seo course online
seo services
seo course fees
seo course near me
seo course in chennai
seo training in chennai
seo training institute
seo training course
seo training institute in chennai
seo training institute
seo training institute enar me
seo training fees in chennai
best seo training in chennai
seo training fees in chennai
seo training center in chennai
seo training and placement in chennai
best seo training center in chennai
best seo training center in chennai
best seo training institute in chennai