Sự khác biệt giữa một thủ tục được lưu trữ và một khung nhìn là gì?


137

Tôi bối rối về một vài điểm:

  1. Sự khác biệt giữa một thủ tục được lưu trữ và một khung nhìn là gì?

  2. Khi nào tôi nên sử dụng các thủ tục được lưu trữ và khi nào tôi nên sử dụng các khung nhìn, trong SQL Server?

  3. Các khung nhìn có cho phép tạo các truy vấn động mà chúng ta có thể truyền tham số không?

  4. Cái nào nhanh nhất, và cái nào nhanh hơn cái kia?

  5. Các khung nhìn hoặc các thủ tục lưu trữ phân bổ bộ nhớ vĩnh viễn?

  6. Điều đó có nghĩa là gì nếu ai đó nói rằng các khung nhìn tạo ra một bảng ảo, trong khi các thủ tục tạo ra một bảng vật liệu?

Xin vui lòng cho tôi biết về nhiều điểm hơn, nếu có bất kỳ.

Câu trả lời:


143

Một khung nhìn đại diện cho một bảng ảo . Bạn có thể nối nhiều bảng trong một khung nhìn và sử dụng khung nhìn để trình bày dữ liệu như thể dữ liệu đến từ một bảng duy nhất.

Một thủ tục được lưu trữ sử dụng các tham số để thực hiện một chức năng ... cho dù đó là cập nhật và chèn dữ liệu, hoặc trả về các giá trị hoặc tập dữ liệu đơn lẻ.

Tạo Chế độ xem và Thủ tục được lưu trữ - có một số thông tin từ Microsoft về thời điểm và lý do nên sử dụng từng chế độ.

Nói rằng tôi có hai bảng:

  • tbl_user, Với các cột: user_id, user_name,user_pw
  • tbl_profile, Với các cột: profile_id, user_id,profile_description

Vì vậy, nếu tôi thấy mình truy vấn từ các bảng đó RẤT NHIỀU ... thay vì tham gia vào MỌI đoạn SQL, tôi sẽ định nghĩa một khung nhìn như:

CREATE VIEW vw_user_profile
AS
  SELECT A.user_id, B.profile_description
  FROM tbl_user A LEFT JOIN tbl_profile B ON A.user_id = b.user_id
GO

Vì vậy, nếu tôi muốn truy vấn profile_descriptionbởi user_idtrong tương lai, tất cả tôi phải làm là:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

Mã đó có thể được sử dụng trong một thủ tục được lưu trữ như:

CREATE PROCEDURE dbo.getDesc
    @ID int
AS
BEGIN
    SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO

Vì vậy, sau này, tôi có thể gọi:

dbo.getDesc 25

và tôi sẽ nhận được mô tả cho user_id25, trong đó 25tham số của bạn.

Rõ ràng có nhiều chi tiết hơn, đây chỉ là ý tưởng cơ bản.


1
Nhưng tôi có thể tham gia có thể tham gia nhiều bảng trong thủ tục được lưu trữ cũng như ở đó tôi không phải đưa ra tham số.
NoviceToDotNet

5
Nhưng TẠI SAO bạn sẽ làm điều đó? Bạn đang cố gắng để thực hiện? Bạn có thể sử dụng chế độ xem NHƯ một bảng ... các thủ tục được lưu trữ là để LÀM những thứ ... các chế độ xem là để làm cho cuộc sống của bạn dễ dàng hơn.
Patrick

1
Hãy nghĩ về một khung nhìn như một truy vấn được lưu trữ, vì vậy nếu bạn có hai bảng mà bạn thấy bạn phải tham gia rất nhiều để hoàn thành công việc, bạn có thể tạo một khung nhìn để làm việc để bạn không phải tham gia chúng mọi lúc.
Patrick

2
Tôi không nhận được, xin vui lòng mô tả thêm.
NoviceToDotNet

2
đúng nhưng nó lưu trữ quan điểm của bạn sau đó ... để bạn có thể gọi nó như một bảng duy nhất. theo cách đó bạn tạo liên kết của mình một lần và bất kỳ tương lai nào sử dụng tham chiếu trực tiếp khung nhìn gọi sql bên dưới như thể nó là một bảng.
Patrick

107

Rất nhiều thông tin có sẵn ở đây

Đây là một bản tóm tắt tốt:

Thủ tục lưu trữ:

  • Chấp nhận tham số
  • Có thể KHÔNG được sử dụng như xây dựng khối trong một truy vấn lớn hơn
  • Có thể chứa một số câu lệnh, vòng lặp, IF ELSE, v.v.
  • Có thể thực hiện sửa đổi một hoặc nhiều bảng
  • KHÔNG thể được sử dụng làm mục tiêu của câu lệnh INSERT, UPDATE hoặc DELETE.

Một cái nhìn:

  • Liệu KHÔNG chấp nhận các thông số
  • Có thể được sử dụng làm khối xây dựng trong truy vấn lớn hơn
  • Chỉ có thể chứa một truy vấn CHỌN duy nhất
  • KHÔNG thể thực hiện sửa đổi cho bất kỳ bảng nào
  • Nhưng đôi khi (đôi khi) có thể được sử dụng làm mục tiêu của câu lệnh INSERT, UPDATE hoặc DELETE.

