Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Cờ theo dõi 2389 và Công cụ ước tính số lượng thẻ mới

Một trong những cờ theo dõi SQL Server đã tồn tại được một thời gian là 2389. Nó thường được thảo luận với 2390, nhưng tôi chỉ muốn tập trung vào 2389 cho bài đăng này. Cờ theo dõi đã được giới thiệu trong SQL Server 2005 SP1, được phát hành vào ngày 18 tháng 4 năm 2006 (theo http://sqlserverbuilds.blogspot.co.uk/), vì vậy nó đã tồn tại hơn 10 năm. Cờ theo dõi thay đổi hành vi của công cụ và 2389 cho phép trình tối ưu hóa xác định số liệu thống kê tăng dần và đánh dấu chúng như vậy (thường được gọi là "vấn đề chính tăng dần"). Khi điều này xảy ra, thống kê sẽ được cập nhật tự động vào thời gian biên dịch truy vấn, có nghĩa là trình tối ưu hóa có thông tin về giá trị cao nhất trong bảng (so với khi cờ theo dõi không được sử dụng).

Gần đây tôi đã có một cuộc thảo luận với một khách hàng về việc sử dụng cờ theo dõi này và nó xuất hiện do loại tình huống này:

  • Bạn có một bảng lớn có INT làm khóa chính và nó được nhóm lại.
  • Bạn có một chỉ mục riêng dẫn đến cột DATETIME.
  • Bảng có khoảng 20 triệu hàng trong đó và bất kỳ vị trí nào từ 5.000 đến 100.000 hàng được thêm vào mỗi ngày.
  • Số liệu thống kê được cập nhật hàng đêm như một phần trong nhiệm vụ bảo trì của bạn.
  • Số liệu thống kê tự động cập nhật được bật cho cơ sở dữ liệu, nhưng ngay cả khi 100.000 hàng được thêm vào bảng, thì con số đó ít hơn 4 triệu hàng (20%) cần thiết để gọi cập nhật tự động.
  • Khi người dùng truy vấn bảng bằng cách sử dụng ngày trong vị ngữ, hiệu suất truy vấn có thể rất tốt hoặc có thể tệ.

Dấu đầu dòng cuối cùng đó gần như khiến nó giống như một vấn đề về độ nhạy thông số, nhưng không phải vậy. Trong trường hợp này, đó là một vấn đề thống kê. Đề xuất của tôi cho khách hàng là sử dụng TF 2389 hoặc cập nhật số liệu thống kê thường xuyên hơn trong ngày (ví dụ:thông qua Công việc đại lý). Sau đó, tôi nghĩ rằng tôi sẽ thực hiện một số thử nghiệm, vì máy khách đang chạy SQL Server 2014. Đây là lúc mọi thứ trở nên thú vị.

Thiết lập

Chúng tôi sẽ tạo bảng nói trên để thử nghiệm trong phiên bản RTM của SQL Server 2016, trong cơ sở dữ liệu WideWorldImporters và ban đầu tôi sẽ đặt chế độ tương thích thành 110:

 USE [master]; GORESTORE DATABASE [WideWorldImporters] FROM DISK =N'C:\ Backups \ WideWorldImporters-Full.bak'WITH FILE =1, CHUYỂN N'WWI_Primary 'TO N'C:\ Databases \ WideWorldImportersorters WideWorldImporters .mdf ', MOVE N'WWI_UserData' TO N'C:\ Databases \ WideWorldImporters \ WideWorldImporters_UserData.ndf ', MOVE N'WWI_Log' TO N'C:\ Databases \ WideWorldImporters \ WideWorldImporters.ldf ' N'C:\ Databases \ WideWorldImporters \ WideWorldImporters_InMemory_Data_1 ', NOUNLOAD, REPLACE, STATS =5; GO ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL =110; GO SỬ DỤNG [WideWorldImporters] CREATE [Bigrders]; ] [int] NOT NULL, [CustomerID] [int] NOT NULL, [SaleswomanPersonID] [int] NOT NULL, [PickedByPersonID] [int] NULL, [ContactPersonID] [int] NOT NULL, [BackorderOrderID] [int] NULL, [Ngày đặt hàng] [date] KHÔNG NULL, [Ngày mong đợi] [ngày] KHÔNG ĐỦ, [CustomerPurchaseOrderNumber] [nvarchar] (20) NULL, [IsUndersupplyBackordered] [bit] KHÔNG ĐỦ, [Nhận xét] [nvarchar ] (tối đa) NULL, [DeliveryInstructions] [nvarchar] (tối đa) NULL, [InternalComments] [nvarchar] (tối đa) NULL, [PickingCompletedWhen] [datetime2] (7) NULL, [LastEditedBy] [int] NOT NULL, [LastEditedWhen ] [datetime2] (7) NOT NULL, CONSTRAINT [PK_Sales_BigOrders] KHÓA CHÍNH ĐƯỢC ĐÓNG CỬA ([OrderID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE]) TRÊN [USERDATA] TEXTIMAGE_ON [USERDATA]; 

