Giới thiệu
Từ năm 1998 đến đầu năm 2014, SQL Server đã sử dụng một công cụ ước tính cardinality (CE), nhưng sẽ giới thiệu mức tương thích cơ sở dữ liệu mới với mọi phiên bản chính mới của SQL Server, (ngoại trừ SQL Server 2008 R2). Các mức tương thích gốc cho SQL Server được hiển thị theo phiên bản SQL Server chính trong Bảng 1:
Phiên bản máy chủ SQL | Mức độ Tương thích Gốc |
---|---|
SQL Server 7.0 | 70 |
SQL Server 2000 | 80 |
SQL Server 2005 | 90 |
SQL Server 2008 SQL Server 2008 R2 | 100 |
SQL Server 2012 | 110 |
SQL Server 2014 | 120 |
SQL Server 2016 | 130 |
SQL Server 2017 | 140 |
SQL Server 2019 | 150 |
Bảng 1:Phiên bản SQL Server và mức độ tương thích gốc
Giữa SQL Server 7.0 và SQL Server 2012, không có kết nối nào giữa mức độ tương thích của cơ sở dữ liệu và công cụ ước tính bản số mà các truy vấn trong cơ sở dữ liệu đó sẽ sử dụng. Điều này là do chỉ có một công cụ ước tính cardinality, đã nhận được bản cập nhật lớn vào năm 1998. Mức độ tương thích của cơ sở dữ liệu chỉ được sử dụng để tương thích chức năng ngược và để bật / tắt một số tính năng mới trong mỗi phiên bản SQL Server mới (xem phần này Câu trả lời của Stack Exchange cho các ví dụ về cách hành vi đã thay đổi trong khoảng thời gian từ 80 đến 90, có thể là thay đổi gây rối nhất). Không giống như phiên bản tệp của cơ sở dữ liệu SQL Server, bạn có thể thay đổi mức tương thích của cơ sở dữ liệu bất kỳ lúc nào, thành bất kỳ mức tương thích nào được hỗ trợ, bằng một lệnh ALTER DATABASE đơn giản.
Theo mặc định, nếu bạn đã tạo mới cơ sở dữ liệu trong SQL Server 2012, mức tương thích sẽ được đặt thành 110, nhưng bạn có thể thay đổi nó thành mức cũ hơn nếu muốn. Nếu bạn đã khôi phục sao lưu cơ sở dữ liệu từ phiên bản SQL Server 2008 vào phiên bản SQL Server 2012, nó sẽ nâng cấp phiên bản tệp của cơ sở dữ liệu, nhưng sẽ để lại mức tương thích như trên phiên bản SQL Server 2008 (trừ khi là 80, điều này sẽ được nâng cấp lên 90, phiên bản tối thiểu được SQL Server 2012 hỗ trợ). Bên cạnh việc biết được sự khác biệt cơ bản giữa phiên bản tệp của cơ sở dữ liệu và mức độ tương thích của cơ sở dữ liệu, hầu hết các DBA và nhà phát triển không phải lo lắng nhiều về mức độ tương thích của cơ sở dữ liệu trước khi SQL Server 2014 được phát hành. Trong nhiều trường hợp, hầu hết các cơ sở dữ liệu không bao giờ thay đổi mức độ tương thích của chúng sau khi chuyển sang phiên bản SQL Server mới. Điều này thường không gây ra bất kỳ sự cố nào trừ khi bạn thực sự cần một tính năng hoặc hành vi mới đã thay đổi ở mức độ tương thích cơ sở dữ liệu mới nhất.
Các thay đổi của SQL Server 2014
Trạng thái cũ này đã thay đổi hoàn toàn với việc phát hành SQL Server 2014. SQL Server 2014 đã giới thiệu một công cụ ước tính số lượng "mới" được bật theo mặc định khi cơ sở dữ liệu ở mức tương thích 120. Trong báo cáo chính thức cổ điển, “Tối ưu hóa kế hoạch truy vấn của bạn với Công cụ ước tính bản số của SQL Server 2014”, Joe Sack giải thích nền tảng và hành vi của thay đổi này vào tháng 4 năm 2014. Trong nhiều trường hợp, hầu hết các truy vấn của bạn chạy nhanh hơn khi sử dụng bản số mới công cụ ước tính, nhưng khá phổ biến khi gặp phải một số truy vấn có các hồi quy hiệu suất lớn với công cụ ước tính bản số mới. Nếu điều đó xảy ra, SQL Server 2014 không có nhiều tùy chọn để giảm bớt các vấn đề về hiệu suất do CE mới gây ra. Sách trắng của Joe trình bày rất chi tiết về các tùy chọn đó, nhưng về cơ bản, bạn bị giới hạn ở cờ theo dõi cấp phiên bản hoặc gợi ý truy vấn cấp truy vấn để kiểm soát công cụ ước tính bản số nào được trình tối ưu hóa truy vấn sử dụng, trừ khi bạn muốn hoàn nguyên về mức độ tương thích 110 hoặc thấp hơn .
Các thay đổi của SQL Server 2016
SQL Server 2016 đã giới thiệu các tùy chọn cấu hình theo phạm vi cơ sở dữ liệu, cung cấp cho bạn khả năng kiểm soát một số hành vi đã được định cấu hình trước đây ở cấp phiên bản, bằng cách sử dụng lệnh ALTER DATABASE SCOPED CONFIGURATION. Trong SQL Server 2016, các tùy chọn này bao gồm MAXDOP, LEGACY_CARDINATIONAL ESTIMATION, PARAMETER_SNIFFING và QUERY_OPTIMIZER_HOTFIXES. Ngoài ra còn có tùy chọn CLEAR PROCEDURE_CACHE cho phép bạn xóa toàn bộ bộ nhớ cache của gói cho một cơ sở dữ liệu duy nhất.
Có liên quan nhất trong ngữ cảnh này là các tùy chọn cấu hình phạm vi cơ sở dữ liệu LEGACY_CARDINATIONAL ESTIMATION và QUERY_OPTIMIZER_HOTFIXES. LEGACY_CARDINATIONAL ESTIMATION cho phép CE kế thừa bất kể cài đặt mức độ tương thích cơ sở dữ liệu. Nó tương đương với cờ theo dõi 9481, nhưng nó chỉ ảnh hưởng đến cơ sở dữ liệu được đề cập, không ảnh hưởng đến toàn bộ phiên bản. Nó cho phép bạn đặt mức tương thích cơ sở dữ liệu thành 130 để nhận được một số lợi ích về chức năng và hiệu suất, nhưng vẫn sử dụng toàn bộ cơ sở dữ liệu CE kế thừa (trừ khi bị ghi đè bởi gợi ý truy vấn cấp truy vấn).
Tùy chọn QUERY_OPTIMIZER_HOTFIXES tương đương với cờ theo dõi 4199 ở cấp cơ sở dữ liệu. SQL Server 2016 sẽ bật tất cả các hotfix trình tối ưu hóa truy vấn trước SQL Server 2016 RTM khi bạn sử dụng mức độ tương thích cơ sở dữ liệu 130 (không bật cờ theo dõi 4199). Nếu bạn bật TF 4199 hoặc bật QUERY_OPTIMIZER_HOTFIXES, bạn cũng sẽ nhận được tất cả các hotfix của trình tối ưu hóa truy vấn đã được phát hành sau SQL Server 2016 RTM.
SQL Server 2016 SP1 cũng giới thiệu gợi ý truy vấn SỬ DỤNG HINT dễ sử dụng, dễ hiểu và dễ nhớ hơn so với gợi ý truy vấn QUERYTRACEON cũ hơn. Điều này cung cấp cho bạn khả năng kiểm soát chi tiết hơn đối với hành vi của trình tối ưu hóa có liên quan đến mức độ tương thích cơ sở dữ liệu và phiên bản của công cụ ước tính bản số đang được sử dụng. Bạn có thể truy vấn sys.dm_exec_valid_use_hints để nhận danh sách các tên SỬ DỤNG HINT hợp lệ cho bản dựng chính xác của SQL Server mà bạn đang chạy.
Các thay đổi của SQL Server 2017
Tính năng xử lý truy vấn thích ứng mới đã được thêm vào SQL Server 2017 và được bật theo mặc định khi bạn đang sử dụng mức độ tương thích cơ sở dữ liệu 140.
Microsoft đang cố gắng loại bỏ thuật ngữ cũ là “CE mới” và “CE cũ”, vì thực sự có những thay đổi và sửa lỗi để tối ưu hóa truy vấn trong mỗi phiên bản SQL Server chính mới. Bởi vì điều này, không có "CE mới" duy nhất nữa. Thay vào đó, Microsoft muốn tham chiếu đến CE70 (CE mặc định cho SQL Server 7.0 đến SQL Server 2012), CE120 cho SQL Server 2014, CE130 cho SQL Server 2016, CE140 cho SQL Server 2017 và CE150 cho SQL Server 2019. Bắt đầu với SQL Server 2017 CU10, bạn có thể sử dụng chức năng SỬ DỤNG HINT để kiểm soát điều này bằng các gợi ý truy vấn. Ví dụ:
/*...query...*/ OPTION (USE HINT('QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_130'));
… Sẽ là một gợi ý truy vấn hợp lệ để buộc công cụ ước tính bản số CE130 cho một truy vấn cụ thể.
Các thay đổi của SQL Server 2019
SQL Server 2019 đang bổ sung thêm nhiều cải tiến hiệu suất và thay đổi hành vi được bật theo mặc định khi cơ sở dữ liệu đang sử dụng chế độ tương thích 150. Một ví dụ điển hình là nội tuyến UDF vô hướng. Một ví dụ khác là tính năng xử lý truy vấn thông minh, là một tập hợp chính của xử lý truy vấn thích ứng trong SQL Server 2017.
Có năm tùy chọn SỬ DỤNG HINT mới, bao gồm các cách tắt chế độ hàng loạt hoặc tắt phản hồi cấp bộ nhớ thích ứng, như được hiển thị trong Bảng 2:
DISABLE_BATCH_MODE_ADAPTIVE_JOINS |
DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK |
DISABLE_INTERLEAVED_EXECUTION_TVF |
DISALLOW_BATCH_MODE |
QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_150 |
Bảng 2:Các tùy chọn SỬ DỤNG GỢI Ý mới
Và cũng có mười sáu tùy chọn cấu hình phạm vi cơ sở dữ liệu mới (kể từ CTP 2.2) cung cấp cho bạn quyền kiểm soát cấp cơ sở dữ liệu đối với nhiều mục hơn cũng bị ảnh hưởng bởi cờ theo dõi hoặc mức độ tương thích cơ sở dữ liệu. Nó cung cấp cho bạn khả năng kiểm soát chi tiết hơn đối với các thay đổi cấp cao hơn được bật theo mặc định với mức độ tương thích cơ sở dữ liệu 150. Các thay đổi này được liệt kê trong Bảng 3:
ACCELERATED_PLAN_FORCING | ELEVATE_RESUMABLE | ROW_MODE_MEMORY_GRANT_FEEDBACK |
BATCH_MODE_ADAPTIVE_JOINS | GLOBAL_TEMPORARY_TABLE_AUTO_DROP | TSQL_SCALAR_UDF_INLINING |
BATCH_MODE_MEMORY_GRANT_FEEDBACK | INTERLEAVED_EXECUTION_TVF | XTP_PROCEDURE_EXECUTION_STATISTICS |
BATCH_MODE_ON_ROWSTORE | ISOLATE_SECURITY_POLICY_CARDINALITY | XTP_QUERY_EXECUTION_STATISTICS |
DEFERRED_COMPILATION_TV | LIGHTWEIGHT_QUERY_PROFILING | |
ELEVATE_ONLINE | OPTIMIZE_FOR_AD_HOC_WORKLOADS |
Bảng 3:Tùy chọn cấu hình phạm vi cơ sở dữ liệu mới
Kết luận
Di chuyển sang phiên bản SQL Server hiện đại (nghĩa là SQL Server 2016 hoặc mới hơn) phức tạp hơn đáng kể so với các phiên bản cũ của SQL Server. Do những thay đổi liên quan đến các mức độ tương thích cơ sở dữ liệu khác nhau và các phiên bản ước tính bản số khác nhau, điều rất quan trọng là bạn phải suy nghĩ, lập kế hoạch và thử nghiệm thực tế về mức độ tương thích cơ sở dữ liệu nào bạn muốn sử dụng trên phiên bản SQL Server mới mà bạn đang di chuyển các cơ sở dữ liệu hiện có của bạn sang.
Quy trình nâng cấp được khuyến nghị của Microsoft là nâng cấp lên phiên bản SQL Server mới nhất nhưng vẫn giữ mức độ tương thích của cơ sở dữ liệu nguồn. Sau đó, kích hoạt Cửa hàng truy vấn trên mỗi cơ sở dữ liệu và thu thập dữ liệu cơ sở về khối lượng công việc. Tiếp theo, bạn đặt mức độ tương thích của cơ sở dữ liệu thành phiên bản mới nhất, rồi sử dụng Cửa hàng truy vấn để khắc phục sự hồi quy hiệu suất bằng cách bắt buộc kế hoạch tốt đã biết gần đây nhất.
Bạn thực sự muốn tránh một cuộc di chuyển “mù mịt” lộn xộn mà bạn thực sự không biết điều này hoạt động như thế nào và khối lượng công việc của bạn sẽ phản ứng như thế nào với những thay đổi này. Thay đổi mức độ tương thích của cơ sở dữ liệu sang một phiên bản thích hợp và sử dụng các tùy chọn cấu hình phạm vi cơ sở dữ liệu thích hợp, cùng với các gợi ý truy vấn thích hợp khi thực sự cần thiết, là điều cực kỳ quan trọng đối với các phiên bản SQL Server hiện đại.