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).