Câu hỏi SQL - CTE và VIEW


Câu hỏi của tôi ở đây là sự khác biệt giữa CTE và View trong SQL. Ý tôi là trong trường hợp nào tôi nên sử dụng CTE và trường hợp nào View. Tôi biết rằng cả hai đều là một số loại bảng ảo nhưng tôi không thể phân biệt việc sử dụng chúng.

Tôi đã tìm thấy một câu hỏi tương tự đây nhưng đó là về hiệu suất.

Cập nhật 1:

Ví dụ: Tôi có một cơ sở dữ liệu chứa đầy các giao dịch (tbl_trade). Tôi cần chọn từ 3,5 triệu bản ghi chỉ các giao dịch được mở tháng hiện tại cho đến thời điểm hiện tại và sau đó thao tác dữ liệu (với các truy vấn khác nhau trên bảng ảo - điều này trông giống như Xem). Vấn đề ở đây là tôi muốn SUM 3-4 cột và sau đó tôi cần SUM một số cột và tạo một cột ảo với kết quả (trông giống như CTE).

Ví dụ: tbl_trade có các cột: profit,bonus và expenses. tôi cần SUM(profit),SUM(bonus),SUM(expenses) và cột mới total sẽ bằng SUM(profit)+SUM(bonus)+SUM(expenses).

PS. Chạy lại các truy vấn cho SUM không phải là một lựa chọn vì tôi đã có kết quả.

Cảm ơn trước!


7
2018-06-18 14:45


gốc


Một khung nhìn là một đối tượng trong cơ sở dữ liệu. CTE chỉ tồn tại trong khoảng thời gian của một truy vấn. Họ có vẻ rất khác nhau. Bạn có thể cung cấp một ví dụ về lựa chọn giữa chúng? - Gordon Linoff
Bạn đang xử lý bao nhiêu dữ liệu? CTE sử dụng rộng rãi TempDb và nếu TempDb của bạn không được định cấu hình đúng hoặc CTE của bạn đang xử lý nhiều hàng thì đó không phải là đặt cược tốt nhất. Chọn Xem khi xử lý lượng lớn dữ liệu và CTE với số lượng nhỏ. Bạn cũng có thể chọn CTE khi bạn cần đệ quy. Đó là tất cả ! - Anuj Tripathi
Xin chào và cảm ơn bạn đã trả lời. xem các câu hỏi được cập nhật - BlackM
@BlackM kiểm tra câu trả lời cập nhật của tôi. - Anuj Tripathi


Các câu trả lời:


Chế độ xem có thể được lập chỉ mục nhưng CTE không thể. Vì vậy, đây là một điểm quan trọng.

CTE làm việc tuyệt vời trên tree hierarchytức là đệ quy

Ngoài ra, hãy cân nhắc chế độ xem khi xử lý các truy vấn phức tạp. Lượt xem là đối tượng vật lý trên cơ sở dữ liệu (nhưng không lưu trữ dữ liệu về mặt vật lý) và có thể được sử dụng trên nhiều truy vấn, do đó cung cấp sự tiếp cận linh hoạt và tập trung. CTE, mặt khác là tạm thời và sẽ được tạo ra khi chúng được sử dụng; đó là lý do tại sao họ được gọi là inline view.

Cập nhật

Theo câu hỏi được cập nhật của bạn, lượt xem sẽ là lựa chọn đúng đắn. Đối phó với 3,5 triệu hàng trong CTE sẽ tạo thêm chi phí trên TempDb mà cuối cùng sẽ làm chậm hiệu suất SQL Server. Hãy nhớ rằng, CTE là một chế độ xem dùng một lần do đó không có số liệu thống kê nào được lưu trữ và bạn cũng không thể tạo các chỉ mục. Nó giống như một truy vấn phụ.


12
2018-06-18 15:02



"CTE không hoạt động tốt với số lượng lớn dữ liệu so với lượt xem" Điều đó không đúng. Không có sự khác biệt giữa CTE và chế độ xem trừ khi chế độ xem được lập chỉ mục. - Mikael Eriksson
Nhưng tôi có thể thêm column1+column2 as column3 và trình bày nó trong truy vấn? - BlackM
@MikaelEriksson Đúng nhưng trên thử nghiệm của tôi về số lượng lớn dữ liệu [đệ quy] tôi thấy việc sử dụng tempdb cao, do đó hiệu suất thấp. Tuy nhiên, tôi vẫn tin rằng nhận xét của bạn là chính xác và tôi đang sửa đổi câu trả lời của mình. - Anuj Tripathi
@BlackM Bạn có thể thêm cột được tính trong các khung nhìn và bạn cũng có thể tạo CTE bên trong một khung nhìn. - Anuj Tripathi


Cả hai sẽ được diễn giải chính xác như nhau bởi Trình tối ưu hóa kế hoạch. Nó chỉ là một điều khác.

Có thể sử dụng chế độ xem trên chính chế độ xem đó. Nó có thể gói gọn các câu lệnh phức tạp vào một truy vấn đơn giản hơn.

Có phải CTE được sử dụng chủ yếu để viết mã sạch hơn với dự phòng ít hơn trong các thủ tục / lượt xem chẳng hạn. Bạn cũng có thể sử dụng CTE cho các truy vấn đệ quy, đây là một tính năng rất tuyệt vời!

Tôi hy vọng điều này sẽ giúp làm rõ mọi thứ.


6
2018-06-18 14:52





Một trong những lý do để chọn CTE: Nếu bạn đang thực hiện truy vấn phân cấp, hãy sử dụng CTE. CTE có thể được gọi là đệ quy. Lượt xem không thể được gọi là đệ quy.


3
2018-06-18 14:51