View và Các Con Trỏ
Trang 1Chương 11 View và Các Con Trỏ
Định nghĩa con trỏ và quá trình tạo con trỏ
Hiểu rõ View chỉ mục và View phân tán
Nắm vững quá trình thực thi con trỏ
Nhận về dữ liệu từ con trỏ theo hàng
Giới thiệu
Trong chương trước, chúng ta đã được học về các chỉ mục Chúng ta cũng đã hiểu rõ về các kiểuchỉ mục cùng với các đặc trưng hoàn chỉnh và duy nhất Chúng ta cũng đã có những kiến thức vềcác tác vụ như xem, xoá các chỉ mục
Các câu truy vấn được sử dụng để truy xuất dữ liệu từ một bảng Chúng được thực hiện trực tiếptrên dữ liệu thực lưu trữ trong bảng Thay vì việc truy vấn và xử lý dữ liệu trực tiếp trong cácbảng, SQL Server hỗ trợ các bảng ảo để biểu diễn các dữ liệu hiện có theo một cách mới Cácbảng ảo hỗ trợ các chức năng tương tự như các bảng vật lý Dữ liệu có thể được đọc, thêm mới vàsửa đổi trong các bảng giả lập Các bảng như vậy được gọi là View
Trong cơ sở dữ liệu quan hệ, các tác vụ được thực hiện trên tập hợp các hàng của bảng, trả về bởilệnh SELECT Một số ứng dụng như các ứng dụng tương tác và trực tuyến không thể làm việchiệu quả với toàn bộ tập hợp dữ liệu trả về Những ứng dụng này cần một kỹ thuật để xử lý dữliệu trên một hàng hoặc một khối lượng nhỏ các hàng tại một thời điểm Con trỏ là sự mở rộngcủa tập hợp kết quả trả về mà cung cấp kỹ thuật này Trong chương này, chúng ta sẽ nghiên cứuchi tiết về view và các con trỏ
11.1 View
View là một cách thức để xem các dữ liệu từ một hay nhiều bảng trong cơ sở dữ liệu View là một bảng ảo, bảng ảo được tạo ra như một tập con của các cột hay các hàng từ một hay nhiều bảng khác nhau Đồng thời, nó cũng có thể bao gồm tất cả các hàng và các cột Tuy nhiên, một view không tồn tại như một tập hợp của các giá trị dữ liệu lưu trữ trong cơ sở dữ liệu Các dòng
Trang 2đều có thể được gộp trong view Hình 11.1 chỉ ra một view được tạo ra với cột A và B từ bảng A
Bảo vệ dữ liệu nhạy cảm khỏi những người dùng không được phép
Làm giảm sự phức tạp của cơ sở dữ liệu
Tách các cơ sở dữ liệu khác nhau ở dạng vật lý vào một cơ sở dữ liệu đơn nhất ở dạng logic
11.1.1 Ư u đ iểm của View
Việc sử dụng view mang lại cho người sử dụng và các nhà phát triển một số thuận lợi sau:
Thuận lợi của View đối với người sử dụng cuối
Dễ dàng để hiểu được kết quả
Trong khi tạo ra những view, tên cột có thể được thay đổi sao cho có nghĩa hơn, vì vậy
nó làm cho người sử dụng có thể dễ dàng hiểu được cột này biểu diễn cái gì Việc thayđổi tên cột trong view không tác động đến tên cột trong bảng mà view tham chiếu đến
Dễ dàng để thu được dữ liệu mong muốn
Có nhiều người biết rất ít về SQL, các câu lệnh SQL trở nên khó khăn đối với họ khi họmuốn tạo ra các truy vấn phức tạp từ nhiều bảng khác nhau Bởi vậy, view được tạo racho việc truy cập dữ liệu từ nhiều bảng khác nhau, nó giúp người sử dụng dễ dàng trongviệc truy cập sở dữ liệu
Thuận lợi của View đối với những nhà phát triển
Dễ dàng hạn chế việc mất mát dữ liệu
Một nhà phát triển có thể muốn giấu những thông tin trong một số cột hoặc một số dòngnào đó Bằng việc sử dụng view, người sử dụng có thể được cách truy cập linh hoạt tớinhững dữ liệu mà họ muốn, trong khi vẫn duy trì được bảo mật đối với những dữ liệukhác trong cùng một bảng hoặc trong các bảng khác nhau Để làm việc này, View được
View - Table A & Table B Table A
Table B
Trang 3thiết lập ngăn chặn việc truy cập các cột không được phép, các cột này sẽ bị ẩn đối vớingười sử dụng.
Dễ dàng bảo trì các ứng dụng
Chúng ta dễ dàng soát lỗi của View hơn là soát lỗi của nhũng truy vấn Dò tìm lỗi trongtừng bước của mỗi một quá trình trong một View là dễ dàng bởi tất cả các bước đều làmột phần của View
11.1.2 Tạo mới View
Câu lệnh T-SQL CREATE VIEW được sử dụng để tạo ra một view Cú pháp là:
CREATE VIEW <Ten_View> AS <Câu lệnh Select>
Ví dụ , để tạo một View trong cơ sở dữ liệu pups nó bao gồm chi tiết về những nhân viên cho nhà
xuất bản “ New Moon Books”, câu lệnh như sau:
CREATE VIEW NewMoon_employee AS
Select emp_id, fname, minit, lname, hire_date
FROM employee e, publishers p WHERE e.pub_id =p.pub_id AND pub_name=’New Moon Books’Một View đã được tạo ra, một câu lệnh SELECT có thể được thực thi để xem các hàng của View SELECT * FROM NewMoon_employee
Hình 11.2 hiển thị nội dung của View
Trang 4Figure 11.2: Hiển thị nội dung của một View 11.1.3 Các nguyên tắc khi tạo View
Có một số các nguyên tắc phải tuân theo trong khi tạo View
View chỉ có thể được tạo trong cơ sở dữ liệu hiện tại
Tên một View tương tự như tên một bảng bởi vì nó phải dễ dàng để nhớ và có sự liên kết (không có khoảng trắng giữa các kí tự) Nó phải theo các quy ước đặt tên để đảm bảo sự đồng nhất
Một View có thể được xây dựng dựa vào các View khác SQL SERVER cho phép các View được lồng vào nhau tới 32 mức (cấp) Mỗi một View có thể bao gồm tới 1024 cột từ một hay nhiều bảng hoặc từ nhiều View khác
Những giá trị mặc định, những quy tắc và bẫy lỗi không thể được liên kết với View
View không thể đánh chỉ mục
Các bảng tạm thời không thể tham gia vào View
Khai báo View được lưu giữ lại ngay cả khi các bảng liên quan bị loại bỏ
Câu truy vấn để khai báo View không thể bao gồm các mệnh đề ORDER BY,
COMPUTE, COMPUTE BY hoặc từ khóa INTO
11.1.4 Sửa đổi dữ liệu thông qua View
Tương tự như trong các bảng, các câu lệnh INSERT/UPDATE/DELETE có thể được đưa vào trong View Kết quả thay đổi ở View chính là sự thay đổi dữ liệu trong bảng cơ sở Một View có thể được sử dụng để thay đổi dữ liệu trong bảng với điều kiện:
View phải bao gồm ít nhất một bảng nằm trong mệnh đề FROM của phần khai báo View, điều đó có nghĩa là View không thể chỉ có một biểu thức
Không có tất cả các hàm sau (AVG, COUNT, SUM, MIN, MAX, GROUPING) hoặc
GROUP BY, UNION, DISTINCT hoặc mệnh đề TOP trong danh sách được chọn Tuy nhiên,tất cả các hàm đó có thể được sử dụng trong chuỗi truy vấn con được khai báo trong mệnh đề FROM với điều kiện là các giá trị nhận được, được sinh ra từ nhóm các hàm trên không bị thay đổi
View không có các cột nhận được từ trong danh sách chọn Các cột nhận được này là kết quả của tập hợp các cột chuẩn bởi bất cứ thứ gì hơn là một cột biểu thức đơn giản, ví dụ như việc
sử dụng các hàm, hay toán tử thêm hoặc xóa
Câu lệnh INSERT, UPDATE và DELETE bắt buộc phải theo một tiêu chuẩn nhất định trước khi chúng tham chiếu đến View có thể cập nhật Câu lệnh UPDATE và INSERT có thể tham chiếu đến View (có thể cập nhật) chỉ khi nếu chúng thay đổi dữ liệu chỉ trong một bảng của các bảng cơ
sở của View Câu lệnh DELETE có thể tham chiếu đến View cập nhật được chỉ khi nếu View đó bao gồm chính xác một bảng trong mệnh đề FROM
11.1.5 Xóa View
Sau khi một View được sử dụng xong, nó có thể bị xóa để giải phóng vùng nhớ Việc xóa một View không tác động đến các bảng cơ sở mà View tham chiếu đến Câu lệnh xóa một View là: DROP VIEW Ten_view
Ten_view chính là tên của một view đã có trong cơ sở dữ liệu Ví dụ, câu lệnh sau sẽ xóa View
có tên NewMoon_employee
Trang 5DROP VIEW NewMoon_employee
11.2 View chỉ mục
View chỉ mục đã được giới thiệu trong SQL Server 2000 và chỉ được hỗ trợ trong phiên bản
Enterprise Edition (Phiên bản Standard và Personal cho phép bạn tạo chỉ mục trên một View
nhưng trình tối ưu hoá truy vấn sẽ không sử dụng view chỉ mục ở trong phần truy vấn) Đến tậngần đây khái niệm của việc đánh chỉ mục một View vẫn còn vô lý, bởi việc đánh chỉ mục dữ liệu
ảo (dữ liệu không tồn tại) vẫn còn mơ hồ không rõ ràng Một View là một bảng ảo, nó không cóbất kì dữ liệu thật nào của chính nó Nó cho phép bạn truy cập đến dữ liệu hiện thời ở trongnhững bảng cơ sở Những View chỉ mục tăng cường khả năng thực hiện các truy vấn phức tạpmột cách mạnh mẽ
SQL Server 2000 có View chỉ mục, tương tự như Materialized View của Oracle Những lợi thế
của kiểu view này là nó cung cấp một cơ chế tìm kiếm rất nhanh chóng để lấy ra thông tin củamột view một cách liên tục Chỉ mục đầu tiên được tạo ra trong một View chỉ mục phải là một chỉmục duy nhất loại clustered Mỗi khi chỉ mục đầu tiên được tạo ra, kéo theo một số chỉ mục loạinon-clustered có thể được tạo ra
Tốt nhất chúng ta nên xây dưng View chỉ mục trên dữ liệu không thường xuyên cập nhật, bởi vì
việc duy trì view có chi phí cao hơn việc duy trì một chỉ mục của bảng Nếu view chỉ mục đượctạo ra trên những dữ liệu cập nhật thường xuyên thì chi phí để duy trì dữ liệu trong view chỉ mục
có thể làm giảm những ưu điểm của việc sử dụng view chỉ mục
Bạn có thể cải thiện khả năng thực thi của những kiểu truy vấn dưới đây bằng việc sử dụng View
chỉ mục:
Quá trình tập hợp hoặc kết nối rất nhiều hàng
Bạn không thể cải thiện khả năng thực thi của những kiểu truy vấn dưới đây bằng việc sử dụng
View chỉ mục:
Các công việc chứa một số lượng lớn các tác vụ cập nhật đối với cơ sở dữ liệu
Những hệ thống OLTP với nhiều tác vụ ghi dữ liệu
Các câu truy vấn không chứa toán tử tập hợp hoặc kết nối
Các tập hợp dữ liệu có khoá ở mức yếu tố cao (Một mức yếu tố cao chỉ ra rằng khoá nắm giữnhiều giá trị Trong trường hợp khoá là duy nhất, mỗi khoá đều có một giá trị khác nhau thìmức yếu tố ở giá trị cao nhất có thể)
Trang 6 Nếu view tham chiếu đến một chức năng nào đó do người dùng định nghĩa, nó phải sử dụng
tuỳ chọn SCHEMABINDING.
View có thể chỉ bao gồm các chức năng do người dùng định nghĩa và các bảng tham chiếu và
nó không thể tham chiếu đến bất kỳ view nào khác
Các đối tượng được tham chiếu trong view phải trong cùng một cơ sở dữ liệu với view
Các đối tượng được tham chiếu trong view phải sử dụng kiểu tên quy ước gồm hai phần
chẳng hạn như as dbo.Employees (dbo là tên người sở hữu và Employees là đối tượng cơ sở
dữ liệu), Jones.UDFName (Jones là tên người sở hữu và UDFName là đối tượng cơ sở dữ
liệu) Một view có thể chỉ bao gồm các đối tượng được tạo ra bởi người sở hữu view đó Ví
dụ, một view được tạo bởi người sử dụng dbo có thể chứa các đối tượng của một mình dbo.
Bạn phải sử dụng tuỳ chọn ARITHABORT khi tạo chỉ mục.
Ghi chú: Tuỳ chọn arithabort được dùng để huỷ các truy vấn trong trường hợp tràn bộ đệm hoặc
gặp lỗi chia cho 0 Tuỳ chọn này giúp cho việc dừng các thao tác số học trong trường hợp có lỗi
Do đó nó có tên là ARITHABORT
Chúng ta cùng tạo một View chỉ mục sử dụng các bảng Customer, Product, Order và
Order_Details từ cơ sở dữ liệu Northwind.
CREATE VIEW CustOrdProd_view
WITH SCHEMABINDING
AS
SELECT cust.CompanyName, ord.OrderID, ord.OrderDate,
orddet.ProductID, prod.ProductName, orddet.Quantity,
orddet.UnitPrice
FROM dbo.Customers AS cust
INNER JOIN dbo.Orders AS ord
Trong view này, chúng ta phải sử dụng tuỳ chọn SCHEMABINDING và quy ước đặt tên hai phần
cho các đối tượng tham chiếu bởi view
Bạn có thể kiểm tra view bằng một câu lệnh SELECT đơn giản:
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT * FROM CustOrdProd_view
Kết quả thể hiện trên hình 11.3 Tuỳ chọn statistics time được sử dụng để xem số lượng các thao tác đĩa được sinh ra bởi T-SQL Tuỳ chọn statistics io được sử dụng để hiển thị số mili giây cần
thiết để chuyển đổi, dịch và thực hiện mỗi lệnh
Trang 7Hình 11.3
SQL Server 2000 tạo một lược đồ thực thi trước khi thi hành một câu truy vấn Lược đồ này mô
tả các chỉ mục và đường dẫn, SQL Server sẽ sử dụng để lấy các dữ liệu cần thiết cho truy vấn.Hình 1 hiển thị kết quả của việc nhấn nút trên lược đồ thực thi của câu truy vấn Hình 11.4 hiển
thị chi phí thực hiện lược đồ cho truy vấn này.
Shows Estimated Execution Plan
Trang 8Hình 11.4
Cú pháp TSQL ở trên đã tạo ra một view mà nó có thể được đánh chỉ mục Khi chúng ta tạo chỉmục, chỉ mục đầu tiên được tạo trên view phải vừa là clustered , vừa có tính năng duy nhất SET ARITHABORT ON
CREATE UNIQUE CLUSTERED INDEX Index_CustOrdProd
ON CustOrdProd_view (CompanyName, OrderID, ProductID)
Bạn có thể kiểm tra bằng một lệnh SELECT đơn giản:
SELECT * FROM CustOrdProd_view
Kết quả của view thể hiện trên hình 11.5
Trang 9Hình 11.5
Hình 11.6 hiển thị chi phí thực hiện lược đồ cho truy vấn này
Trang 10Hình 11.6
showplan cho view thông thường và view chỉ mục thể hiện rằng chỉ mục không được sử dụng lúc
nào Tác dụng của một view chỉ mục chỉ rõ ràng trên các bảng mà chứa một số lượng lớn cáchàng Trong các bảng với một số lượng ít các hàng, hiệu suất của một view chỉ mục và viewthông thường sẽ gần như tương đương nhau
11.3 View Phân Tán (Distributed Partitioned views)
SQL Server 2000 hỗ trợ đặc tính “Distributed Partitioned Views (DPV)” hay tạm dịch là View
phân tán Tính năng này cho phép phân chia va phân tán dữ liệu theo chiều ngang tới nhiều server
và cơ sở dữ liệu và làm cho chúng ta cảm thấy vẫn như một cơ sở dữ liệu thống nhât DPV cũngđược giới thiệu trong SQL Server 7.0, với các giới hạn về việc thực hiện các lệnh Select Việcphân chia view cũng đã có trong SQL Server 7 nhưng SQL Server 2000 cho phép chúng đượcphân tán thông qua nhiều máy khác nhau Các bảng đã phân chia được phân tán qua nhiều server
Vì thế, mỗi server cần truy nhập tới mọi server khác Do đó, bạn cần cài đặt cầu hình tất cả các
server như các server liên kết (linked servers)
Ví dụ, xét rằng bạn muốn phân chia các bảng Customers và Orders trên ba server được gọi là
Server1, Server2 and Server3 Để liên kết các server này, Server1 cầm được liên kết với Server2
và Server3; Server2 cần được liên kết với Server3 và Server1; và Server3 cần được liên kết với
Trang 11Server1 và Server2 Trong SQL Server 2000 bạn có thể thực hiện các tác vụ thêm mới, cập nhậttrên các view phân tán.
Với tính năng này, dữ liệu được đặt trên các nút riêng biệt và mỗi nút đều biết rằng các nút khác
đang sử dụng các server liên kết Nó sử dụng chức năng Dynamic Partition Elimination để cho
phép một câu truy vấn thực hiện trên một server và đặt trên một server khác Các server khônglưu trữ dữ liệu cần thiết sẽ không được truy vấn
Trước khi sử dụng chức năng nay bạn nên:
Lên kế hoạch phân chia dữ liệu trên các server khác nhau
Tạo một view phân chia được với một khoá để chia dữ liệu Ví dụ, bạn phải chia dữ liệu
trên cột EmpID và lưu trữ các bản ghi của các nhân viên từ 1 đến 1000 trên Server A và
1001 đến 3000 trên Server B vv Dữ liệu trên mỗi server có các ràng buộc CHECK, các
giới hạn dữ liệu trên server, chỉ của các nhân viên này
Thông báo tới mỗi server về các nút khác trên các server liên kết Server A sẽ có liên kếtvới Server B và ngược lại
Tạo một DPV trên mỗi server mà ở đó phản ánh dữ liệu riêng của nó cũng như dữ liệubiểu diễn trên các server khác
Khi một truy vấn được thực hiện đối với DPV, trình tối ưu hoá thông qua mỗi nút thành viên vàdựa trên ràng buộc CHECK của nút thành viên để to xác nhận xem các bảng yêu cầu của nó đãđược duyệt Nếu điều kiện không phù hợp, bảng được duyệt, ngược lại nó sẽ bị bỏ qua Sau quátrình này, câu truy vấn được gửi lại cho server, từ đó nófrom where it originated ensuring theoptimization of all servers
The disadvantage of this view lies in the Schema changes You have to manage all the nodes that
participated in the view and the view itself in case of any change in the schema
11.3.1 Tạo một View phân chia
Trong một view phân chia, dữ liệu được chia theo chiều ngang từ một tập hợp các bảng thànhviên thông qua một hoặc nhiều server được hợp nhất lại như một bảng đơn SQL Server 2000phân biệt giữa view cục bộ và view phân tán Trong trường hợp của một view phân chia cục bộ,tất cả các bảng tham chiếu trong view và bản thân view tồn tại trên cùng một phiên bản của SQLServer, trong khi với trường hợp của view phân tán, ít nhất một trong các bảng tham chiếu nằmtrên một server ở xa Bên cạnh đó, SQL Server 2000 còn phân biệt giữa view phân chia có thểcập nhật được và view chỉ đọc Khái niệm view phân tán được minh hoạ trong hình 11.7
Trang 12Hình 11.7
Bạn phải chia một bảng theo chiều ngang trước khi thực thi một view phân chia Trong quá trìnhphân chia theo chiều ngang, bảng gốc được thay thế bởi một số ít các bảng thành viên có cùng sốcột như bảng gốc, và mỗi cột có cùng các thuộc tính như kích thước, kiểu dữ liệu Tất cả các bảngthành viên trong một view phân tán phải được đặt trên một server thành viên riêng biệt Bạn cóthể đặt trùng tên cho các cơ sở dữ liệu thành viên trên mỗi server thành viên Ví dụ,
Server1.TempDatabase, Server2 TempDatabase, Server3 TempDatabase.
Trong khi chia một bảng, bạn phải thiết kế các bảng thành viên sao cho mỗi bảng sẽ chứa mộtphần dữ liệu theo chiều ngang của bảng gốc dựa vào một khoảng giá trị của khoá Khoảng giá trịtrong mỗi bảng thành viên được quy định bởi một ràng buộc CHECK trên một cột phân chia Cácgiá trị của khoảng không thể chồng chéo Ví dụ, một bảng không nên có một một khoảng giá trị
từ 1 đến 1000, và một bảng khác với một khoảng từ 500 đến 3000, điều này sẽ tạo ra sự lẫn lộntrong việc quyết định bảng nào chứa giá trị từ 500 đến 1000
Ví dụ, bạn đang chia bảng TEMP thành ba bảng Ràng buộc CHECK cho các bảng này là: Tạo bảng trên Server1:
CREATE TABLE TEMP_1
(ID_no INTEGER PRIMARY KEY
CHECK (ID_no BETWEEN 1 AND 500),
- )
Tạo bảng trên Server2:
CREATE TABLE TEMP_2
(ID_no INTEGER PRIMARY KEY
CHECK (ID_no BETWEEN 500 AND 1000),
MemberTable_2 View1
MemberTable_3 View1
MemberTable_3 View1