Prefer another language? Prefere receber em português? ¿Prefieres recibirlo en español? Choose here / Escolha aqui / Elige aquí

Thumbnail: "Decoding the DP-300" with the five skill areas and their exam weights, in the DBA teal and yellow.

Microsoft updated the DP-300 exam on October 27, 2026. DP-300 is the exam for the Azure Database Administrator Associate certification, and many DBAs ask me the same thing about it: "Is this only theory, or will I really use it?"

I know this exam from both sides. I let my DP-300 certification expire instead of renewing it, and when I had to take the full exam again, in June 2026, I failed the first attempt. I was a few points short. I studied the gaps and passed three days later. That was the version before the October 27 update, so the outline in this post has changed a little since then. I told that story in Renew Your Certification, or Take the Full Exam Again?, in my other newsletter. The lesson I took for this post: this exam is much bigger than it looks.

So this post does two things:

  1. One exam-style case study. One fictional company, 20 requirements, and the 35 DP-300 skills they need. It shows how big and how connected this exam really is.

  2. A deep dive into one of those skills: review execution plans. It answers the question customers ask me most: "Why didn't SQL Server choose the other plan?"

And the answer to "will I really use it?" is yes, almost all of it. The study guide is a list of skills, not a map. It tells you what to know, but not how the skills connect in a real project. The case shows that.

Let me be honest from the start. The case is not complete. A real project has more requirements, and each skill could be its own post. Think of it as a first version, one way to see the exam.

The DP-300 in one picture

The exam has five skill areas. These are the weights from the study guide, "skills measured as of October 27, 2026":

Skill area

Weight

Plan and implement data platform resources

15–20%

Implement a secure environment

20–25%

Monitor, configure, and optimize database resources

20–25%

Configure and manage automation of tasks

15–20%

Plan and configure a high availability and disaster recovery (HA/DR) environment

20–25%

The platforms are Azure SQL Database, Azure SQL Managed Instance, SQL Server on Azure Virtual Machines (Windows and Linux) and SQL Server on-premises. That last one surprises people. This is an Azure exam, but a big part of it is plain SQL Server.

The study guide lists 94 skills in 15 groups. But the exam doesn't ask you about one skill at a time. It gives you a situation, with many requirements at once, and you have to see which skills each one needs. That's where it gets hard.

One case, 35 skills

Here is a case in the style of the exam. The company is fictional. Rota means "route" in Portuguese, a good name for a logistics company.

Rota Logistics. A freight company with orders, shipments and billing on SQL Server.

Existing environment

  • SQL Server 2016 SP3 Enterprise, a two-node availability group in one datacenter.

  • OrdersDB, 4 TB, 24×7. It has 14 SQL Server Agent jobs, a CLR assembly, and cross-database queries with ShippingDB.

  • ShippingDB, 9 TB. The Shipments table has 3 billion rows, ten years of history.

  • BillingDB, 600 GB, with customer tax IDs.

  • A customer portal with 300 Azure SQL databases, one per corporate customer. Maintenance is done by hand.

  • Five warehouse servers running SQL Server on-premises.

Problems

  • Month-end reports push the CPU to 100%, and order entry times out.

  • Three queries regressed after the last compatibility level change.

  • Every morning, after the nightly load into ShippingDB, some queries get bad estimates.

  • The purge of old shipments takes 9 hours and causes blocking.

  • Blocking at the 10 AM peak, and nobody knows who the head blocker is.

Requirements

  1. R1. Move OrdersDB and ShippingDB to Azure with at most 15 minutes of downtime. Keep the Agent jobs, the CLR assembly and the cross-database queries.

  2. R2. Fraud analysts must run partial-match searches on tax IDs. No administrator may ever see them in plaintext.

  3. R3. The warehouse servers stay on-premises for two more years. Inventory, patch and assess them from Azure.

  4. R4. Deploy every Azure resource from code, the same way in dev, test and production.

  5. R5. Microsoft Entra identities only, with least privilege.

  6. R6. No public endpoints.

  7. R7. Support staff see customer emails masked.

  8. R8. Regional managers see only their own region's orders.

  9. R9. Shipment history must be tamper-evident for auditors.

  10. R10. Classify personal data. Audit permission changes and keep the logs for one year.

  11. R11. Month-end reports must not slow down order entry.

  12. R12. Catch plan regressions automatically and keep the plan history.

  13. R13. Fix the bad estimates after the nightly load.

  14. R14. Purge shipments older than seven years in minutes, and use less storage for old data.

  15. R15. Keep a performance baseline. Alert when CPU stays above 80% for 15 minutes.

  16. R16. Find the head blocker during the 10 AM peak.

  17. R17. Run one maintenance script on all 300 portal databases, with no VMs.

  18. R18. On-call knows within minutes when a job fails.

  19. R19. Survive a regional outage: lose only seconds of data, be back within one hour, and keep the same connection string.

  20. R20. Keep monthly backups for seven years, restore to any point in the last 14 days, and test DR twice a year.

