Vấn đề ước tính cardinality về tham gia bên trong


13

Tôi đang đấu tranh để hiểu tại sao ước tính hàng quá sai lầm, đây là trường hợp của tôi:

Tham gia đơn giản - sử dụng SQL Server 2016 sp2 (cùng một vấn đề trên sp1), dbcompatiblity = 130.

select Amount_TransactionCurrency_id, CurrencyShareds.id 
from CurrencyShareds 
    INNER JOIN annexes ON Amount_TransactionCurrency_id = CurrencyShareds.Id 
option (QUERYTRACEON 3604, QUERYTRACEON 2363);

SQL ước tính 1 hàng, trong khi đó là 107131 và chọn thực hiện một vòng lặp lồng nhau ( liên kết đến kế hoạch ). Sau khi số liệu thống kê được cập nhật trên MoneyShareds, việc ước tính sẽ ổn và tham gia hợp nhất được chọn ( liên kết với gói mới ). Ngay khi chỉ một bản ghi được thêm vào MoneyShareds, thì số liệu thống kê sẽ trở nên "cũ" và sql quay lại ước tính sai.

Tôi sẽ không lo lắng nhiều về truy vấn đơn giản này, nhưng đây chỉ là một phần của một truy vấn lớn hơn và đây là sự khởi đầu của một domino ...

Tại sao thêm một hàng vào bảng 100 hồ sơ gây ra thiệt hại như vậy? Khi xem xét kết quả của dấu vết ước tính cardinality, tôi thấy cảnh báo này ***WARNING: badly-formed histogram ***nhưng tôi không thể tìm thấy gì thêm về chủ đề này.

Đây là đầu ra đầy đủ đầu ra từ ước tính cardinality:

Begin selectivity computation
Input tree:

LogOp_Join

CStCollBaseTable(ID=1, CARD=107131 TBL: annexes)

CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds)

ScaOp_Comp x_cmpEq

ScaOp_Identifier QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id

ScaOp_Identifier QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id

Plan for computation:

CSelCalcExpressionComparedToExpression( QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id x_cmpEq QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id )

Loaded histogram for column QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id from stats with id 7

Loaded histogram for column QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id from stats with id 1 *** WARNING: badly-formed histogram ***

Selectivity: 4.59503e-018

Stats collection generated:

CStCollJoin(ID=3, CARD=1 x_jtInner)

CStCollBaseTable(ID=1, CARD=107131 TBL: annexes)

CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds)

End selectivity computation

Estimating distinct count in utility function

Input stats collection:

CStCollBaseTable(ID=1, CARD=107131 TBL: annexes)

Columns to distinct on:QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id

Plan for computation:

CDVCPlanLeaf

0 Multi-Column Stats, 1 Single-Column Stats, 0 Guesses

Covering multi-col stats id: 7

Using ambient cardinality 107131 to combine distinct counts:

5

Combined distinct count: 5

Result of computation: 5

Estimating distinct count in utility function

Input stats collection:

CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds)

Columns to distinct on:QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id

Plan for computation:

CDVCPlanUniqueKey

Result of computation: 100

Và khi tôi cập nhật số liệu thống kê về MoneyShareds, phần thay đổi "biểu đồ được định dạng xấu" và tính chính xác được tính toán chính xác

Plan for computation:

CSelCalcExpressionComparedToExpression( QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id x_cmpEq QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id )

Loaded histogram for column QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id from stats with id 7

Loaded histogram for column QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id from stats with id 1

Selectivity: 0.01

Stats collection generated:

CStCollJoin(ID=3, CARD=107131 x_jtInner)

CStCollBaseTable(ID=1, CARD=107131 TBL: annexes)

CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds)

End selectivity computation

Và thông tin thống kê cho "[MoneyShareds]. Tôi từ số liệu thống kê với id 1" với cảnh báo về biểu đồ, có vẻ tốt đối với tôi ...