Tiếp theo, chúng tôi sẽ tải khoảng 24 triệu hàng vào BigOrders và tạo chỉ mục không phân biệt trên OrderDate.

 ĐẶT SỐ TÀI KHOẢN BẬT; DECLARE @Loops SMALLINT =0, @IDIncrement INT =75000; WHILE @Loops <325 - điều chỉnh cài đặt này để tăng hoặc giảm số lượng hàng được thêmBEGININSERT [Bán hàng]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [Ngày đặt hàng], [Ngày dự kiến], [Ngày giao hàng], [Mã số khách hàng], [Số người nộp đơn hàng], [Nhận xét], [Giao hàng], [Nội bộ], [Chọn hàng. ], [Nhân viên bán hàng], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [Ngày đặt hàng], [Ngày dự kiến], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments] [LastEditedBy], [LastEditedWhen] FROM [Bán hàng]. [Đơn hàng]; KIỂM TRA; SET @Loops =@Loops + 1; SET @IDIncrement =@IDIncrement + 75000; KẾT THÚC TẠO CHỈ SỐ KHÔNG CHỈNH SỬA [NCI_BigOrders_OrderDate] BẬT [Bán hàng]. [BigOrders] ([OrderDate], CustomerID); 

Nếu chúng tôi kiểm tra biểu đồ cho chỉ mục không phân biệt, chúng tôi thấy ngày cao nhất là 2016-05-31:

 DBCC SHOW_STATISTICS ('Sales.BigOrders', [NCI_BigOrders_OrderDate]); 


Thống kê cho NCI trên OrderDate

Nếu chúng tôi truy vấn bất kỳ ngày nào ngoài ngày đó, hãy lưu ý số hàng ước tính:

 CHỌN ID khách hàng, ID đơn đặt hàng, Nhân viên bán hàngPersonIDFROM [Bán hàng]. [BigOrders] WHERE [OrderDate] ='2016-06-01'; 


Lập kế hoạch khi truy vấn một ngày ngoài biểu đồ

Đó là 1, vì giá trị nằm ngoài biểu đồ. Và trong trường hợp này, không sao cả, vì không có hàng nào trong bảng sau ngày 31 tháng 5 năm 2016. Nhưng hãy thêm một số rồi chạy lại cùng một truy vấn:

 CHÈN [Bán hàng]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [OrderDate], [isedDeliveryDate], [CustomerPurchaseOrderNumber], [IsUorderedupply ], [Comments], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen]) CHỌN [OrderID] + 25000000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [ BackorderOrderID], '2016-06-01', [Dự kiến ​​ngày giao hàng], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEdited ]When . [Đơn đặt hàng]; ĐI CHỌN ID khách hàng, ID đơn hàng, Người bán hàngPersonIDFROM [Doanh số bán hàng]. [Người đặt hàng lớn] WHERE [Ngày đặt hàng] ='2016-06-01'; 


Lập kế hoạch sau khi thêm các hàng trước ngày 31 tháng 5