Now the same case as a picture. In the center, the case. Around it, every DP-300 skill it needs, by skill area, with the requirements each one answers.

An exam-style case study in the center: Rota Logistics, a fictional company, with its current SQL Server environment, its problems and 20 numbered requirements. Around it, 35 DP-300 skills grouped by the five skill areas, each tagged with the requirements it answers and connected to them by lines. Always Encrypted with secure enclaves, review execution plans and statistics maintenance are highlighted.

Thirty-five of the 94 skills, from all five areas, in one case. And this is a simplified case. A real project has more.

How I would read this case

This is how I would think about it, the same way I do with a real customer.

1. Two platforms, not one. R1 is the first clue. Agent jobs, CLR and cross-database queries point to Azure SQL Managed Instance for OrdersDB and ShippingDB. Managed Instance also supports Resource Governor (R11) and ledger (R9).

2. The trap is in R2. Partial-match searches on encrypted data, with no admin able to read it, need Always Encrypted with secure enclaves. Plain Always Encrypted only allows equality comparisons, with deterministic encryption. And here is the trap: Microsoft Learn says secure enclaves are available in SQL Server 2019 and later and in Azure SQL Database, not in Managed Instance. So BillingDB goes to Azure SQL Database, not to the same managed instance. TDE alone doesn't answer R2 either: it protects data at rest, not from the DBA.

3. Minimal downtime means the Managed Instance link. SQL Server 2016 SP3 is supported (with the Azure Connect pack). It replicates in near real time through a distributed availability group, and the only downtime is the cutover. Microsoft calls it the only truly online migration to Managed Instance. Log Replay Service also works, but it restores log backups every few minutes.

4. Not everything goes to the cloud. R3 is Azure Arc: the warehouse servers stay where they are, and Azure gives you inventory, patching and assessments.

5. Performance needs a plan for each symptom. Resource Governor for the month-end reports (R11). Query Store and automatic tuning for the regressions (R12). Statistics maintenance and the execution plans for the morning estimates (R13). That's the deep dive below. Partitioning and compression to turn a 9-hour purge into a partition switch (R14).

6. HA/DR is about the words in the requirement. "Same connection string" in R19 means failover groups, because their read-write listener keeps its name after a geo-failover. "Lose only seconds" fits, because geo-replication is asynchronous. "Seven years" in R20 is long-term retention, which goes up to ten years.

That's how the exam feels. Not one hard question about one feature. Many small requirements, each one pointing to a different skill, and one or two traps where a feature you know well works on one platform and not on the other.

Now let's go deep into one skill from the case: review execution plans, from R12 and R13.

Deep dive: reviewing execution plans

There is one question I hear from customers again and again:

❝

"Why didn't SQL Server choose the other plan?"

It sounds simple. It isn't. And the honest first answer is: the plan you are looking at is the winner, and the losers are not in it.

