2015-06-18 15 views
7

Câu hỏi của tôi ở đây là sự khác biệt giữa CTEView trong SQL là gì. Ý 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 là 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.SQL - CTE vs VIEW

Tôi đã tìm thấy một câu hỏi tương tự here 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 đầy nghề (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 một SUM của 3-4 cột và sau đó tôi cần phải 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, bonusexpenses. 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 tùy chọn vì tôi đã có kết quả.

Cảm ơn trước!

+2

Chế độ xem 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? –

+0

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ả ! –

+0

Xin chào và cảm ơn các câu trả lời của bạn. xem các câu hỏi được cập nhật – BlackM

Trả lời

11

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 công việc tuyệt vời trên tree hierarchy nghĩa đệ quy

Ngoài ra, hãy xem xét quan điểm khi giao dịch với 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 chúng được gọi là inline view.

Cập nhật

Theo câu hỏi của bạn được cập nhật, quan điểm 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ụ.

+0

"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. –

+0

Nhưng tôi có thể thêm 'column1 + column2 làm cột3' và hiển thị nó trong truy vấn không? – BlackM

+0

@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 đã tìm thấy mứ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. –

3

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.

6

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.

Chế độ xem có thể được sử dụng riêng. 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 quy trình/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ứ.