Số hàng ước tính vẫn là 1. Nhưng đây là lúc mọi thứ trở nên thú vị. Hãy thay đổi chế độ tương thích thành 130 để chúng tôi sử dụng Công cụ ước tính số lượng mới và xem điều gì sẽ xảy ra.

 USE [master]; ĐI ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL =130GO USE [WideWorldImporters]; ĐI CHỌN CustomerID, OrderID, Sales Nhân viênPersonIDFROM [Bán hàng]. [BigOrders] WHERE [OrderDate] ='2016-06-01'; 


Lập kế hoạch sau khi thêm hàng cho ngày 1 tháng 6, sử dụng CE mới

Hình dạng kế hoạch của chúng tôi giống nhau, nhưng bây giờ ước tính của chúng tôi là 4.898 hàng. CE mới xử lý các giá trị bên ngoài lịch sử khác với CE cũ. Vậy… chúng ta có cần cờ theo dõi 2389 không?

Bài kiểm tra - Phần I

Đối với thử nghiệm đầu tiên, chúng tôi sẽ ở trong chế độ tương thích 110 và chạy qua những gì chúng tôi sẽ thấy với 2389. Khi sử dụng cờ theo dõi này, bạn có thể bật nó làm tham số khởi động trong dịch vụ SQL Server hoặc bạn có thể sử dụng DBCC TRACEON để kích hoạt nó trên toàn phiên bản. Hiểu rằng trong môi trường sản xuất của bạn, nếu bạn sử dụng DBCC TRACEON để bật cờ theo dõi, thì khi phiên bản khởi động lại cờ theo dõi sẽ không có hiệu lực.

Với cờ theo dõi được bật, thống kê phải được cập nhật ba (3) lần trước khi trình tối ưu hóa đánh dấu nó là tăng dần. Chúng tôi sẽ buộc cập nhật bốn lần để có biện pháp tốt và thêm nhiều hàng hơn vào giữa mỗi lần cập nhật.

 USE [master]; GO ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL =110; GO DBCC TRACEON (2389, -1); ĐI SỬ DỤNG [WideWorldImporters]; ĐI CẬP NHẬT THỐNG KÊ [Doanh số]. [BigOrders] [NCI_BigOrders_OrderDate] CHÈN [Bán hàng]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [OrderDate], [isedDeliveryDate], [CustomerPurchaseOrderNumber], [IsUnderseredupplyBack Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen]) CHỌN [OrderID] + 25100000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], '2016-06-02', [Ngày dự kiến], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen] FROM [Sales]. ]; ĐI CẬP NHẬT THỐNG KÊ [Doanh số]. [BigOrders] [NCI_BigOrders_OrderDate]; GO INSERT [Sales]. [BigOrders] ([OrderID], [CustomerID ], [Nhân viên bán hàng], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [Ngày đặt hàng], [Ngày dự kiến], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments] [LastEditedBy] [LastEditedWhen]) CHỌN [OrderID] + 25200000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], '2016-06-03', [DoesDeliveryDate], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Comments], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen] FROM [Sales]. [Order]; ĐI CẬP NHẬT THỐNG KÊ [Sales]. [BigOrders] [NCI_BigOrders ]_Order; ĐI CHÈN [Bán hàng]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [OrderDate], [ReduceDeliveryDate], [CustomerPurchaseOrderNumber], [IsUorderedupply [Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy] , [LastEditedWhen]) CHỌN [OrderID] + 25300000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], '2016-06-04', [isedDeliveryDate], [CustomerPurchaseOrderNumber], [IsUorderedupply ], [Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen] FROM [Bán hàng]. [Đơn hàng]; CẬP NHẬT THỐNG KÊ [Bán hàng]. [BigOrders] [NCI_BigOrders_OrderDate];  

Nếu chúng tôi kiểm tra lại thống kê và sử dụng cờ theo dõi 2388 để hiển thị thông tin bổ sung, chúng tôi thấy rằng thống kê hiện được đánh dấu là Tăng dần:

 DBCC TRACEON (2388); GO DBCC SHOW_STATISTICS ('Sales.BigOrders', [NCI_BigOrders_OrderDate]); 


