بررسی کارآیی کوئریها در SQL Server - قسمت نهم - بررسی عملگرهای Hash Join و Compute Scalar در یک Query Plan
نویسنده: وحید نصیری
تاریخ: ۱۳۹۸/۰۴/۱۶ ۱۹:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
USE [WideWorldImporters];
GO
SET STATISTICS IO ON;
GO
/*
Query with a hash join
*/
SELECT
[ol].[OrderID],
[ol].[OrderLineID],
[ol].[StockItemID],
[ol].[PickedQuantity],
[si].[StockItemName],
[si].[UnitPrice]
FROM [Warehouse].[StockItems] [si]
JOIN [Sales].[OrderLines] [ol]
ON [si].[StockItemID] = [ol].[StockItemID];
GOALTER TABLE [Warehouse].[StockItems] ADD CONSTRAINT [PK_Warehouse_StockItems] PRIMARY KEY CLUSTERED ( [StockItemID] ASC )
CREATE NONCLUSTERED COLUMNSTORE INDEX [NCCX_Sales_OrderLines] ON [Sales].[OrderLines] ( [OrderID], [StockItemID], [Description], [Quantity], [UnitPrice], [PickedQuantity] )
CREATE NONCLUSTERED INDEX [IX_OrderLines_StockItemID] ON [Sales].[OrderLines]( [StockItemID] ASC, [PickedQuantity] ASC, [OrderID]) ON [PRIMARY]; GO
SELECT
[ol].[OrderID],
[ol].[OrderLineID],
[ol].[StockItemID],
[ol].[PickedQuantity],
[si].[StockItemName],
[si].[UnitPrice]
FROM [Sales].[OrderLines] [ol]
JOIN [Warehouse].[StockItems] [si]
ON [ol].[StockItemID] = [si].[StockItemID]
OPTION
(RECOMPILE);
GOCREATE NONCLUSTERED INDEX [IX_OrderLines_StockItemID_Compressed] ON [Sales].[OrderLines]( [StockItemID] ASC, [PickedQuantity] ASC, [OrderID]) WITH (DATA_COMPRESSION = PAGE) ON [PRIMARY]; GO
SELECT
[ol].[OrderID],
[ol].[OrderLineID],
[ol].[StockItemID],
[ol].[PickedQuantity],
[si].[StockItemName],
[si].[UnitPrice]
FROM [Sales].[OrderLines] [ol]
JOIN [Warehouse].[StockItems] [si]
ON [ol].[StockItemID] = [si].[StockItemID]
OPTION
(RECOMPILE);
GO
SELECT
[ol].[OrderID],
[ol].[OrderLineID],
[ol].[StockItemID],
[ol].[PickedQuantity],
[si].[StockItemName],
[si].[UnitPrice]
FROM [Sales].[OrderLines] [ol] WITH (INDEX (IX_Sales_OrderLines_Perf_20160301_02))
JOIN [Warehouse].[StockItems] [si]
ON [ol].[StockItemID] = [si].[StockItemID];
GO
SELECT
[ol].[OrderID],
[ol].[OrderLineID],
[ol].[StockItemID],
[ol].[PickedQuantity],
[si].[StockItemName],
[si].[UnitPrice]
FROM [Sales].[OrderLines] [ol] WITH (INDEX (IX_OrderLines_StockItemID))
JOIN [Warehouse].[StockItems] [si]
ON [ol].[StockItemID] = [si].[StockItemID];
GO
SELECT
[ol].[OrderID],
[ol].[OrderLineID],
[ol].[StockItemID],
[ol].[PickedQuantity],
[si].[StockItemName],
[si].[UnitPrice]
FROM [Sales].[OrderLines] [ol] WITH (INDEX (IX_OrderLines_StockItemID_Compressed))
JOIN [Warehouse].[StockItems] [si]
ON [ol].[StockItemID] = [si].[StockItemID];
GOSELECT COUNT(*) FROM [Sales].[Orders]; SELECT COUNT_BIG (*) FROM [Sales].[Orders];
CREATE FUNCTION dbo.CountProductsSold (
@SalesPersonID INT
) RETURNS INT
AS
BEGIN
DECLARE @SoldCount INT;
SELECT @SoldCount = COUNT(DISTINCT [ol].[StockItemID])
FROM [Sales].[Orders] [o]
JOIN [Sales].[OrderLines] [ol]
ON [o].[OrderID] = [ol].[OrderID]
WHERE [o].[SalespersonPersonID] = @SalesPersonID
RETURN (@SoldCount);
ENDSELECT
[FullName] AS [SalesPerson],
[dbo].[CountProductsSold]([PersonID]) AS [NumberOfProductsSold]
FROM [Application].[People]
WHERE [IsSalesperson] = 1;SELECT
[fs].[last_execution_time],
[fs].[execution_count],
[fs].[total_logical_reads]/[fs].[execution_count] [AvgLogicalReads],
[fs].[max_logical_reads],
[t].[text],
[p].[query_plan]
FROM sys.dm_exec_function_stats [fs]
CROSS APPLY sys.dm_exec_sql_text([fs].sql_handle) [t]
CROSS APPLY sys.dm_exec_query_plan([fs].[plan_handle]) [p];