Mengubah Tabel yang Dioptimalkan Memori
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Perubahan skema dan indeks pada tabel yang dioptimalkan memori dapat dilakukan dengan menggunakan pernyataan ALTER TABLE. Dalam operasi SQL Server 2016 dan Azure SQL Database ALTER TABLE pada tabel yang dioptimalkan memori OFFLINE, yang berarti bahwa tabel tidak tersedia untuk kueri saat operasi sedang berlangsung. Aplikasi database dapat terus berjalan, dan operasi apa pun yang mengakses tabel diblokir hingga proses perubahan selesai. Dimungkinkan untuk menggabungkan beberapa operasi ADD, DROP, atau ALTER dalam satu pernyataan ALTER TABLE.
Penting
Azure SQL Managed Instance tidak mendukung tabel yang dioptimalkan memori di tingkat layanan Tujuan Umum.
ALTER TABLE
Sintaks ALTER TABLE digunakan untuk membuat perubahan pada skema tabel, serta untuk menambahkan, menghapus, dan membangun ulang indeks. Indeks dianggap sebagai bagian dari definisi tabel:
Sintaks ALTER TABLE ... ADD/DROP/ALTER INDEX hanya didukung untuk tabel yang dioptimalkan memori.
Tanpa menggunakan pernyataan ALTER TABLE, pernyataan CREATE INDEX, DROP INDEX, ALTER INDEX, dan PAD_INDEX tidak didukung untuk indeks pada tabel yang dioptimalkan memori.
Jenis perubahan berikut didukung:
Mengubah jumlah wadah
Menambahkan dan menghapus indeks
Mengubah, menambahkan, dan menghapus kolom
Menambahkan dan menghapus batasan
Untuk informasi selengkapnya tentang fungsionalitas ALTER TABLE dan sintaks lengkapnya, lihat ALTER TABLE (Transact-SQL)
Dependensi terikat skema
Prosedur tersimpan yang dikompilasi secara asli diperlukan untuk terikat skema, yang berarti mereka memiliki dependensi terikat skema pada tabel memori yang dioptimalkan yang mereka akses, dan kolom yang mereka referensikan. Dependensi terikat skema adalah hubungan antara dua entitas yang mencegah entitas yang dirujuk dihilangkan atau dimodifikasi secara tidak kompatibel selama entitas referensi ada.
Misalnya, jika prosedur tersimpan yang terikat dengan skema secara asli mereferensikan kolom c1 dari tabel mytable, kolom c1 tidak dapat dihilangkan. Demikian pula, jika ada prosedur seperti itu dengan pernyataan INSERT tanpa daftar kolom (misalnya, INSERT INTO dbo.mytable VALUES (...)
), maka tidak ada kolom dalam tabel yang dapat dihilangkan.
Pengelogan ALTER TABLE pada tabel yang dioptimalkan memori
Pada tabel yang dioptimalkan memori, sebagian besar skenario ALTER TABLE sekarang berjalan secara paralel dan menghasilkan pengoptimalan penulisan ke log transaksi. Pengoptimalan dicapai hanya dengan mencatat perubahan metadata pada log transaksi. Namun, operasi ALTER TABLE berikut menjalankan utas tunggal dan tidak dioptimalkan untuk log.
Operasi utas tunggal dalam kasus ini akan mencatat seluruh konten tabel yang diubah ke log transaksi. Daftar operasi berulir tunggal mengikuti:
Ubah atau tambahkan kolom untuk menggunakan jenis objek besar (LOB): nvarchar(max), varchar(max), atau varbinary(max).
Menambahkan atau menghilangkan indeks COLUMNSTORE.
Hampir semua yang memengaruhi kolom di luar baris.
- Menyebabkan kolom di baris berpindah dari baris.
- Menyebabkan kolom di luar baris berpindah secara on-row.
- Buat kolom off-row baru.
- Pengecualian: Memperpanjang kolom yang sudah di luar baris dicatat dengan cara yang dioptimalkan.
Contoh
Contoh berikut mengubah jumlah wadah dari indeks hash yang ada. Ini membangun kembali indeks hash dengan jumlah wadah baru sementara properti lain dari indeks hash tetap sama.
ALTER TABLE Sales.SalesOrderDetail_inmem
ALTER INDEX imPK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID
REBUILD WITH (BUCKET_COUNT=67108864);
GO
Contoh berikut menambahkan kolom dengan batasan NOT NULL dan dengan definisi DEFAULT, dan menggunakan WITH VALUES untuk menyediakan nilai untuk setiap baris yang ada dalam tabel. Jika WITH VALUES tidak digunakan, setiap baris memiliki nilai NULL di kolom baru.
ALTER TABLE Sales.SalesOrderDetail_inmem
ADD Comment NVARCHAR(100) NOT NULL DEFAULT N'' WITH VALUES;
GO
Contoh berikut menambahkan batasan kunci primer ke kolom yang sudah ada.
CREATE TABLE dbo.UserSession (
SessionId int not null,
UserId int not null,
CreatedDate datetime2 not null,
ShoppingCartId int,
index ix_UserId nonclustered hash (UserId) with (bucket_count=400000)
)
WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) ;
GO
ALTER TABLE dbo.UserSession
ADD CONSTRAINT PK_UserSession PRIMARY KEY NONCLUSTERED (SessionId);
GO
Contoh berikut menghapus indeks.
ALTER TABLE Sales.SalesOrderDetail_inmem
DROP INDEX ix_ModifiedDate;
GO
Contoh berikut menambahkan indeks.
ALTER TABLE Sales.SalesOrderDetail_inmem
ADD INDEX ix_ModifiedDate (ModifiedDate);
GO
Contoh berikut menambahkan beberapa kolom, dengan indeks dan batasan.
ALTER TABLE Sales.SalesOrderDetail_inmem
ADD CustomerID int NOT NULL DEFAULT -1 WITH VALUES,
ShipMethodID int NOT NULL DEFAULT -1 WITH VALUES,
INDEX ix_Customer (CustomerID);
GO