Làm thế nào xác định là tạo kế hoạch thực hiện trong SQL Server?


13

Cho các hằng số sau:

  • Cơ sở dữ liệu giống nhau có cùng cấu trúc (bảng, chỉ mục, v.v.)
  • Dữ liệu giống nhau
  • Cấu hình phần cứng và máy chủ SQL giống nhau
  • Thống kê tương tự
  • Các tùy chọn SET tương tự trong máy khách
  • Các phiên bản SQL Server giống nhau
  • Các cờ theo dõi tương tự

Với các hằng số này, SQL Server sẽ luôn tạo cùng một kế hoạch cho một truy vấn nhất định?

Nếu không, có những cân nhắc khác? Có phải cũng có một yếu tố của nondeterminism để xem xét là tốt?


Sẽ không đúng khi nói cùng một kế hoạch, nhưng chúng ta có thể nói kế hoạch tương tự. Cùng với các yếu tố bên ngoài mà DBA / Developer có thể kiểm soát; "Thuật toán tối ưu hóa kế hoạch truy vấn" và "thuật toán chi phí truy vấn nội bộ" được viết bên trong công cụ máy chủ SQL. chúng tôi không có quyền kiểm soát việc nói "nên chọn cái gì" theo mọi cách. chúng ta có thể đặt env bên ngoài để hướng dẫn động cơ chọn tốt nhất. đối với một truy vấn nhất định nếu trình tối ưu hóa đã đưa ra hai kế hoạch thực hiện với giả sử chênh lệch chi phí 0,001 thì tôi đoán nó sẽ không liên quan đến kế hoạch thực hiện mà nó chọn.
Anup Shah

Tôi không nghĩ bạn nên lý thuyết về điều này. Tôi đã làm việc 25 năm với các cơ sở dữ liệu khác nhau và hầu như luôn luôn có thể viết lại một truy vấn để thực hiện tốt hơn. Và đôi khi rất khó để hiểu tại sao nó tốt hơn với một cách viết truy vấn.

Câu trả lời:


13

Với các hằng số này, SQL Server sẽ luôn tạo cùng một kế hoạch cho một truy vấn nhất định? Nếu không, có những cân nhắc khác? Có phải cũng có một yếu tố của nondeterminism để xem xét là tốt?

Biên dịch truy vấn có tính quyết định theo như tôi biết. Một trong những mục tiêu thiết kế QO ban đầu là có thể sao chép các kế hoạch thực hiện trên một hệ thống khác bằng cách sử dụng bản sao cơ sở dữ liệu chỉ thống kê . Có một vài sự tinh tế trong đó, xung quanh các tham số cấu hình như dung lượng bộ nhớ khả dụng và số lượng bộ xử lý logic, nhưng chúng được bao phủ trong danh sách những thứ cần đồng bộ hóa của bạn.

Hãy cẩn thận: Điều đó đúng với điều kiện từ 'giống nhau' trong danh sách của bạn được hiểu là hoàn toàn giống nhau về mọi phương diện . Ví dụ: thống kê 'giống nhau' có thể tồn tại trên hai hệ thống, nhưng chúng chỉ giống hệt nhau nếu các bước biểu đồ và thông tin mật độ giống hệt nhau .

Điều đó nói rằng, quá trình tối ưu hóa cũng cực kỳ phức tạp , có nghĩa là khó có thể đảm bảo rằng tất cả các yếu tố đầu vào của quy trình xác định này là giống hệt nhau và tất cả các trạng thái bên trong đều tương tự nhau để đảm bảo đường dẫn mã tương tự được thực hiện thông qua trình tối ưu hóa cụ thể biên soạn. Nếu truy vấn chứa quyền truy cập bên ngoài cơ sở dữ liệu (đến cơ sở dữ liệu hoặc ví dụ khác), các môi trường đó cũng phải giống hệt nhau.

Một điều tôi muốn thêm vào danh sách của bạn là kiểm tra xem có bất kỳ hướng dẫn kế hoạch nào cũng tồn tại trong cơ sở dữ liệu thứ hai không.


Việc sử dụng các hàm không xác định như GETDATE()trong các truy vấn có thể có nghĩa là bạn cũng có một kế hoạch khác. Mặc dù trình tối ưu hóa chính không sử dụng trực tiếp giá trị, ước tính cardinality có thể (xem Đánh giá liên tục và đánh giá biểu thức trong ước tính Cardinality ). Tôi không chắc chắn nếu loại khác biệt này nằm trong phạm vi của câu hỏi, bởi vì cả hai hệ thống sẽ tạo ra cùng một kế hoạch nếu được thực hiện cùng một lúc (hoặc, nói chung hơn, với cùng các biến đầu vào, tham số và giá trị hàm).

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.