6
Ngoài ra, các Chế độ xem không được chứa bất kỳ mệnh đề "theo thứ tự" hoặc "hàng đầu" nào
sksallaj

2
Điều gì có nghĩa là "KHÔNG thể được sử dụng làm mục tiêu của câu lệnh INSERT, UPDATE hoặc DELETE"? Chúng ta không thể sử dụng CHERTN, XÓA, CẬP NHẬT trong Thủ tục lưu trữ?
Arsman Ahmad

"Một quan điểm, KHÔNG chấp nhận tham số", điều đó không đúng? Video chẳng hạn: youtube.com/watch?v=zK-mWjUxKpw
xayer

Lượt xem có thể thực hiện sửa đổi đối với bảng / bảng cơ sở: csharp-video-tutorials.blogspot.com/2012/09/ Kẻ
Khurram

8

Đầu tiên bạn cần hiểu, rằng cả hai đều là những thứ khác nhau. Stored Proceduresđược sử dụng tốt nhất cho các INSERT-UPDATE-DELETEbáo cáo. Trong khi đó Viewsđược sử dụng cho các SELECTbáo cáo. Bạn nên sử dụng cả hai.

Trong chế độ xem, bạn không thể thay đổi dữ liệu. Một số cơ sở dữ liệu có thể cập nhật xem nơi bạn có thể sử dụng INSERT-UPDATE-DELETEtrên Views.


2
Bạn có thể thay đổi dữ liệu trong bảng bên dưới bằng cách sử dụng Chế độ xem. Lượt xem có thể cập nhật.
phát triển Dot Net

7

Dạng xem SQL là một bảng ảo, dựa trên truy vấn SQL SELECT. Một khung nhìn tham chiếu một hoặc nhiều bảng cơ sở dữ liệu hiện có hoặc các khung nhìn khác. Đây là ảnh chụp nhanh của cơ sở dữ liệu trong khi một thủ tục được lưu trữ là một nhóm các câu lệnh Transact-SQL được biên dịch thành một kế hoạch thực hiện duy nhất.

View là dữ liệu hiển thị đơn giản được lưu trữ trong các bảng cơ sở dữ liệu trong khi một thủ tục được lưu trữ là một nhóm các câu lệnh có thể được thực thi.

Một khung nhìn nhanh hơn vì nó hiển thị dữ liệu từ các bảng được tham chiếu trong khi thủ tục lưu trữ thực thi các câu lệnh sql.

Kiểm tra bài viết này: Xem vs Thủ tục lưu trữ . Chính xác những gì bạn đang tìm kiếm


5

Một khung nhìn là một cách đơn giản để lưu một phức tạp SELECTtrong cơ sở dữ liệu.

Một thủ tục lưu trữ được sử dụng khi SQL đơn giản là không đủ. Thủ tục lưu trữ chứa các biến, vòng lặp và các cuộc gọi đến các thủ tục được lưu trữ khác. Đó là ngôn ngữ lập trình, không phải ngôn ngữ truy vấn.

  1. Lượt xem là tĩnh. Hãy nghĩ về chúng như các bảng mới với bố cục nhất định và dữ liệu trong chúng được tạo nhanh chóng bằng cách sử dụng truy vấn bạn đã tạo. Như với bất kỳ bảng SQL nào, bạn có thể sắp xếp và lọc nó với WHERE, GROUP BYORDER BY.

  2. Việc phụ thuộc vào những gì bạn làm.

  3. Việc phụ thuộc vào cơ sở dữ liệu. Các khung nhìn đơn giản chỉ cần chạy truy vấn và lọc kết quả. Nhưng các cơ sở dữ liệu như Oracle cho phép tạo ra một khung nhìn "cụ thể hóa", về cơ bản là một bảng được cập nhật tự động khi dữ liệu cơ bản của khung nhìn thay đổi.

    Chế độ xem được cụ thể hóa cho phép bạn tạo các chỉ mục trên các cột của chế độ xem (đặc biệt là trên các cột được tính toán không tồn tại ở bất kỳ đâu trong cơ sở dữ liệu).

  4. Tôi không hiểu bạn đang nói về cái gì.


5

