Tampilan Terindeks
Solusi yang sama sekali baru berdasarkan Tampilan Terindeks mungkin.
Tampilan Terindeks adalah tampilan yang memiliki indeks berkerumun di dalamnya, dan data sebenarnya disimpan di disk.
Seperti yang saya pahami, Anda mencoba menyimpan jumlah pembelian per item produk yang disimpan di tblProduct
. Saya berasumsi bahwa ItemCode
adalah PK dari tblProduct dan ItemName
juga didefinisikan di sana (Kami tidak dapat menggunakan MAX
dalam tampilan yang diindeks). Jadi kita bisa mendefinisikan tampilan seperti ini:
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
Kami kemudian dapat membuat indeks berkerumun di atasnya untuk mempertahankannya di disk. SQL Server akan mempertahankan indeks setiap kali pembaruan ke tabel dasar terjadi. Jika tidak ada lagi baris dalam pengelompokan (diidentifikasi dengan hitungan menjadi 0), maka baris tersebut akan dihapus:
CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO
Sekarang jika kita ingin menanyakannya, kita dapat bergabung dengan tampilan ini ke tblProducts
(kirim gabung karena mungkin tidak ada pembelian):
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;
Kami juga dapat mendefinisikan ini sebagai tampilan (bukan tampilan yang diindeks, tetapi tampilan standar) sehingga definisi tersebut dapat digunakan di mana saja.
Catatan tentang NOEXPAND
:
Jika Anda tidak menggunakan SQL Server Enterprise atau Developer Edition, Anda harus menggunakan petunjuk WITH (NOEXPAND)
untuk memaksanya menggunakan indeks, jika tidak maka akan meminta basis tblPurchase
alih-alih. Dan bahkan dalam edisi tersebut, yang terbaik adalah menggunakan NOEXPAND
.
Lihat artikel ini oleh Paul White tentang ini.