【发布时间】:2016-02-25 22:30:36
【问题描述】:
我知道性能调优是需要针对每个环境进行的。但我已尽最大努力明确我的问题,看看我是否在可能的改进中遗漏了什么。
我在 SQL Server 2005 中有一个表 [TestExecutions]。截至今天,它有大约 20 万条记录。预计在几个月内将增长到 500 万。
CREATE TABLE [dbo].[TestExecutions]
(
[TestExecutionID] [int] IDENTITY(1,1) NOT NULL,
[OrderID] [int] NOT NULL,
[LineItemID] [int] NOT NULL,
[Manifest] [char](7) NOT NULL,
[RowCompanyCD] [char](4) NOT NULL,
[RowReferenceID] [int] NOT NULL,
[RowReferenceValue] [char](3) NOT NULL,
[ExecutedTime] [datetime] NOT NULL
)
CREATE INDEX [IX_TestExecutions_OrderID]
ON [dbo].[TestExecutions] ([OrderID])
INCLUDE ([LineItemID], [Manifest], [RowCompanyCD], [RowReferenceID])
出于相同目的,我有以下两个查询(查询 2 和查询 3)。根据执行计划,对于 #OrdersForRC 中的 100 条记录,Query2 运行得更好(39% 对 47%),而在 #OrdersForRC 中有 10000 条记录时,查询 3 运行更好(53% 对 33%)。
在使用的最初几个月,#OrdersForRC 表将有接近 100 条记录。它会在几个月内逐渐增加到 2500 条记录。
在以下两种方法中,哪一种适合这种逐渐增长的场景?或者有什么策略可以让一种方法在数据增长的情况下比另一种更有效?
注意:在Plan2中,第一个Query使用Hash Match
参考文献
- query optimizer operator choice - nested loops vs hash match (or merge)
- Execution Plan Basics — Hash Match Confusion
测试查询
CREATE TABLE #OrdersForRC
(
OrderID INT
)
INSERT INTO #OrdersForRC
--SELECT DISTINCT TOP 100 OrderID FROM [TestExecutions]
SELECT DISTINCT TOP 5000 OrderID FROM LWManifestReceiptExecutions
--QUERY 2:
SELECT H.OrderID,H.LineItemID,H.Manifest,H.RowCompanyCD,H.RowReferenceID
FROM dbo.[TestExecutions] (NOLOCK) H
INNER JOIN #OrdersForRC R
ON R.OrderID = H.OrderID
--QUERY 3:
SELECT H.OrderID,H.LineItemID,H.Manifest,H.RowCompanyCD,H.RowReferenceID
FROM dbo.[TestExecutions] (NOLOCK) H
WHERE OrderID IN (SELECT OrderID FROM #OrdersForRC)
DROP TABLE #OrdersForRC
计划 1
计划 2
【问题讨论】:
-
嘿@Lijo,你能创建 LWManifestReceiptExecutions 表的表和索引吗
-
你想从 LWManifestReceiptExecutions 中选择 DISTINCT TOP 5000 OrderID 无序还是你可以通过 orderid 接受它?