Name                                                                                                                             Updated              Rows                 Rows Sampled         Steps  Density       Average key length String Index Filter Expression                                                                                                                                                                                                                                                Unfiltered Rows      Persisted Sample Percent
-------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- ------ ------------- ------------------ ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- ------------------------
PK_CurrencyShareds_Id                                                                                                            May 23 2018 10:43PM  98                   98                   75     1             8                  NO           NULL                                                                                                                                                                                                                                                             98                   0

(1 row affected)

All density   Average Length Columns
------------- -------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0,01020408    8              Id

(1 row affected)

RANGE_HI_KEY         RANGE_ROWS    EQ_ROWS       DISTINCT_RANGE_ROWS  AVG_RANGE_ROWS
-------------------- ------------- ------------- -------------------- --------------
119762190797406464   0             1             0                    1
119762190797406466   1             1             1                    1
119762190797406468   1             1             1                    1
119762190797406470   1             1             1                    1
119762190797406472   1             1             1                    1
119762190797406474   1             1             1                    1
119762190797406476   1             1             1                    1
119762190797406478   1             1             1                    1
119762190797406480   1             1             1                    1
119762190797406482   1             1             1                    1
119762190797406484   1             1             1                    1
119762190797406486   1             1             1                    1
119762190797406488   1             1             1                    1
119762190797406490   1             1             1                    1
119762190797406492   1             1             1                    1
119762190797406494   1             1             1                    1
119762190797406496   1             1             1                    1
119762190797406498   1             1             1                    1
119762190797406500   1             1             1                    1
119762190797406502   1             1             1                    1
119762190797406504   1             1             1                    1
119762190797406506   1             1             1                    1
119762190797406507   0             1             0                    1
478531702587687680   0             1             0                    1
478531702591881728   0             1             0                    1
478531702591881729   0             1             0                    1
478531702591881984   0             1             0                    1
478531702591881985   0             1             0                    1
478531702596076032   0             1             0                    1
478531702596076033   0             1             0                    1
478531702596076288   0             1             0                    1
478531702600270336   0             1             0                    1
478531702600270592   0             1             0                    1
478532235583062528   0             1             0                    1
478532235583062784   0             1             0                    1
478532235587256832   0             1             0                    1
530792464911467264   0             1             0                    1
530792464924049920   0             1             0                    1
530792464924050176   0             1             0                    1
530792464928244224   0             1             0                    1
530792464928244480   0             1             0                    1
530792464932438528   0             1             0                    1
530792464932438784   0             1             0                    1
530792464936632832   0             1             0                    1
530792464936632833   0             1             0                    1
530792464936633088   0             1             0                    1
530792464940827136   0             1             0                    1
530792464940827392   0             1             0                    1
530792464949216000   2             1             2                    1
530792464953410048   0             1             0                    1
530792464953410304   0             1             0                    1
530792464957604352   0             1             0                    1
530792464957604353   0             1             0                    1
530792464957604608   0             1             0                    1
530792464961798656   0             1             0                    1
530792464961798912   0             1             0                    1
530792464965992960   0             1             0                    1
530792464965993216   0             1             0                    1
530792464965993217   0             1             0                    1
530792464970187264   0             1             0                    1
530792464970187265   0             1             0                    1
530792464970187520   0             1             0                    1
530792464974381568   0             1             0                    1
530792464974381824   0             1             0                    1
530792464974381825   0             1             0                    1
530792464978575872   0             1             0                    1
530792464978575873   0             1             0                    1
530792464978576128   0             1             0                    1
867420708903354880   0             1             0                    1
867420708903355136   0             1             0                    1
867420708903355137   0             1             0                    1
960876568220042240   0             1             0                    1
976385263448130048   0             1             0                    1
977302121709864192   0             1             0                    1
977955748426318592   0             1             0                    1

và thông tin cho chỉ số thứ hai:

Name                                                                                                                             Updated              Rows                 Rows Sampled         Steps  Density       Average key length String Index Filter Expression                                                                                                                                                                                                                                                Unfiltered Rows      Persisted Sample Percent
-------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- ------ ------------- ------------------ ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- ------------------------
IX_FK_Amount_TransactionCurrency                                                                                                 May 21 2018  3:29PM  107204               107204               5      0             16                 NO           NULL                                                                                                                                                                                                                                                             107204               0

