Indeks pada kolom komputasi
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Anda dapat menentukan indeks pada kolom komputasi selama persyaratan berikut terpenuhi:
- Persyaratan kepemilikan
- Persyaratan determinisme
- Persyaratan presisi
- Persyaratan jenis data
- Persyaratan opsi SET
Catatan
SET QUOTED_IDENTIFIER
harus ON
ketika Anda membuat atau mengubah indeks pada kolom komputasi atau tampilan terindeks. Untuk informasi selengkapnya, lihat SET QUOTED_IDENTIFIER (Transact-SQL).
Persyaratan kepemilikan
Semua referensi fungsi dalam kolom komputasi harus memiliki pemilik yang sama dengan tabel.
Persyaratan determinisme
Ekspresi bersifat deterministik jika selalu mengembalikan hasil yang sama untuk serangkaian input tertentu. IsDeterministic
Properti fungsi COLUMNPROPERTY melaporkan apakah computed_column_expression deterministik.
Computed_column_expression harus deterministik. Computed_column_expression deterministik ketika semua hal berikut ini benar:
Semua fungsi yang direferensikan oleh ekspresi bersifat deterministik dan tepat. Fungsi-fungsi ini mencakup fungsi yang ditentukan pengguna dan bawaan. Untuk informasi selengkapnya, lihat Fungsi Deterministik dan Nondeterministik. Fungsi mungkin tidak tepat jika kolom komputasi adalah
PERSISTED
. Untuk informasi selengkapnya, lihat Membuat indeks pada kolom komputasi yang dipertahankan terlambat di artikel ini.Semua kolom yang direferensikan dalam ekspresi berasal dari tabel yang berisi kolom komputasi.
Tidak ada referensi kolom yang menarik data dari beberapa baris. Misalnya, fungsi agregat seperti
SUM
atauAVG
bergantung pada data dari beberapa baris dan akan membuat computed_column_expression nondeterministik.computed_column_expression tidak memiliki akses data sistem atau akses data pengguna.
Setiap kolom komputasi yang berisi ekspresi runtime bahasa umum (CLR) harus deterministik dan ditandai PERSISTED
sebelum kolom dapat diindeks. Ekspresi jenis yang ditentukan pengguna CLR diizinkan dalam definisi kolom komputasi. Kolom komputasi yang jenisnya adalah jenis yang ditentukan pengguna CLR dapat diindeks selama jenisnya sebanding. Untuk informasi selengkapnya, lihat Jenis yang Ditentukan Pengguna CLR.
CAST dan CONVERT
Saat Anda merujuk ke literal string dari jenis data tanggal dalam kolom komputasi terindeks di SQL Server, kami sarankan Anda secara eksplisit mengonversi literal ke jenis tanggal yang Anda inginkan dengan menggunakan gaya format tanggal deterministik. Untuk daftar gaya format tanggal yang deterministik, lihat CAST dan CONVERT.
Untuk informasi selengkapnya, lihat Konversi nondeterministik string tanggal harfiah menjadi nilai DATE.
Tingkat kompatibilitas
Konversi implisit data karakter non-Unicode antara kolase dianggap tidak deterministik, kecuali tingkat kompatibilitas diatur ke 80
atau sebelumnya.
Saat pengaturan tingkat kompatibilitas database adalah 90
, Anda tidak dapat membuat indeks pada kolom komputasi yang berisi ekspresi ini. Namun, kolom komputasi yang ada yang berisi ekspresi ini dari database yang ditingkatkan dapat dipertahankan. Jika Anda menggunakan kolom komputasi terindeks yang berisi string implisit ke konversi tanggal, untuk menghindari kemungkinan kerusakan indeks, pastikan pengaturan LANGUAGE
dan DATEFORMAT
konsisten dalam database dan aplikasi Anda.
Tingkat 90
kompatibilitas sesuai dengan SQL Server 2005 (9.x).
Persyaratan presisi
Computed_column_expression harus tepat. Computed_column_expression tepat ketika satu atau beberapa hal berikut ini benar:
Ini bukan ekspresi jenis data float atau nyata .
Ini tidak menggunakan jenis data float atau nyata dalam definisinya. Misalnya, dalam pernyataan berikut, kolom
y
bersifat int dan deterministik tetapi tidak tepat.CREATE TABLE t2 (a int, b int, c int, x float, y AS CASE x WHEN 0 THEN a WHEN 1 THEN b ELSE c END);
Catatan
Setiap float atau ekspresi nyata dianggap tidak tepat dan tidak dapat menjadi kunci indeks; float atau ekspresi nyata dapat digunakan dalam tampilan terindeks tetapi bukan sebagai kunci. Ini berlaku juga untuk kolom komputasi. Fungsi, ekspresi, atau fungsi yang ditentukan pengguna dianggap tidak tepat jika berisi float atau ekspresi nyata . Ini termasuk yang logis (perbandingan).
Properti IsPrecise
COLUMNPROPERTY
fungsi melaporkan apakah computed_column_expression tepat.
Persyaratan jenis data
- computed_column_expression yang ditentukan untuk kolom komputasi tidak dapat mengevaluasi ke jenis data teks, ntext, atau gambar.
- Kolom komputasi yang berasal dari tipe data gambar, ntext, teks, varchar(max), nvarchar(max), varbinary(max), dan xml dapat diindeks selama jenis data kolom komputasi diizinkan sebagai kolom kunci indeks.
- Kolom komputasi yang berasal dari tipe data gambar, ntext, dan teks dapat berupa kolom non-kunci (disertakan) dalam indeks non-kluster selama jenis data kolom komputasi diizinkan sebagai kolom indeks non-kunci.
Persyaratan opsi SET
Opsi
ANSI_NULLS
tingkat koneksi harus diatur keON
saatCREATE TABLE
pernyataan atauALTER TABLE
yang menentukan kolom komputasi dijalankan. Fungsi OBJECTPROPERTY melaporkan apakah opsi aktif melaluiIsAnsiNullsOn
properti .Koneksi tempat indeks dibuat, dan semua koneksi yang mencoba
INSERT
, ,UPDATE
atauDELETE
pernyataan yang akan mengubah nilai dalam indeks, harus memiliki enamSET
opsi yang diatur keON
dan satu opsi diatur keOFF
. Pengoptimal mengabaikan indeks pada kolom komputasi untuk pernyataan apa punSELECT
yang dijalankan oleh koneksi yang tidak memiliki pengaturan opsi yang sama ini.Opsi
NUMERIC_ROUNDABORT
harus diatur keOFF
, dan opsi berikut harus diatur keON
:ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
Catatan
Pengaturan ANSI_WARNINGS
untuk ON
mengatur secara implisit ARITHABORT
ke ON
saat tingkat kompatibilitas database diatur ke 90
atau lebih tinggi.
Membuat indeks pada kolom komputasi yang dipertahankan
Terkadang Anda dapat membuat kolom komputasi yang ditentukan dengan ekspresi yang deterministik namun tidak tepat. Anda dapat melakukan ini saat kolom ditandai PERSISTED
dalam CREATE TABLE
pernyataan atau ALTER TABLE
.
Ini berarti bahwa Mesin Database menyimpan nilai komputasi dalam tabel, dan memperbaruinya ketika kolom lain tempat kolom komputasi bergantung diperbarui. Mesin Database menggunakan nilai yang dipertahankan ini saat membuat indeks pada kolom, dan ketika indeks dirujuk dalam kueri.
Opsi ini memungkinkan Anda membuat indeks pada kolom komputasi ketika Mesin Database tidak dapat membuktikan dengan akurasi apakah fungsi yang mengembalikan ekspresi kolom komputasi, terutama fungsi CLR yang dibuat dalam .NET Framework, adalah deterministik dan tepat.
Catatan
Anda tidak dapat membuat indeks yang difilter pada kolom komputasi.