NCI trên OrderDate được đánh dấu là ASC

Nếu chúng tôi truy vấn cho một ngày trong tương lai, khi thống kê được cập nhật đầy đủ, chúng tôi thấy rằng nó vẫn ước tính 1 hàng:

 CHỌN ID khách hàng, ID đơn đặt hàng, Nhân viên bán hàngPersonIDFROM [Bán hàng]. [BigOrders] WHERE [OrderDate] ='2016-06-05'; 


Kế hoạch sau khi TF 2389 được bật, nhưng không có hàng nào ngoài biểu đồ

Bây giờ, chúng tôi sẽ thêm các hàng cho ngày 5 tháng 6 và chạy lại cùng một truy vấn:

 CHÈN [Bán hàng]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [OrderDate], [isedDeliveryDate], [CustomerPurchaseOrderNumber], [IsUorderedupply ], [Comments], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen]) CHỌN [OrderID] + 25400000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [ BackorderOrderID], '2016-06-05', [InternalComments], [PickingCompletedWhen], [IsUndersupplyBackordered], [Comments], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEdited ]When . [Đơn đặt hàng]; ĐI CHỌN ID khách hàng, ID đơn đặt hàng, Người bán hàngPersonIDFROM [Doanh số bán hàng]. [Người đặt hàng lớn] WHERE [Ngày đặt hàng] ='2016-06-05'; 


Kế hoạch sau khi bật TF 2389, hơn 70 nghìn hàng được thêm ngoài biểu đồ

Ước tính của chúng tôi không còn là 1, mà là 22.595. Bây giờ, vui thôi, hãy tắt cờ theo dõi và xem ước tính là gì (Tôi sẽ xóa bộ nhớ cache của quy trình, vì việc tắt cờ theo dõi sẽ không ảnh hưởng đến những gì hiện có trong bộ nhớ cache).

 DBCC TRACEOFF (2389, -1); ĐI DBCC FREEPROCCACHE; ĐI CHỌN ID khách hàng, ID đơn hàng, Người bán hàngPersonIDFROM [Bán hàng]. [BigOrders] WHERE [OrderDate] ='2016-06-05'; 


Kế hoạch sau khi TF 2389 * bị vô hiệu hóa *, hơn 70 nghìn hàng được thêm vào biểu đồ

Lần này, tôi lại nhận được ước tính là 1 hàng. Mặc dù thống kê được gắn nhãn là tăng dần, nếu cờ theo dõi 2389 không được bật, nó chỉ ước tính 1 hàng khi bạn truy vấn giá trị bên ngoài biểu đồ.

Chúng tôi đã chứng minh rằng cờ theo dõi 2389 thực hiện những gì chúng tôi mong đợi - những gì nó luôn làm - khi sử dụng Công cụ ước tính Cardinality cũ. Bây giờ, hãy xem điều gì sẽ xảy ra với cái mới.

Kiểm tra - Phần II

