Áp dụng bên ngoài so với hiệu suất tham gia trái


37

Tôi đang sử dụng SQL SERVER 2008 R2

Tôi mới bắt gặp ỨNG DỤNG trong SQL và thích cách nó giải quyết các vấn đề truy vấn cho rất nhiều trường hợp,

Nhiều bảng tôi đang sử dụng 2 liên kết trái để có kết quả, tôi đã có thể nhận được trong 1 lần áp dụng bên ngoài.

Tôi có một lượng nhỏ dữ liệu trong các bảng DB cục bộ của mình và sau khi triển khai, mã được cho là chạy trên dữ liệu ít nhất gấp 20 lần.

Tôi lo ngại rằng việc áp dụng bên ngoài có thể mất nhiều thời gian hơn 2 điều kiện tham gia bên trái đối với lượng dữ liệu lớn,

Bất cứ ai cũng có thể cho biết cách áp dụng chính xác hoạt động như thế nào và nó sẽ ảnh hưởng đến hiệu suất trong dữ liệu rất lớn như thế nào. 1.

Đây là truy vấn với 2 bên trái tham gia

select EC.*,DPD.* from Table1 eC left join
  (
   select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
   group by member_id,parent_gid,child_gid,LOB,group_gid

  ) DPD2 on DPD2.parent_gid = Ec.parent_gid
        AND DPD2.child_gid = EC.child_gid
        AND DPD2.member_id = EC.member_id
        AND DPD2.LOB = EC.default_lob
        AND DPD2.group_gid = EC.group_gid
  left join
  Table2 dpd on dpd.parent_gid = dpd2.parent_gid 
            and dpd.child_gid = dpd2.child_gid
            and dpd.member_id = dpd2.member_id 
            and dpd.group_gid = dpd2.group_gid 
            and dpd.LOB = dpd2.LOB
            and dpd.table2_sid = dpd2.mdsid

Đây là truy vấn với áp dụng bên ngoài

select * from Table1 ec   
OUTER APPLY (
      select top 1 grace_begin_date,retroactive_begin_date,Isretroactive
                    from Table2 DPD 
                    where DPD.parent_gid = Ec.parent_gid
                    AND DPD.child_gid = EC.child_gid
                    AND DPD.member_id = EC.member_id
                    AND DPD.LOB = EC.default_lob
                    AND DPD.group_gid = EC.group_gid
                    order by DPD.table2_sid desc
     ) DPD 

Câu trả lời:


44

Bất cứ ai cũng có thể cho biết chính xác áp dụng hoạt động như thế nào và nó sẽ ảnh hưởng đến hiệu suất trong dữ liệu rất lớn

APPLYlà một liên kết tương quan (được gọi là một LATERAL JOINtrong một số sản phẩm và các phiên bản mới hơn của Tiêu chuẩn SQL). Giống như bất kỳ cấu trúc logic nào, nó không có tác động trực tiếp đến hiệu suất. Về nguyên tắc, chúng ta sẽ có thể viết một truy vấn bằng bất kỳ cú pháp tương đương logic nào và trình tối ưu hóa sẽ chuyển đổi đầu vào của chúng ta thành cùng một kế hoạch thực hiện vật lý.

Tất nhiên, điều này sẽ đòi hỏi trình tối ưu hóa để biết mọi biến đổi có thể và có thời gian để xem xét từng cái. Quá trình này có thể mất nhiều thời gian hơn so với thời đại hiện tại của vũ trụ, vì vậy hầu hết các sản phẩm thương mại không áp dụng phương pháp này. Do đó, cú pháp truy vấn có thể và thường có tác động đến hiệu suất cuối cùng, mặc dù rất khó để đưa ra tuyên bố chung về cái nào tốt hơn và tại sao.

Dạng cụ thể OUTER APPLY ( SELECT TOP ... )rất có thể dẫn đến các vòng lặp lồng nhau tương quan tham gia vào các phiên bản hiện tại của SQL Server, vì trình tối ưu hóa không chứa logic để chuyển đổi mẫu này thành tương đương JOIN. Các vòng lặp lồng nhau tương quan có thể không hoạt động tốt nếu đầu vào bên ngoài lớn và đầu vào bên trong không được mở rộng hoặc các trang cần thiết chưa có trong bộ nhớ. Ngoài ra, các yếu tố cụ thể của mô hình chi phí của trình tối ưu hóa có nghĩa là một vòng lặp lồng nhau tương quan ít có khả năng giống với một ngữ nghĩa giống hệt nhau JOINđể tạo ra một kế hoạch thực hiện song song.

Tôi đã có thể thực hiện cùng một truy vấn với phép nối trái và row_number ()

Điều này có thể hoặc không thể tốt hơn trong trường hợp chung. Bạn sẽ cần phải thực hiện kiểm tra cả hai lựa chọn thay thế với dữ liệu đại diện. Các LEFT JOINROW_NUMBERchắc chắn có tiềm năng trở thành hiệu quả hơn, nhưng nó phụ thuộc vào hình dạng kế hoạch truy vấn chính xác lựa chọn. Các yếu tố chính ảnh hưởng đến hiệu quả của phương pháp này là sự sẵn có của một chỉ số để trang trải các cột cần thiết, và để cung cấp trình tự cần thiết cho PARTITION BYORDER BYmệnh đề. Một yếu tố thứ hai là kích thước của bảng. Một chỉ mục hiệu quả và được lập chỉ mục tốt APPLYcó thể thực hiện ROW_NUMBERvới việc lập chỉ mục tối ưu nếu truy vấn chạm vào một phần tương đối nhỏ của bảng có liên quan. Kiểm tra là cần thiết.


2

Truy vấn đầu tiên có thể chạy song song chỉ bởi một yêu cầu đến máy chủ sql. Nó tìm nạp tất cả các bản ghi và đưa ra đầu ra dựa trên các tiêu chí bộ lọc.

Nhưng trong trường hợp thứ hai, nó chạy từng hàng và cho mỗi hàng, Bảng 2 sẽ được quét và thêm vào kết quả.

nếu truy vấn bên ngoài của bạn có ít bản ghi hơn thì truy vấn thứ hai sẽ tốt hơn (ỨNG DỤNG NGOÀI). Nhưng nếu truy vấn đầu tiên có thể nhận được nhiều dữ liệu hơn thì bạn nên sử dụng truy vấn đầu tiên.

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.