(1 row affected)

All density   Average Length Columns
------------- -------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0,2           8              Amount_TransactionCurrency_id
9,32801E-06   16             Amount_TransactionCurrency_id, Id

(2 rows affected)

RANGE_HI_KEY         RANGE_ROWS    EQ_ROWS       DISTINCT_RANGE_ROWS  AVG_RANGE_ROWS
-------------------- ------------- ------------- -------------------- --------------
119762190797406475   0             160           0                    1
119762190797406478   0             867           0                    1
119762190797406481   0             106           0                    1
119762190797406494   0             105742        0                    1
119762190797406496   0             329           0                    1

Câu trả lời:


10

Dựa trên biểu đồ của bạn tôi đã có thể repro vấn đề này vào năm 2017 CU6. Tôi sẽ không nói rằng bạn đang làm gì đó sai. Thay vào đó, một cái gì đó đang đi sai với ước tính cardinality. Đây là những gì tôi nhận được trước khi chèn một hàng:

nhập mô tả hình ảnh ở đây

Ước tính cardinality cuối cùng giảm khá nhiều sau khi chèn một hàng:

nhập mô tả hình ảnh ở đây

Bạn có một repro khá đơn giản ở đây vì vậy lời khuyên của tôi là gửi phản hồi sản phẩm hoặc mở một vé hỗ trợ với Microsoft. Tôi đã có thể tìm thấy một số cách giải quyết khác với dữ liệu mẫu của bạn và một trong những cách có thể được chấp nhận cho bạn.

  1. Thả chỉ số duy nhất vào CurrencyShareds.Id. Tôi không thể làm cho repro hoạt động mà không có một chỉ mục duy nhất. Bảng này nhỏ, vì vậy có lẽ bạn có thể nhận được mà không có chỉ mục. Tất nhiên, bạn có thể có những lý do rất tốt để giữ nó.
  2. Cụ thể hóa kết quả của việc tham gia vào một bảng tạm thời. Dựa trên câu hỏi của bạn, điều quan trọng là có được ước tính hợp lý ở bước này để truy vấn lớn hơn thực hiện tốt. Một bảng tạm thời là một cách để thực hiện điều đó.
  3. Sử dụng di sản CE. Tôi không thể có được vấn đề để tái tạo với nó. Tất nhiên, điều này có thể có hậu quả tiêu cực đối với phần còn lại của truy vấn của bạn.
  4. Lừa trình tối ưu hóa truy vấn với mã ngớ ngẩn. Ví dụ, trong thử nghiệm của tôi, việc viết lại sau đây hoạt động rất tốt:

.

select Amount_TransactionCurrency_id, CurrencyShareds.id
from CurrencyShareds 
INNER JOIN annexes
ON Amount_TransactionCurrency_id % 9223372036854775809 = CurrencyShareds.Id % 9223372036854775809

Tôi nghi ngờ rằng điều này hoạt động vì CE dường như sử dụng mật độ thay vì biểu đồ. Viết lại tương tự khác có thể có tác dụng tương tự. Không có gì đảm bảo rằng loại truy vấn sẽ tiếp tục hoạt động tốt trong tương lai. Đó là lý do tại sao bạn nên liên hệ với Microsoft để cải thiện tỷ lệ cược rằng một ngày nào đó, bản sửa lỗi cho vấn đề của bạn sẽ biến nó thành sản phẩm được phát hành.


8

Ok, tôi hy vọng tôi hiểu nó bây giờ - vì vậy đây là trường hợp của chúng tôi

Được

  1. Bảng tham chiếu (MoneyShareds) với ~ 100 hàng, nhưng id lớn và giá trị tối thiểu khác nhau rất nhiều - tối thiểu: 119,762,190,797,406,464 so với tối đa: 977,955,748,426,318,592
  2. Một bảng (Phụ lục) có FK đến MoneyShared đơn giản, nhưng chỉ có một số Tiền tệ được sử dụng - bạn có thể thấy biểu đồ đó cho IX_FK_Amount_TransactionCurrency liệt kê 5 id - và những điều quan trọng chỉ những id "thấp" đó, vì những id khác không được sử dụng.