Để kỹ lưỡng, tôi sẽ đặt lại mọi thứ. Tôi sẽ tạo lại cơ sở dữ liệu, đặt chế độ tương thích thành 130, tải dữ liệu ban đầu, sau đó bật cờ theo dõi 2389 và tải ba bộ dữ liệu có cập nhật thống kê ở giữa.

 SỬ DỤNG [master]; KHÔI PHỤC CƠ SỞ DỮ LIỆU [WideWorldImporters] TỪ DISK =N'C:\ Backups \ WideWorldImporters-Full.bak'WITH FILE =1, CHUYỂN N'WWI_Primary 'ĐẾN N'C:\ Databases \ WideWorldImporters \ WideWorldImporters.mdf ', MOVE N'WWI_UserData' TO N'C:\ Databases \ WideWorldImporters \ WideWorldImporters_UserData.ndf ', MOVE N'WWI_Log' TO N'C:\ Databases N'W WideWorldImporters \ WideWorldf ĐẾN N'C:\ Databases \ WideWorldImporters \ WideWorldImporters_InMemory_Data_1 ', NOUNLOAD, REPLACE, STATS =5; ĐI SỬ DỤNG [master]; ĐI ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL =130; GOI CREATE TẠO [WideWorld] . [BigOrders] ([OrderID] [int] NOT NULL, [CustomerID] [int] NOT NULL, [SaleswomanPersonID] [int] NOT NULL, [PickedByPersonID] [int] NULL, [ContactPersonID] [int] NOT NULL, [ BackorderOrderID] [int] NULL, [OrderDate] [date] NOT NULL, [DraftDeliveryDate] [date] NOT NULL, [CustomerPurchaseOrderNumber] [nvarchar] (20) NULL, [IsUndersupplyBackordered] [bit] NOT NULL, [Co mments] [nvarchar] (max) NULL, [DeliveryInstructions] [nvarchar] (max) NULL, [InternalComments] [nvarchar] (max) NULL, [PickingCompletedWhen] [datetime2] (7) NULL, [LastEditedBy] [int] NOT NULL, [LastEditedWhen] [datetime2] (7) NOT NULL, CONSTRAINT [PK_Sales_BigOrders] PRIMARY KEY CLUSTERED ([OrderID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLKS =ON_LOCKS_LOCOW [USERDATA]) TRÊN [USERDATA] TEXTIMAGE_ON [USERDATA]; ĐI ĐẶT SỐ TÀI KHOẢN BẬT; DECLARE @Loops SMALLINT =0; DECLARE @IDIncrement INT =75000; WHILE @Loops <325 - điều chỉnh cài đặt này để tăng hoặc giảm số lượng hàng được thêmBEGININSERT [Bán hàng]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [Ngày đặt hàng], [Ngày dự kiến], [Ngày giao hàng], [Mã số khách hàng], [Số người nộp đơn hàng], [Nhận xét], [Giao hàng], [Nội bộ], [Chọn hàng. ], [Nhân viên bán hàng], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [Ngày đặt hàng], [Ngày dự kiến], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments], [DeliveryInstructions], [InternalComments] [LastEditedBy], [LastEditedWhen] FROM [Bán hàng]. [Đơn hàng]; KIỂM TRA; SET @Loops =@Loops + 1; SET @IDIncrement =@IDIncrement + 75000; KẾT THÚC TẠO CHỈ SỐ KHÔNG CHỈNH SỬA [NCI_BigOrders_OrderDate] BẬT [Bán hàng]. [BigOrders] ([OrderDate], CustomerID); ĐI CHÈN [Doanh số]. [BigOrders] ([OrderID], [CustomerID], [Sales NHÂNPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [Ngày đặt hàng], [Ngày mong đợi], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstrordered] InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen]) CHỌN [OrderID] + 25000000, [CustomerID], [Sales NHÂNPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], '2016-06-01', [Ngày mong đợi], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen] FROM [Sales]. [Đơn hàng]; GO DBCC TRACEON (2389, TRACEON) -1); ĐI CẬP NHẬT THỐNG KÊ [Doanh số]. [BigOrders] [NCI_BigOrders_OrderDate]; GO INSERT [Sales]. [BigOrders] ([OrderID], [CustomerID], [Nhân viên bán hàng PersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [Ngày đặt hàng], [Ngày dự kiến], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompleted] , [LastEditedWhen]) CHỌN [OrderID] + 25100000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], '2016-06-02', [isedDeliveryDate], [CustomerPurchaseOrderNumber], [IsUorderedupply ], [Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen] FROM [Bán hàng]. [Đơn hàng]; CẬP NHẬT THỐNG KÊ [Bán hàng]. [BigOrders] [NCI_BigOrders_OrderDate]; ĐI INSERT [Bán hàng]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [OrderDate], [mong đợiDeliveryDate], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered] ], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedW hen]) CHỌN [OrderID] + 25200000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], '2016-06-03', [mong đợiDeliveryDate], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen] FROM [Sales]. [Đơn hàng]; CẬP NHẬT THỐNG KÊ [Doanh số]. [BigOrders] [NCI_BigOrders_OrderDate]; ĐI CHÈN [Doanh số ]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [OrderDate], [mong đợiDeliveryDate], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen]) CHỌN [OrderID] + 25300000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], '2016- 06-04 ', [Ngày mong đợi], [CustomerPurchaseOrderNumber], [IsUndersupplyBackordered], [Nhận xét], [DeliveryInstructions], [InternalCo mments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen] FROM [Doanh số]. [Đơn hàng]; CẬP NHẬT THỐNG KÊ [Doanh số]. [BigOrders] [NCI_BigOrders_OrderDate]; 

