Index Usage
Creating a Covering Index
-- Covering index for frequently queried columns
CREATE NONCLUSTERED INDEX IX_Orders_CustomerDate
ON dbo.Orders (CustomerID, OrderDate)
INCLUDE (TotalAmount, Status);
Use this index to eliminate lookups for queries that filter by CustomerID and OrderDate while selecting TotalAmount and Status.
TempDB Optimizations
Configure Multiple TempDB Data Files
-- Create additional TempDB data files (recommended: 1 per logical CPU core)
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev2, FILENAME = 'E:\SQLData\tempdev2.ndf', SIZE = 1024MB, MAXSIZE = UNLIMITED, FILEGROWTH = 256MB);
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev3, FILENAME = 'E:\SQLData\tempdev3.ndf', SIZE = 1024MB, MAXSIZE = UNLIMITED, FILEGROWTH = 256MB);
GO
-- Ensure equal size for all files
DBCC CHECKIDENT ('tempdb..sysfiles', RESEED, 0);
Multiple data files reduce contention on allocation structures, improving overall throughput.
Query Plan Caching
Force Parameter Sniffing with OPTION (RECOMPILE)
SELECT *
FROM dbo.Sales
WHERE SaleDate BETWEEN @StartDate AND @EndDate
OPTION (RECOMPILE);
Use OPTION (RECOMPILE) for queries with highly variable predicate values to avoid suboptimal cached plans.
Resource Governor
Limit CPU for Reporting Workload
-- Create a workload group for reporting
CREATE WORKLOAD GROUP ReportingGroup
WITH (MAX_CPU_PERCENT = 20);
GO
-- Assign a classifier function
CREATE FUNCTION dbo.rg_classifier()
RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
IF ORIGINAL_LOGIN() = 'report_user'
RETURN 'ReportingGroup';
RETURN 'default';
END;
GO
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier);
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
Restricts reporting queries to 20% of CPU resources, preserving capacity for OLTP workloads.