Ngoài các ý kiến ​​trên, tôi muốn thêm một vài điểm về Lượt xem.

  1. Lượt xem có thể được sử dụng để che giấu sự phức tạp. Hãy tưởng tượng một kịch bản trong đó 5 người đang làm việc trong một dự án nhưng chỉ một trong số họ là quá tốt với các công cụ cơ sở dữ liệu như các phép nối phức tạp. Trong trường hợp như vậy, anh ta có thể tạo Chế độ xem có thể dễ dàng truy vấn bởi các thành viên khác trong nhóm khi họ đang truy vấn bất kỳ bảng nào.
  2. Bảo mật có thể được thực hiện dễ dàng bởi Lượt xem. Giả sử chúng tôi là Nhân viên Bảng có chứa các cột nhạy cảm như Mức lương , số SSN . Những cột này không được hiển thị cho người dùng không được phép xem chúng. Trong trường hợp như vậy, chúng ta có thể tạo Chế độ xem chọn các cột trong bảng không yêu cầu bất kỳ ủy quyền nào như Tên , Tuổi , v.v., mà không để lộ các cột nhạy cảm (như Mức lương, v.v. chúng tôi đã đề cập trước đây). Bây giờ chúng tôi có thể xóa quyền truy vấn trực tiếp vào bảng Nhân viên và chỉ cần giữ quyền đọc trên Chế độ xem. Theo cách này, chúng tôi có thể thực hiện bảo mật bằng cách sử dụng Lượt xem.

4
  1. XEM là một truy vấn động nơi bạn có thể sử dụng "WHERE" -Cách
  2. Một thủ tục được lưu trữ là một lựa chọn dữ liệu cố định, trả về một kết quả được xác định trước
  3. Không phải là một khung nhìn, cũng không phải là một thủ tục lưu trữ phân bổ bộ nhớ. Chỉ có một cái nhìn cụ thể
  4. BẢNG chỉ là một ENTITY, một chế độ xem có thể thu thập dữ liệu từ các ENTITY hoặc BẢNG khác nhau

4

Mahesh không hoàn toàn chính xác khi ông đề nghị rằng bạn không thể thay đổi dữ liệu trong chế độ xem. Vì vậy, với quan điểm của patrick

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id

Tôi CÓ THỂ cập nhật dữ liệu ... như một ví dụ tôi có thể thực hiện một trong hai ...

Update vw_user_profile Set profile_description='Manager' where user_id=4

hoặc là

Update tbl_profile Set profile_description='Manager' where user_id=4

Bạn không thể XÁC NHẬN cho chế độ xem này vì không phải tất cả các trường trong tất cả các bảng đều có mặt và tôi cho rằng PROFILE_ID là khóa chính và không thể là NULL. Tuy nhiên, đôi khi bạn có thể XÁC NHẬN vào chế độ xem ...

Tôi đã tạo chế độ xem trên bảng hiện có bằng ...

Create View Junk as SELECT * from [TableName]

SAU ĐÓ

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')

DELETE from Junk Where ID>4

Cả CHERTN và XÓA đều hoạt động trong trường hợp này

Rõ ràng bạn không thể cập nhật bất kỳ trường nào được tổng hợp hoặc tính toán nhưng bất kỳ chế độ xem nào chỉ là chế độ xem thẳng đều có thể cập nhật được.

Nếu dạng xem chứa nhiều hơn một bảng thì bạn không thể chèn hoặc xóa nhưng nếu dạng xem chỉ là một tập hợp con của một bảng thì bạn thường có thể.


3

Sự khác biệt chính là khi bạn đang truy vấn một khung nhìn thì định nghĩa của nó được dán vào truy vấn của bạn. Thủ tục cũng có thể đưa ra kết quả của truy vấn, nhưng nó được biên dịch và để nhanh hơn. Một tùy chọn khác là các khung nhìn được lập chỉ mục ..


2

Lượt xem :

  • Không chấp nhận tham số
  • Nó có thể được sử dụng như một khối xây dựng trong truy vấn lớn.
  • Nó chỉ có thể chứa một truy vấn Chọn duy nhất.
  • Không thể thực hiện sửa đổi cho bất kỳ bảng.
  • Nó có thể được sử dụng (đôi khi) làm mục tiêu cho Chèn, cập nhật, xóa truy vấn.

Thủ tục lưu trữ:

  • Chấp nhận tham số
  • Nó không thể được sử dụng như một khối xây dựng trong truy vấn lớn.
  • Nó có thể chứa một số câu lệnh như if, other, loop, v.v.
  • Nó có thể thực hiện sửa đổi cho một hoặc một vài bảng.
  • được sử dụng làm mục tiêu cho Chèn, cập nhật, xóa truy vấn.

Xem so với thủ tục lưu trữ


1

@Patrick đúng với những gì anh ta nói, nhưng để trả lời các câu hỏi khác của bạn, Chế độ xem sẽ tự tạo trong Bộ nhớ và tùy thuộc vào loại Tham gia, Dữ liệu và nếu có bất kỳ tổng hợp nào được thực hiện, đó có thể là Chế độ xem khá đói bộ nhớ.

Các thủ tục được lưu trữ thực hiện tất cả quá trình xử lý của chúng bằng cách sử dụng Temp Hash Table, ví dụ # tmpTable1 hoặc trong bộ nhớ bằng cách sử dụng @ tmpTable1. Tùy thuộc vào những gì bạn muốn nói với nó để làm.

Một thủ tục lưu trữ giống như một Hàm, nhưng được gọi trực tiếp bằng tên của nó. thay vì các hàm thực sự được sử dụng bên trong một truy vấn.

Rõ ràng hầu hết thời gian các bảng Bộ nhớ đều nhanh hơn, nếu bạn không lấy được nhiều dữ liệu.

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.