Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa menyimpan tabel tblPurchase dan tblProductStock tanpa drop. (Saya perlu menjaga tabel dan nilai permanen tanpa drop)

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VARCHAR(MAX) bertingkah aneh saat menggabungkan string

  2. Tambahkan kolom kunci utama dalam tabel SQL

  3. Memasang Instance Failover Cluster SQL Server – Bagian 1

  4. Masukkan 2 juta baris ke SQL Server dengan cepat

  5. Membuat Gambar Docker SQL Server khusus di atas Gambar Resmi