The query optimizer is cost-based. It builds alternatives, estimates how many rows each step will process (that's cardinality estimation, or CE), gives each alternative a cost, and keeps the cheapest plan it found. Found, not "the best that exists". The optimizer has a budget. When it reaches it, it stops and uses the best plan so far. Microsoft documents that this budget is counted in tasks (over half a million of them), not in seconds.

Why stop early? Because searching costs time too. Finding the perfect plan could take longer than running the query with a good one. Think of a query that runs in 50 milliseconds: spending two seconds to compile the perfect plan for it makes no sense. So the optimizer looks for a plan that is good enough, not the perfect one.

Think of the GPS app on your phone. It gives you a good route in a second. It doesn't check every street in the city first, because by then you could already be at your destination. The optimizer works the same way: when it finds a route that fits its budget, it goes.

That's why a plan that looks bad to us, as humans, can be the best option the optimizer saw in the time it allowed itself, or the only one.

What the plan shows you

An actual execution plan has a lot of evidence, if you know where to look:

  • Estimated rows vs actual rows, at every operator. Start at the leaves (the right side) and find the first place where they diverge. Errors grow as they move up the plan.

  • OptimizerStatsUsage: which statistics objects the optimizer loaded, their sampling percent, modification count and last update. It needs SQL Server 2016 SP2 or 2017 CU3 and later, and it isn't shown for CE 70.

  • CardinalityEstimationModelVersion: which CE model was used. It follows the database compatibility level, unless a hint changed it.

  • ParameterList: the values the plan was compiled with, and the values it ran with. When they are very different, think of parameter sniffing: the plan was built for the value of the first call and then reused for other values. It's like packing your suitcase from yesterday's weather forecast. Perfect for the sun, wrong for today's rain.

  • Optimization level and StatementOptmEarlyAbortReason: GoodEnoughPlanFound or TimeOut. TimeOut means the search ended early, not that the query timed out.

  • Warnings, memory grant, spills, NonParallelPlanReason.

Two columns. Left, what the plan shows: estimated and actual rows, statistics used, CE model, compiled parameter values, optimization level, early termination reason, warnings and memory grant. Right, what it doesn't show: the plans that lost and their costs, index definitions, session settings, how the data looked at compile time, and the optimizer's search.

What the plan doesn't show you

Here is the limit. The plan doesn't have:

  • The alternatives that lost, and their costs. You can't compare against a plan you never see.

  • The index definitions. The plan shows the index it used, not the ones it could have used.

  • The session settings and the whole compile context.

  • The data as it was at compile time. The plan may be days old. The data isn't.

Let me give you a generic example from a real analysis. The plan had a Nested Loops join. Its inner side was a lazy Table Spool: a small work table that SQL Server fills once and then reads again and again. The spool held about 4,000 rows from a temporary table. It was read again tens of millions of times. The outer estimate was about two times higher than the actual rows.

From the plan XML alone, we could describe all of this very precisely. But we couldn't prove why Nested Loops won over a Hash Match, or over the other join order. Those plans weren't in the XML. So every explanation stayed at the level of "likely".

How to get the missing information

Step by step, from the safest to the deepest:

  1. Collect the context. The query text, the table and index definitions, sys.dm_db_stats_properties for the statistics in OptimizerStatsUsage, the compatibility level and the database-scoped configurations.

  2. Check the history. Query Store shows every plan the query used over time, with its runtime numbers. It still doesn't show the plans that were only considered.

  3. Cost the alternative yourself. Run the query with a hint that forces the other shape, in a test copy: OPTION (HASH JOIN), OPTION (LOOP JOIN), OPTION (MAXDOP 1), or USE HINT (...). Now you have both plans, and you can compare their estimated costs and their actual runtime. If the forced plan is faster but costs more on paper, the problem is usually in the estimates, not in the optimizer's choice.

  4. Watch the estimation. The Extended Event query_optimizer_estimate_cardinality shows how the estimates were made, and which statistics were used. It's supported, but Microsoft Learn says it isn't available in Azure SQL Database.

❝

⚠️ Warning: test copies only. The next step uses undocumented trace flags. Microsoft doesn't support them. They can produce a huge amount of output, slow down a busy server, and behave differently from one version to the next. Never turn them on in production, and never use them as a fix.

  1. Look inside the optimizer. This is where undocumented trace flags come in. I won't list their numbers here, on purpose. What matters is what they show: the optimizer's memo (its internal list of alternatives) at the start and at the end of optimization, the transformation rules it applied, the time and cost of each optimization stage, the logical trees going in and out, and the statistics and calculations behind the estimates.

Even step 5 has a limit. The final memo keeps the alternatives that survived. Many were pruned during the search and never appear. Sometimes the only complete answer comes from debugging the engine itself. That's why "why not the other plan?" is such a hard question. The full answer often needs more information than anyone has on a normal day.

Where each tool works

The case study runs SQL Server 2016 SP3 today and moves to Azure. The tools above don't all exist everywhere:

Tool

SQL Server

Azure SQL Database

Azure SQL Managed Instance

Query Store

2016 and later

Yes

Yes

OptimizerStatsUsage in the plan

2016 SP2, 2017 CU3 and later (not with CE 70)

Yes

Yes

sys.dm_db_stats_histogram

2016 SP1 CU2 and later

Yes

Yes

PERSIST_SAMPLE_PERCENT

2016 SP1 CU4, 2017 CU1 and later

Yes

Yes

USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS')

2016 SP1 and later

Yes

Yes

Automatic tuning (FORCE_LAST_GOOD_PLAN)

2017 and later

Yes

Yes

Query Store hints

2022 and later

Yes

Yes

query_optimizer_estimate_cardinality (Extended Event)

Yes

No

Not documented, test first

CE feedback for expressions

2025

Yes

Yes

So on Rota's SQL Server 2016 SP3, you have Query Store, the statistics DMVs and PERSIST_SAMPLE_PERCENT. You don't have automatic tuning or Query Store hints until you move. And PERSIST_SAMPLE_PERCENT behaves the same on 2016 SP3 and in Azure: it keeps your sample rate for later updates, including automatic ones. Since 2016 SP2 CU17, it also survives an index rebuild.

Before you change anything in production

Steps 3 to 5 are for a test copy. But one day the fix has to go to production: a hint, or a statistics update. Do it as a small change with a way back.

1. Capture the "before". You need numbers to compare against.

-- The query's recent history (Query Store, SQL Server 2016 and later)
SELECT TOP (10) p.plan_id, rs.last_execution_time, rs.avg_duration, rs.avg_cpu_time, rs.avg_logical_io_reads
FROM sys.query_store_runtime_stats AS rs
JOIN sys.query_store_plan AS p ON p.plan_id = rs.plan_id
WHERE p.query_id = @query_id
ORDER BY rs.last_execution_time DESC;

Also save the actual plan and the output of the statistics query in the next section. Write down the plan_id of the plan in use today.

2. Apply the change in the smallest way.

A hint. On SQL Server 2022 and later, Azure SQL Database and Managed Instance, use a Query Store hint. It changes one query, with no code change:

EXEC sys.sp_query_store_set_hints @query_id = @query_id,
     @query_hints = N'OPTION (USE HINT (''ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS''))';

On SQL Server 2016 to 2019 there are no Query Store hints. The options are a code change with OPTION (...), or a plan guide.

A statistics update. Update the one statistic you need, by name, not the whole table. Do it outside the peak. It doesn't block normal reads and writes, but it reads the data (a lot of I/O on a big table), and it makes the plans that use it recompile.

UPDATE STATISTICS dbo.Shipments (IX_Shipments_CustomerID_ShipDate);

3. Watch, and know your way back. Compare duration, CPU and logical reads with the "before". Decide the trigger in advance, for example: order entry times out, or CPU stays above 80% for 15 minutes. Then:

What you changed

How to undo it

Query Store hint

EXEC sys.sp_query_store_clear_hints @query_id = @query_id;

Code hint (OPTION)

Deploy the previous version of the code

Plan guide

EXEC sp_control_plan_guide N'DROP', N'<plan guide name>';

Statistics update

You can't undo it. Force the old plan you saved: EXEC sp_query_store_force_plan @query_id, @plan_id; (SQL Server 2016 and later). Remove it later with sp_query_store_unforce_plan.

That last row is the important one. A statistics update has no undo. Your safety net is the old plan in Query Store, so check that you have it before you start.

A common question about statistics

Here is a question I get often, in one form or another. It fits the deep dive very well.

The scenario: a query is slow. The table has a statistic on the column group the query uses, built with a full scan (100% sample). The DBA runs UPDATE STATISTICS with the default sample, which on a big table can be a tiny fraction, something like 0.07%. The plan changes to an index seek, and the query is fast again. Then come two questions:

❝

A statistic with a 100% sample was not good enough, and a fresh one with a 0.07% sample was? And why does the optimizer need histograms to estimate joins? Aren't histograms only for literal predicates in the WHERE clause?

Two good questions. Let's take them one at a time.

"100% wasn't enough, but 0.07% was?"

Probably the sample rate is not what fixed it. When you run UPDATE STATISTICS, at least three things change at the same time:

  1. The statistics become fresh. The old full-scan statistic was exact on the day it was built. Every row inserted or updated after that is not in its histogram. A classic case is an ascending key: new dates or IDs above the last histogram step. The modification counter in sys.dm_db_stats_properties tells you how much changed.

  2. The plan recompiles. Microsoft documents that updating statistics can cause query plans to recompile. The new plan was compiled with today's parameter values. The old plan in cache may have been compiled for a very different value. That's parameter sniffing (yesterday's suitcase again), and the stats update "fixed" it by accident.

  3. Maybe a different statistics object changed. The question mentions a column group. For more than one column, the optimizer uses the density vector of a multi-column statistic, and the histogram exists only for the first column. UPDATE STATISTICS dbo.Table without a name updates every statistic on the table, so the one that mattered may not be the one with 100%.

There is also a trap with sampling itself. If a statistic was built with FULLSCAN and later an automatic update ran, the automatic update uses the default sample, unless PERSIST_SAMPLE_PERCENT = ON was set. So "the 100% statistic" may not have been 100% anymore.

How do you prove which one it was? Collect the evidence before you update anything:

-- Statistics header for every statistic on the table
SELECT s.name, sp.last_updated, sp.rows, sp.rows_sampled,
       sp.modification_counter, sp.persisted_sample_percent
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) AS sp
WHERE s.object_id = OBJECT_ID('dbo.Orders');

-- The histogram of one statistic
SELECT step_number, range_high_key, equal_rows, range_rows, distinct_range_rows
FROM sys.dm_db_stats_histogram(OBJECT_ID('dbo.Orders'), 2);

Save the actual plan too: its OptimizerStatsUsage and ParameterList tell you which statistics were loaded and which values it was compiled for.

How much does each cause matter? That needs numbers, not theory. Part 2 of this post, a detailed lab in a few weeks, will reproduce this case: a full-scan statistic, the data changing, the default-sample update. It will measure the before and after: estimated and actual rows, logical reads and CPU, and it will follow the runbook above.

To go even deeper, my colleague Fabiano Amorim built SQLStatsXRay, a free, open-source (MIT) toolkit that decodes everything SQL Server stores in a statistics object, including parts DBCC SHOW_STATISTICS doesn't show. It checks each histogram step against the real data, and it separates errors that come from sampling from errors that come from changes since the last update. That is exactly the question here. Fabiano also warns about two things, and I agree:

❝

⚠️ Warning. Statistics contain real data values, so treat the tool's output as sensitive. And loading edited statistics back with STATS_STREAM is not supported by Microsoft: do it only in a test copy, never in production.

"Why histograms for joins?"

Because a join estimate needs to know how the values on both sides overlap.

Think of two jigsaw puzzles. Before you try to fit pieces together, you look at the picture on each box. A histogram is the picture on the box: it shows which values a column has and how many rows each one has. For an equality join, the optimizer compares the histograms of the join columns on both tables to estimate how many rows will match, before it touches a single row.

Microsoft Learn describes two models:

  • The legacy model (CE 70, compatibility level 110 and lower), simple containment: it applies your filters to each side first, then matches the two pictures.

  • The newer model (CE 120 and later, compatibility level 120 and higher), base containment: it matches the full pictures of the two tables first, then applies your filters.

Either way, histograms are part of the join estimate. And the filters matter too: a WHERE on one table changes which values of the join column survive.

If you suspect the join model is wrong for one query, you can test the other one with OPTION (USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS')), which uses simple containment under the newer CE. Test it; don't use it as a blanket fix. In SQL Server 2025 and Azure SQL, CE feedback for expressions can even learn which containment model fits a repeating join pattern.

How to use this

  • Studying for the exam? Read the case requirement by requirement. For each one, name the skill, the platform and the trap, then build it in a lab. Then take the new practice assessment on AI Skills Navigator. Microsoft says the old practice assessment on Learn is no longer updated.

  • Already certified? The certification renews every 12 months with a free online assessment. Renew or take the full exam again? I wrote about that choice in the post I mentioned at the start. Either way, the new outline is a good reason to check the new items: database watcher (Microsoft is retiring it: no new watchers from November 9, 2026), ledger, secure enclaves, SQL database in Fabric.

  • Working as a DBA? Use the case the other way: start from the problem in front of you, find the requirement, then the skill, and you have the commands.

Your next step, today

Whatever group you're in, try this today. It takes five minutes:

  1. Pick one slow query in your system.

  2. Get its actual execution plan.

  3. Start at the far right, at the leaves, and find the first operator where the estimated rows and the actual rows are very different.

That operator is where the story of that plan starts. Then check the statistics behind it with the query above. Reply to this email and tell me what you found.

In a few weeks, Part 2 brings the lab: the same steps on real data, with the numbers before and after each change.

References

Glossary

Term

What it means

Actual execution plan

The plan SQL Server used to run a query, with runtime numbers such as the actual rows at each operator. An estimated plan has only the optimizer's guesses.

Always Encrypted (secure enclaves)

Encryption where the keys stay with the client application, so the database engine and its administrators never see the plaintext. Secure enclaves add a protected memory area on the server, which allows richer queries on encrypted columns, such as partial-match searches.

Automatic tuning

A feature that watches for plan regressions and, with FORCE_LAST_GOOD_PLAN, forces the last plan that performed well. SQL Server 2017 and later, and Azure SQL.

Availability group

A SQL Server high availability feature (Always On) that keeps copies of a group of databases on other servers, called replicas. If the primary fails, a replica takes over.

Azure Arc

A Microsoft service that lets you manage servers outside Azure, such as SQL Server on-premises, from Azure: inventory, patching and assessments.

Azure SQL Database

A fully managed database service in Azure. Microsoft runs the server, the patching and the backups; you manage the database.

Azure SQL Managed Instance

A managed SQL Server instance in Azure, very close to SQL Server on-premises. It keeps instance features such as SQL Server Agent jobs, CLR and cross-database queries.

Cardinality estimation (CE)

How the optimizer estimates the number of rows each step of a plan will process. The CE model version follows the database compatibility level.

CLR assembly

.NET code loaded into SQL Server, so T-SQL can call functions or procedures written in a language such as C#.

Compatibility level

A database setting that controls some engine behaviors, including the CE model. Changing it can make some queries faster and others slower.

Density vector

Part of a statistics object. It stores how unique the values are for each prefix of the statistic's columns. The optimizer uses it for estimates on more than one column.

DMV (dynamic management view)

A system view or function that shows the server's internal state, such as sys.dm_db_stats_properties for statistics.

DP-300

The Microsoft exam for the Azure Database Administrator Associate certification. It covers Azure SQL, SQL Server on Azure Virtual Machines and SQL Server on-premises.

Extended Events

SQL Server's lightweight tracing system. You choose the events to capture, such as query_optimizer_estimate_cardinality, and where to save them.

Failover group

An Azure SQL feature that replicates databases to another region and fails them over together. Its listener keeps the same name after a failover, so the connection string doesn't change.

Hash Match and Nested Loops

Two ways to join tables. Nested Loops reads the inner side once for each outer row, which is good for few rows. Hash Match builds a hash table from one input and probes it with the other, which is good for many rows.

Histogram

Part of a statistics object. It shows how the values of the first column are spread, in up to 200 steps, and how many rows each step holds.

Ledger

A feature that makes table data tamper-evident. SQL Server keeps a cryptographic record of every change, so auditors can verify that nobody changed the history.

Long-term retention (LTR)

Azure SQL keeps full backups for up to ten years, for audits and compliance.

Managed Instance link

A feature that replicates a SQL Server database to Azure SQL Managed Instance in near real time, through a distributed availability group. It's used for online migration and for hybrid DR.

Microsoft Entra ID

Microsoft's cloud identity service, formerly Azure Active Directory. It handles sign-in for users and applications in Azure SQL.

Parameter sniffing

SQL Server builds a plan for the parameter values of the first call and reuses it for later calls. It works well when values are similar and badly when they are very different.

Partitioning

Splits a big table into parts, usually by date. A partition switch moves a whole part in or out as a metadata change, so a purge can take seconds instead of hours.

Query hint

An instruction added to a query, such as OPTION (HASH JOIN), that limits the optimizer's choices. A plan guide attaches hints to a query without changing the application code.

Query optimizer

The part of SQL Server that decides how to run a query. It's cost-based: it compares alternative plans and keeps the cheapest one it finds within its budget.

Query Store

A feature that saves the plans and runtime statistics of each query in the database, so you can see the history, find regressions and force a plan. Query Store hints (SQL Server 2022 and later, and Azure SQL) apply a hint to one query with no code change.

Resource Governor

A feature that limits the CPU, memory and I/O a workload can use, so heavy reports don't slow down critical work.

SQL Server Agent

SQL Server's job scheduler. It runs jobs, such as backups and maintenance, and can alert when a job fails.

Statistics

Objects that describe how the data in one or more columns is spread: a header, a density vector and a histogram. The optimizer uses them to estimate rows.

Table Spool

A plan operator that saves rows in a hidden work table in tempdb, so they can be read again. A lazy spool fills it only as rows are requested.

TDE (Transparent Data Encryption)

Encrypts the database files and backups at rest. It doesn't hide data from users or administrators who can query the database.

Trace flag

A switch that changes a specific engine behavior. Some are documented and supported; undocumented ones are for test copies only.

How I write: every post starts from my own notes and experience. I use AI tools to help draft and edit, and I review every word before it goes out.

The technical details in this post are based on publicly available Microsoft documentation as of November 2026.

Disclaimer: The views expressed in this article are those of the author and do not necessarily reflect the official policy or position of Microsoft. The author is a Microsoft employee.