Unleashing SQL Server 2022: Enhancements to sys.dm_exec_query_statistics_xml

In the world of data management and analysis, SQL Server 2022 has brought numerous improvements and enhancements, one of the most notable being the advancements to the dynamic management view (DMV) sys.dm_exec_query_statistics_xml. This DMV provides detailed runtime statistics about query execution, which is invaluable for performance tuning and query optimization.

In this blog, we will explore the enhancements to sys.dm_exec_query_statistics_xml in SQL Server 2022 using the JBDB database. We’ll walk through a comprehensive business use case, demonstrate these enhancements with T-SQL queries, and show how these can be leveraged for better performance insights.

Business Use Case: Optimizing an E-commerce Database πŸ›’

Imagine you are a database administrator for JBDB, an e-commerce platform with millions of users and transactions. Ensuring optimal query performance is crucial for providing a seamless user experience. You need to monitor query performance, identify slow-running queries, and understand execution patterns to make informed optimization decisions.

The JBDB Database Schema

For this demo, we’ll use a simplified version of the JBDB database with the following schema:

  • Customers: Stores customer information.
  • Orders: Stores order details.
  • OrderItems: Stores items within an order.
  • Products: Stores product details.

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Email NVARCHAR(100),
    CreatedAt DATETIME
);

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName NVARCHAR(100),
    Price DECIMAL(10, 2),
    Stock INT
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT FOREIGN KEY REFERENCES Customers(CustomerID),
    OrderDate DATETIME
);

CREATE TABLE OrderItems (
    OrderItemID INT PRIMARY KEY,
    OrderID INT FOREIGN KEY REFERENCES Orders(OrderID),
    ProductID INT FOREIGN KEY REFERENCES Products(ProductID),
    Quantity INT,
    Price DECIMAL(10, 2)
);
INSERT INTO Customers (CustomerID, Name, Email, CreatedAt)
VALUES 
(1, 'John Doe', 'john.doe@example.com', '2023-01-10'),
(2, 'Jane Smith', 'jane.smith@example.com', '2023-02-15'),
(3, 'Emily Johnson', 'emily.johnson@example.com', '2023-03-22'),
(4, 'Michael Brown', 'michael.brown@example.com', '2023-04-05'),
(5, 'Sarah Davis', 'sarah.davis@example.com', '2023-05-30');


INSERT INTO Products (ProductID, ProductName, Price, Stock)
VALUES 
(1, 'Laptop', 999.99, 50),
(2, 'Smartphone', 499.99, 150),
(3, 'Tablet', 299.99, 75),
(4, 'Headphones', 149.99, 200),
(5, 'Smartwatch', 199.99, 100);

INSERT INTO Orders (OrderID, CustomerID, OrderDate)
VALUES 
(1, 1, '2023-06-15'),
(2, 2, '2023-07-20'),
(3, 3, '2023-08-25'),
(4, 4, '2023-09-10'),
(5, 5, '2023-10-05');

INSERT INTO OrderItems (OrderItemID, OrderID, ProductID, Quantity, Price)
VALUES 
(1, 1, 1, 1, 999.99),
(2, 1, 4, 2, 149.99),
(3, 2, 2, 1, 499.99),
(4, 2, 5, 1, 199.99),
(5, 3, 3, 2, 299.99),
(6, 4, 1, 1, 999.99),
(7, 4, 2, 1, 499.99),
(8, 5, 5, 2, 199.99),
(9, 5, 3, 1, 299.99);

Enhancements to sys.dm_exec_query_statistics_xml πŸ†•

SQL Server 2022 introduces several key enhancements to sys.dm_exec_query_statistics_xml, including:

  1. Enhanced Plan Information: More detailed execution plan information is now available.
  2. Wait Statistics: Comprehensive wait statistics are included to identify bottlenecks.
  3. Query Store Integration: Better integration with the Query Store for historical analysis.

Demonstrating Enhancements with T-SQL Queries πŸ“Š

Let’s dive into some T-SQL queries to see these enhancements in action.

Step 1: Capture a Sample Query Execution

First, we’ll execute a sample query to fetch order details along with customer and product information.