Ok, vậy là dữ liệu của chúng ta đã được tải xong. Nếu chúng tôi kiểm tra lại thống kê và sử dụng cờ theo dõi 2388 để hiển thị thông tin bổ sung, chúng tôi thấy rằng thống kê lại được đánh dấu là Tăng dần:

 DBCC TRACEON (2388); GO DBCC SHOW_STATISTICS ('Sales.BigOrders', [NCI_BigOrders_OrderDate]); 


Thống kê NCI OrderDate được đánh dấu là ASC với TF 2389 và chế độ tương thích 130

Được rồi, hãy truy vấn lại vào ngày 5 tháng 6:

 CHỌN ID khách hàng, ID đơn đặt hàng, Nhân viên bán hàngPersonIDFROM [Bán hàng]. [BigOrders] WHERE [OrderDate] ='2016-06-05'; 


Lập kế hoạch với CE mới, không có hàng nào vượt quá giá trị trong biểu đồ

Ước tính của chúng tôi là 4.922. Không hoàn toàn như những gì trong thử nghiệm đầu tiên của chúng tôi, nhưng chắc chắn không phải 1. Bây giờ chúng tôi sẽ thêm một số hàng cho ngày 5 tháng 6 và truy vấn lại:

 CHÈN [Bán hàng]. [BigOrders] ([OrderID], [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [BackorderOrderID], [OrderDate], [isedDeliveryDate], [CustomerPurchaseOrderNumber], [IsUorderedupply ], [Comments], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEditedWhen]) CHỌN [OrderID] + 25400000, [CustomerID], [SaleswomanPersonID], [PickedByPersonID], [ContactPersonID], [ BackorderOrderID], '2016-06-05', [InternalComments], [PickingCompletedWhen], [IsUndersupplyBackordered], [Comments], [DeliveryInstructions], [InternalComments], [PickingCompletedWhen], [LastEditedBy], [LastEdited ]When . [Đơn đặt hàng]; ĐI CHỌN ID khách hàng, ID đơn đặt hàng, Người bán hàngPersonIDFROM [Doanh số bán hàng]. [Người đặt hàng lớn] WHERE [Ngày đặt hàng] ='2016-06-05'; 


Lập kế hoạch với CE mới, với hơn 70 nghìn hàng ngoài biểu đồ

Ước tính cũng vậy. Vậy bây giờ, điều gì sẽ xảy ra nếu chúng ta tắt cờ theo dõi 2389?

 DBCC TRACEOFF (2389, -1); ĐI DBCC FREEPROCCACHE; ĐI CHỌN ID khách hàng, ID đơn hàng, Người bán hàngPersonIDFROM [Bán hàng]. [BigOrders] WHERE [OrderDate] ='2016-06-05'; 


Gói với CE mới nhưng TF 2389 KHÔNG được bật, với 70K + hàng ngoài những gì trong biểu đồ

Ước tính đã thay đổi một chút, thành 4.930, nhưng nó đã thay đổi. Điều này cho tôi biết rằng cờ theo dõi 2389 có một số ảnh hưởng đến ước tính, nhưng không rõ là bao nhiêu.

Bài kiểm tra - Phần III