Khi tất cả các số liệu thống kê được cập nhật sau đó

CSelCalcExpressionComparedToExpression( QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id x_cmpEq QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id )

Loaded histogram for column QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id from stats with id 7

Loaded histogram for column QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id from stats with id 1

Selectivity: 0.01

Sau đó, độ chọn lọc được tính cho phép nối là tốt, vì 100 * 107,131 * 0,01 = 107,131

Khi số liệu thống kê về tiền tệ được chia sẻ không cập nhật, thì

CSelCalcExpressionComparedToExpression( QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id x_cmpEq QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id )

Loaded histogram for column QCOL: [test.MasterData].[dbo].[Annexes].Amount_TransactionCurrency_id from stats with id 7

Loaded histogram for column QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id from stats with id 1 *** WARNING: badly-formed histogram ***

Selectivity: 4.59503e-018

Độ chọn lọc giảm đáng kể và do đó số hàng ước tính của phép nối là 1.

Khi biểu đồ thay đổi

Sau khi tôi thêm một hàng duy nhất vào các phụ lục điều chỉnh MoneyShared với id cao, thì kết quả là biểu đồ cho IX_FK_Amount_TransactionCurrency thay đổi thành

RANGE_HI_KEY         RANGE_ROWS    EQ_ROWS       DISTINCT_RANGE_ROWS  AVG_RANGE_ROWS
-------------------- ------------- ------------- -------------------- --------------
119762190797406475   0             173           0                    1
119762190797406478   0             868           0                    1
119762190797406481   0             107           0                    1
119762190797406494   0             105745        0                    1
119762190797406496   0             330           0                    1
119762190797406618   0             1             0                    1
119762190797406628   0             1             0                    1
977955748426318623   0             1             0                    1

Với biểu đồ này, vấn đề biến mất, giờ đây việc thêm một hàng mới vào các đơn vị tiền tệ không làm giảm đáng kể ước tính số lượng thẻ.

Tại sao vậy?

Tôi nghi ngờ đây là cách thuật toán ước tính biểu đồ thô hoạt động trong sql2014 + và tôi dựa trên dự đoán của mình về bài đăng tuyệt vời này https://www.sqlshack.com/join-estimation-iternals/

Ước tính biểu đồ thô là một thuật toán mới và ít tài liệu hơn, ngay cả về các khái niệm chung. Được biết, thay vì sắp xếp các biểu đồ từng bước, nó căn chỉnh chúng với các ranh giới biểu đồ tối thiểu và tối đa. Phương pháp này có khả năng giới thiệu các lỗi CE ít hơn (tuy nhiên không phải lúc nào cũng vậy, vì chúng tôi nhớ rằng đây chỉ là một mô hình).

Chỉ để làm cho mọi thứ rõ ràng - tại sao chúng ta có những id lạ như vậy trong tiền tệ được chia sẻ?

Điều này khá đơn giản - id của chúng tôi là duy nhất trên toàn cầu và một phần dựa trên dấu thời gian (thực hiện dựa trên bông tuyết ). Các loại tiền phổ biến nhất đã được thêm vào khi bắt đầu ứng dụng vài năm trước và chỉ có một số ít thực sự được sử dụng trong sản xuất, đó là lý do tại sao trong biểu đồ chỉ có những loại có id "thấp".

Vấn đề nổi lên trên môi trường thử nghiệm của chúng tôi, trong đó một số thử nghiệm tự động bắt đầu thêm tiền tệ thử nghiệm, khiến một số truy vấn thực thi lâu hơn hoặc hết thời gian ...

Làm thế nào để khắc phục vấn đề?

Chúng tôi sẽ cập nhật số liệu thống kê cho các bảng tham chiếu đó (chúng tôi có thể gặp vấn đề tương tự với các bảng dữ liệu tham chiếu tương tự khác) thường xuyên hơn - các bảng đó nhỏ nên việc cập nhật thống kê không phải là vấn đề

Bài học kinh nghiệm

  • Thống kê cập nhật rất quan trọng !!!
  • cột nhận dạng cũ đơn giản sẽ không gây ra những vấn đề này :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.