SELECT o.OrderID, o.OrderDate, c.Name AS CustomerName, p.ProductName, oi.Quantity, oi.Price
FROM
Orders o
JOIN
Customers c ON o.CustomerID = c.CustomerID
JOIN
OrderItems oi ON o.OrderID = oi.OrderID
JOIN
Products p ON oi.ProductID = p.ProductID
WHERE
o.OrderDate BETWEEN '2023-01-01' AND '2023-12-31';

Step 2: Retrieve Query Statistics XML

Next, we’ll use sys.dm_exec_query_statistics_xml to retrieve detailed execution statistics for the above query.

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT
qst.sql_handle,
qst.plan_handle,
qst.execution_count,
qst.total_worker_time,
qst.total_elapsed_time,
qst.total_logical_reads,
qst.total_physical_reads,
qst.creation_time,
qst.last_execution_time,
q.text AS query_text,
qpx.query_plan
FROM
sys.dm_exec_query_stats AS qst
CROSS APPLY
sys.dm_exec_sql_text(qst.sql_handle) AS q
CROSS APPLY
sys.dm_exec_query_plan(qst.plan_handle) AS qpx
WHERE
q.text LIKE '%SELECT o.OrderID, o.OrderDate, c.Name AS CustomerName, p.ProductName, oi.Quantity, oi.Price%';

Step 3: Analyzing Enhanced Plan Information πŸ”

With SQL Server 2022, the execution plan XML now includes more detailed information about the query execution. You can parse the XML to extract specific details.

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT 
    query_plan.value('(//RelOp/LogicalOp)[1]', 'NVARCHAR(100)') AS LogicalOperation,
    query_plan.value('(//RelOp/PhysicalOp)[1]', 'NVARCHAR(100)') AS PhysicalOperation,
    query_plan.value('(//RelOp/RunTimeInformation/RunTimeCountersPerThread/ActualRows)[1]', 'INT') AS ActualRows,
    query_plan.value('(//RelOp/RunTimeInformation/RunTimeCountersPerThread/ActualEndOfScans)[1]', 'INT') AS ActualEndOfScans
FROM 
    (SELECT CAST(qpx.query_plan AS XML) AS query_plan
     FROM sys.dm_exec_query_stats qs
     CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qpx
     WHERE qs.sql_handle = (SELECT sql_handle FROM sys.dm_exec_requests WHERE session_id = @@SPID)) AS x;

Step 4: Monitoring Wait Statistics ⏱️

Wait statistics help identify performance bottlenecks such as CPU, IO, or memory waits. SQL Server 2022 provides enhanced wait statistics in the query execution plans.

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT 
    wait_type,
    wait_time_ms AS total_wait_time_ms,
    wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms,
    signal_wait_time_ms
FROM 
    sys.dm_exec_session_wait_stats
WHERE 
    session_id = @@SPID;

Leveraging Query Store Integration πŸ“ˆ

SQL Server 2022’s improved integration with the Query Store allows for historical query performance analysis, helping you understand performance trends and regressions.

SELECT 
    qsp.plan_id,
    qsp.query_id,
    qsqt.query_sql_text AS query_text,
    qsrs.count_executions AS execution_count,
    qsrs.avg_duration,
    qsrs.avg_cpu_time,
    qsrs.avg_logical_io_reads
FROM 
    sys.query_store_runtime_stats qsrs
JOIN 
    sys.query_store_plan qsp ON qsrs.plan_id = qsp.plan_id
JOIN 
    sys.query_store_query qsq ON qsp.query_id = qsq.query_id
JOIN 
    sys.query_store_query_text qsqt ON qsq.query_text_id = qsqt.query_text_id
WHERE 
    qsqt.query_sql_text LIKE '%SELECT o.OrderID, o.OrderDate, c.Name AS CustomerName, p.ProductName, oi.Quantity, oi.Price%';

Conclusion πŸŽ‰

The enhancements to sys.dm_exec_query_statistics_xml in SQL Server 2022 provide deeper insights into query performance, making it easier to identify and resolve performance issues. By leveraging these new capabilities, database administrators can ensure their SQL Server instances run more efficiently and effectively.