Tôi đã chạy một bài kiểm tra cuối cùng, trong đó tôi khôi phục cơ sở dữ liệu, đặt chế độ tương thích thành 130, tải lại tất cả dữ liệu, cập nhật số liệu thống kê nhiều lần, nhưng KHÔNG bật cờ theo dõi 2389. Mã giống như Phần II, ngoại trừ việc sử dụng DBCC TRACEON để bật 2389. Khi tôi truy vấn vào ngày 5 tháng 6, cả trước và sau khi thêm dữ liệu, số hàng ước tính là 4.920.

Nó có nghĩa là gì?

Tóm lại, khi sử dụng chế độ tương thích 110 trở xuống, cờ theo dõi 2389 hoạt động như mọi khi. Nhưng khi sử dụng chế độ tương thích 120 trở lên và do đó là CE mới, các ước tính không giống nhau so với CE cũ và trong trường hợp cụ thể này, không khác biệt lắm dù có sử dụng cờ theo dõi hay không.

Vậy bạn nên làm gì? Kiểm tra, như mọi khi. Tôi không tìm thấy bất kỳ tài liệu nào trong MSDN nói rằng cờ theo dõi 2389 không được hỗ trợ với chế độ tương thích 120 trở lên, cũng như không tìm thấy bất kỳ tài liệu nào ghi lại sự thay đổi trong hành vi. Tôi thấy rất thú vị rằng các ước tính khác nhau (trong trường hợp này là thấp hơn nhiều) với CE mới. Điều đó có thể là một vấn đề, nhưng có nhiều yếu tố tác động khi nói đến ước tính và đây là một truy vấn rất đơn giản (một bảng, một vị từ). Trong trường hợp này, ước tính còn sai lệch (4920 hàng so với 22.595 hàng cho ngày 5 tháng 6).

Nếu tôi chạy lại truy vấn cho một ngày có cùng số hàng trong biểu đồ, tôi nhận được một kế hoạch tương tự, nhưng nó chạy song song:

 CHỌN ID khách hàng, ID đơn hàng, Nhân viên bán hàngPersonIDFROM [Bán hàng]. [BigOrders] WHERE [OrderDate] ='2016-06-02'; 


Lập kế hoạch cho truy vấn sử dụng ngày trong biểu đồ (mới CE, không có TF)

Ước tính cũng chính xác hơn (68,318). Kế hoạch không thay đổi đáng kể trong trường hợp này, nhưng chi phí rõ ràng là cao hơn. Tại một số thời điểm, tùy thuộc vào số lượng hàng sẽ được trả về, điều này có thể dẫn đến việc quét bảng.

Hướng dẫn tốt nhất tại thời điểm này nếu bạn đang chạy 2014 trở lên và chế độ tương thích 120 trở lên và bạn có các cột hàng đầu trong thống kê tăng dần, là hãy kiểm tra. Nếu bạn thấy rằng Công cụ ước tính số lượng mới không cung cấp ước tính tốt như CE cũ, thì tôi khuyên bạn nên nộp một mục Connect để nhóm sản phẩm biết về nó. Luôn có những trường hợp xảy ra một lần và duy nhất, nhưng nếu nhiều khách hàng (đọc:BẠN) thường xuyên nhận thấy cùng một hành vi - và đó là hành vi không lý tưởng - thì điều quan trọng là phải cho nhóm phát triển biết về hành vi đó.

Đây là một mục quan trọng khác cần xem xét khi nâng cấp lên 2014 hoặc 2016 - và lời nhắc không bỏ qua quá trình thử nghiệm của bạn (và nhân tiện, Query Store sẽ cực kỳ hữu ích ở đây với năm 2016). Tiếp cận bạn bè.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trình điều khiển Quickbooks ODBC

  2. Mẹo quản lý sao lưu cho TimescaleDB

  3. Ngôn ngữ Định nghĩa Dữ liệu SQL

  4. Cách tạo dữ liệu thử nghiệm DB

  5. Cờ theo dõi mới để sửa hiệu suất biến bảng