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

lựa chọn toán tử tối ưu hóa truy vấn - vòng lặp lồng nhau so với đối sánh băm (hoặc hợp nhất)

CHẮC CHẮN RỒI. Một trận đấu băm sẽ là một cải tiến lớn. Tạo băm trên bảng 19,223 hàng nhỏ hơn sau đó thăm dò nó với bảng 65,991 hàng lớn hơn là một thao tác nhỏ hơn nhiều so với vòng lặp lồng nhau yêu cầu 1,268,544,993 so sánh hàng.

Lý do duy nhất khiến máy chủ chọn các vòng lặp lồng nhau là nó đã đánh giá thấp số lượng hàng liên quan. Bảng của bạn có thống kê về chúng không và nếu có, chúng có được cập nhật thường xuyên không? Thống kê là những gì cho phép máy chủ chọn các kế hoạch thực thi tốt.

Nếu bạn đã giải quyết đúng các số liệu thống kê mà vẫn gặp sự cố, bạn có thể buộc nó sử dụng kết hợp HASH như sau:

SELECT *
FROM
   TableA A -- The smaller table
   LEFT HASH JOIN TableB B -- the larger table

Xin lưu ý rằng thời điểm bạn làm điều này, nó cũng sẽ buộc thứ tự tham gia. Điều này có nghĩa là bạn phải sắp xếp tất cả các bảng của mình một cách chính xác để thứ tự nối của chúng có ý nghĩa. Nói chung, bạn sẽ kiểm tra kế hoạch thực thi mà máy chủ đã có và thay đổi thứ tự các bảng của bạn trong truy vấn cho phù hợp. Nếu bạn không quen với cách thực hiện việc này, điều cơ bản là mỗi đầu vào "bên trái" sẽ xuất hiện trước và trong các kế hoạch thực thi đồ họa, đầu vào bên trái là thấp hơn một. Một phép nối phức tạp liên quan đến nhiều bảng có thể phải nhóm các phép nối lại với nhau bên trong dấu ngoặc đơn hoặc sử dụng RIGHT JOIN để có được kế hoạch thực thi là tối ưu (hoán đổi đầu vào trái và phải, nhưng giới thiệu bảng vào đúng điểm trong thứ tự kết hợp).

Nói chung, tốt nhất là tránh sử dụng các gợi ý tham gia và ép buộc thứ tự tham gia, vì vậy hãy làm bất cứ điều gì khác mà bạn có thể làm trước! Bạn có thể xem xét các chỉ mục trên bảng, phân mảnh, giảm kích thước cột (chẳng hạn như sử dụng varchar thay vì nvarchar trong trường hợp không yêu cầu Unicode), hoặc tách truy vấn thành các phần (chèn vào bảng tạm thời trước, sau đó nối vào bảng đó).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gặp lỗi khi chạy tập lệnh 50 MB trên SQL Server 2008 R2

  2. Máy chủ SQL trên Linux

  3. Cách sử dụng IF ... THEN Logic trong SQL Server

  4. Làm thế nào để loại bỏ bất kỳ số cuối cùng nào khỏi một chuỗi?

  5. Làm cách nào để xác minh rằng không đồng bộ / chờ đợi của tôi đang sử dụng cổng hoàn tất I / O?