Feel free to experiment with the queries provided and explore the powerful new features SQL Server 2022 has to offer. Happy querying! πŸ§‘β€πŸ’»

SQL Server 2022: A Deep Dive into the APPROX_PERCENTILE_CONT Function with JBDB Database

SQL Server 2022 introduces several new features, one of the most exciting being the APPROX_PERCENTILE_CONT function. This function allows for efficient and approximate calculation of percentiles in large datasets, which can be particularly useful for analytics and data-driven decision-making. In this blog, we will explore the APPROX_PERCENTILE_CONT function in detail, using the JBDB database for practical demonstrations. We’ll start with a business use case, dive into the function’s capabilities, and provide a range of T-SQL queries for you to try. Let’s get started! πŸš€


Business Use Case: Customer Transaction Analysis πŸ’Ό

Consider a retail company that wants to analyze customer spending behavior. The company has a vast amount of transaction data stored in the JBDB database. To optimize marketing strategies and tailor promotions, they want to identify spending patterns across different customer segments.

For example, the company might want to know the 90th percentile of spending amounts to target high-value customers with exclusive offers. Calculating this percentile accurately in a large dataset can be resource-intensive. The APPROX_PERCENTILE_CONT function offers a solution by providing an approximate, yet efficient, calculation of percentiles.


Understanding the APPROX_PERCENTILE_CONT Function πŸ“Š

The APPROX_PERCENTILE_CONT function is designed to compute approximate percentile values for a set of data. This function is particularly useful when dealing with large datasets, as it offers a performance advantage by using approximate algorithms.

Syntax:

APPROX_PERCENTILE_CONT ( percentile ) WITHIN GROUP ( ORDER BY numeric_expression )
  • percentile: A value between 0 and 1 that specifies the desired percentile.
  • numeric_expression: The column or expression to calculate the percentile on.

Example 1: Basic Usage 🌟

Let’s calculate the 90th percentile of customer transaction amounts.

Setup:

USE JBDB;
GO

CREATE TABLE CustomerTransactions (
    TransactionID INT PRIMARY KEY,
    CustomerID INT,
    TransactionAmount DECIMAL(18, 2),
    TransactionDate DATE
);

INSERT INTO CustomerTransactions (TransactionID, CustomerID, TransactionAmount, TransactionDate)
VALUES
(1, 101, 50.00, '2023-01-15'),
(2, 102, 150.00, '2023-01-16'),
(3, 103, 300.00, '2023-01-17'),
(4, 101, 75.00, '2023-01-18'),
(5, 104, 200.00, '2023-01-19'),
(6, 105, 125.00, '2023-01-20'),
(7, 106, 400.00, '2023-01-21'),
(8, 102, 175.00, '2023-01-22');
GO

Query to Calculate 90th Percentile:

SELECT APPROX_PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY TransactionAmount) AS Approx90thPercentile
FROM CustomerTransactions;

This result indicates that 90% of transactions are below $375. This insight can help the company focus on high-value customers who spend above this threshold.

Example 2: Analyzing Different Percentiles πŸ”

Let’s calculate different percentiles to understand the distribution of transaction amounts.

Query to Calculate Multiple Percentiles:

SELECT 
    APPROX_PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY TransactionAmount) AS Approx25thPercentile,
    APPROX_PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY TransactionAmount) AS Approx50thPercentile,
    APPROX_PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY TransactionAmount) AS Approx75thPercentile,
    APPROX_PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY TransactionAmount) AS Approx90thPercentile
FROM CustomerTransactions;

These results provide a clear view of the transaction distribution, helping the company to tailor marketing strategies for different customer segments.

Comparing Percentile Results:

  • Compare approximate and exact percentile calculations for the 90th percentile:
SELECT 
    APPROX_PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY TransactionAmount) AS Approx90thPercentile,
    PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY TransactionAmount) OVER () AS Exact90thPercentile
FROM CustomerTransactions
group by TransactionAmount;

Segmenting Customers by Spending:

  • Identify customers whose spending is in the top 10%:
