Chế độ xem được lập chỉ mục
Một giải pháp hoàn toàn mới dựa trên Chế độ xem được lập chỉ mục là có thể.
Chế độ xem được lập chỉ mục là chế độ xem có chỉ mục nhóm trên đó và dữ liệu thực sự được lưu trữ trên đĩa.
Theo tôi hiểu, bạn đang cố gắng lưu trữ tổng số lần mua cho mỗi mặt hàng sản phẩm trong tblProduct
. Tôi đã giả định rằng ItemCode
là PK của tblProduct và ItemName
đó cũng được xác định ở đó (Chúng tôi không thể sử dụng MAX
trong một chế độ xem được lập chỉ mục). Vì vậy, chúng ta có thể xác định một dạng xem như sau:
CREATE VIEW dbo.vwTotalPurchases
WITH SCHEMABINDING -- must be schema bound, we cannot change underlying columns after creation
AS
SELECT
ItemCode,
SUM(Quantity) QuantityPurchased,
COUNT_BIG(*) CountPurchases -- if we group, must have count also, so that rows can be maintained
FROM dbo.tblPurchase -- must use two-part names
GROUP BY itemCode;
GO
Sau đó, chúng ta có thể tạo một chỉ mục nhóm trên đó để duy trì nó trên đĩa. SQL Server sẽ duy trì chỉ mục bất cứ khi nào xảy ra cập nhật bảng cơ sở. Nếu không còn hàng nào trong nhóm (được xác định bằng số lượng là 0), thì hàng đó sẽ bị xóa:
CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO
Bây giờ nếu chúng ta muốn truy vấn nó, chúng ta có thể kết hợp chế độ xem này vào tblProducts
(rời tham gia vì có thể không có giao dịch mua):
SELECT
p.ItemCode,
p.ItemName,
ISNULL(tp.QuantityPurchased, 0) QuantityPurchased,
ISNULL(tp.CountPurchases, 0) CountPurchases
FROM tblProducts p
LEFT JOIN vwTotalPurchases tp WITH (NOEXPAND) ON tp.ItemCode = p.ItemCode;
Chúng tôi cũng có thể định nghĩa đây là một chế độ xem (không phải là một chế độ xem được lập chỉ mục, mà là một chế độ xem chuẩn) để định nghĩa này có thể sử dụng được ở mọi nơi.
Ghi chú trên NOEXPAND
:
Nếu bạn không sử dụng SQL Server Enterprise hoặc Developer Edition, bạn phải sử dụng gợi ý WITH (NOEXPAND)
để buộc nó sử dụng chỉ mục, nếu không nó sẽ truy vấn cơ sở tblPurchase
thay vì. Và ngay cả trong các phiên bản đó, tốt nhất là sử dụng NOEXPAND
.
Xem bài viết này của Paul White về điều này.