SELECT CustomerID, TransactionAmount
FROM CustomerTransactions
WHERE TransactionAmount >= (SELECT APPROX_PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY TransactionAmount)
                             FROM CustomerTransactions);

Analyzing Spending Patterns Over Time:

  • Calculate monthly spending percentiles to identify trends:
SELECT 
    DATEPART(MONTH, TransactionDate) AS Month,
    APPROX_PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY TransactionAmount) AS MedianTransaction
FROM CustomerTransactions
GROUP BY DATEPART(MONTH, TransactionDate)
ORDER BY Month;

Combining Percentiles with Other Aggregations:

  • Find the average transaction amount for each percentile group:
SELECT 
    PercentileGroup,
    AVG(TransactionAmount) AS AvgTransactionAmount
FROM (
    SELECT 
        TransactionAmount,
        NTILE(4) OVER (ORDER BY TransactionAmount) AS PercentileGroup
    FROM CustomerTransactions
) AS SubQuery
GROUP BY PercentileGroup;

Conclusion 🏁

The APPROX_PERCENTILE_CONT function in SQL Server 2022 is a powerful tool for efficiently computing approximate percentiles in large datasets. By using this function, businesses can gain valuable insights into data distributions and make informed decisions based on these insights. Whether you’re analyzing customer spending, sales trends, or any other data, the APPROX_PERCENTILE_CONT function offers a quick and efficient way to understand your data.

Happy querying! πŸ˜„

For more tutorials and tips on SQL Server, including performance tuning and database management, be sure to check out ourΒ JBSWiki YouTube channel.

Thank You,
Vivek Janakiraman

Disclaimer:
The views expressed on this blog are mine alone and do not reflect the views of my company or anyone else. All postings on this blog are provided β€œAS IS” with no warranties, and confers no rights.

SQL Server 2022 Performance Tuning Tips: Optimizing for Peak Efficiency

SQL Server 2022 introduces numerous enhancements aimed at improving performance and efficiency. Whether you’re dealing with query optimization, index management, or memory allocation, these new features and best practices can help you achieve significant performance gains. In this blog, we’ll explore specific tuning tips and tricks for SQL Server 2022, highlighting changes that enhance query performance without requiring any code changes. We’ll also address how these improvements solve longstanding issues from previous versions. Practical T-SQL examples will be provided to help you implement these tips. Let’s dive in! πŸŽ‰

Key SQL Server 2022 Enhancements for Performance Tuning βš™οΈ

  1. Intelligent Query Processing (IQP) Enhancements: SQL Server 2022 continues to enhance IQP features, including Adaptive Joins, Batch Mode on Rowstore, and more.
  2. Automatic Plan Correction: This feature helps to identify and fix suboptimal execution plans automatically.
  3. Increased Parallelism: SQL Server 2022 offers more granular control over parallelism, improving the performance of complex queries.
  4. Optimized TempDB Usage: Improvements in TempDB management reduce contention and improve query performance.

Specific Tuning Tips and Tricks πŸ”§

1. Leverage Intelligent Query Processing (IQP) 🧠

SQL Server 2022 builds on the IQP feature set, which adapts to your workload to optimize performance. Here are some specific IQP features to take advantage of:

  • Batch Mode on Rowstore: This feature allows batch mode processing on traditional rowstore tables, providing significant performance improvements for analytical workloads.

Example Query:

-- Without Batch Mode on Rowstore
SELECT SUM(SalesAmount) 
FROM Sales.SalesOrderDetail
WHERE ProductID = 707;

-- With Batch Mode on Rowstore (SQL Server 2022)
SELECT SUM(SalesAmount) 
FROM Sales.SalesOrderDetail WITH (USE HINT ('ENABLE_BATCH_MODE'))
WHERE ProductID = 707;
  • Adaptive Joins: SQL Server dynamically chooses the best join strategy (nested loop, hash join, etc.) during query execution, optimizing performance based on actual data distribution.

Example Query:

-- Without Adaptive Joins
SELECT p.ProductID, p.Name, SUM(s.Quantity) AS TotalSold
FROM Production.Product p
JOIN Sales.SalesOrderDetail s ON p.ProductID = s.ProductID
GROUP BY p.ProductID, p.Name;

-- With Adaptive Joins (SQL Server 2022)
SELECT p.ProductID, p.Name, SUM(s.Quantity) AS TotalSold
FROM Production.Product p
JOIN Sales.SalesOrderDetail s ON p.ProductID = s.ProductID
GROUP BY p.ProductID, p.Name;

2. Utilize Automatic Plan Correction πŸ› οΈ

Automatic Plan Correction helps to identify and fix inefficient execution plans. This feature automatically captures query performance baselines and identifies regressions, correcting them as needed.

Enabling Automatic Plan Correction:

ALTER DATABASE SCOPED CONFIGURATION 
SET AUTOMATIC_TUNING = AUTO_PLAN_CORRECTION = ON;

3. Optimize TempDB Usage πŸ—„οΈ

TempDB can often become a bottleneck in SQL Server. SQL Server 2022 introduces several enhancements to manage TempDB more efficiently:

  • Memory-Optimized TempDB Metadata: Reduces contention on system tables in TempDB, particularly beneficial for workloads with heavy use of temporary tables.

Enabling Memory-Optimized TempDB Metadata:

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED_TEMPDB_METADATA = ON;

4. Fine-Tune Parallelism Settings πŸƒβ€β™‚οΈ

SQL Server 2022 offers more granular control over parallelism, which can improve the performance of complex queries by better utilizing CPU resources.

Setting MAXDOP (Maximum Degree of Parallelism):

-- Setting MAXDOP for the server
EXEC sys.sp_configure 'max degree of parallelism', 8;
RECONFIGURE;

-- Setting MAXDOP for a specific query
SELECT * 
FROM LargeTable 
OPTION (MAXDOP 4);

Solving Previous Issues with SQL Server 2022 πŸ”„

1. Resolving Parameter Sniffing Issues 🎯

Parameter sniffing can lead to suboptimal plans being reused, causing performance issues. SQL Server 2022’s Parameter Sensitive Plan Optimization addresses this by creating multiple plans for different parameter values.

Example T-SQL Query:

-- Enabling Parameter Sensitive Plan Optimization
ALTER DATABASE SCOPED CONFIGURATION 
SET PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = ON;

2. Handling Query Store Performance Overhead πŸ“ˆ

The Query Store feature in SQL Server 2022 has been enhanced to minimize performance overhead while still capturing valuable query performance data.

Best Practices:

  • Limit Data Capture: Configure Query Store to capture only significant queries to reduce overhead.
  • Use Read-Only Secondary Replicas: Leverage Always On Availability Groups to offload Query Store data collection to read-only replicas.

Business Use Case: E-Commerce Platform πŸ›’

Consider an e-commerce platform experiencing slow query performance during peak shopping seasons. By implementing SQL Server 2022’s performance tuning features, the platform can:

  • Improve Checkout Process Speed: Use IQP features like Batch Mode on Rowstore to optimize complex analytical queries that calculate discounts and shipping costs.
  • Enhance Product Search Efficiency: Utilize Adaptive Joins to dynamically optimize search queries based on the data distribution of products.
  • Reduce Database Contention: Apply TempDB optimization techniques to handle the high volume of temporary data generated during transactions.

Conclusion πŸŽ‰

SQL Server 2022 offers a wealth of new features and enhancements designed to optimize performance and solve long-standing issues. By leveraging Intelligent Query Processing, Automatic Plan Correction, and other tuning tips, you can achieve significant performance gains without extensive code changes. Whether you’re running a high-traffic e-commerce platform or a complex analytical workload, these tuning tips can help you get the most out of your SQL Server 2022 environment.

For more tutorials and tips on SQL Server, including performance tuning and database management, be sure to check out our JBSWiki YouTube channel.

Thank You,
Vivek Janakiraman

Disclaimer:
The views expressed on this blog are mine alone and do not reflect the views of my company or anyone else. All postings on this blog are provided β€œAS IS” with no warranties, and confers no rights.