Indeks pada Kolom Komputasi
Anda dapat menentukan indeks pada kolom komputasi selama persyaratan berikut terpenuhi:
Persyaratan kepemilikan
Persyaratan determinisme
Persyaratan presisi
Persyaratan jenis data
Persyaratan opsi SET
Persyaratan Kepemilikan
Semua referensi fungsi dalam kolom komputasi harus memiliki pemilik yang sama dengan tabel.
Persyaratan Determinisme
Penting
Ekspresi bersifat deterministik jika selalu mengembalikan hasil yang sama untuk serangkaian input tertentu. Properti IsDeterministic dari fungsi COLUMNPROPERTY melaporkan apakah computed_column_expression deterministik.
Computed_column_expression harus deterministik. Computed_column_expression deterministik ketika satu atau beberapa hal berikut ini benar:
Semua fungsi yang direferensikan oleh ekspresi adalah 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 TETAP ADA. Untuk informasi selengkapnya, lihat Membuat Indeks pada Kolom Komputasi Yang Dipertahankan nanti dalam topik 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 atau AVG 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 User-Defined CLR.
Catatan
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. Ekspresi yang melibatkan konversi implisit string karakter ke jenis data tanggal dianggap nondeterministik, kecuali tingkat kompatibilitas database diatur ke 80 atau yang lebih lama. Ini karena hasilnya bergantung pada pengaturan LANGUAGE dan DATEFORMAT dari sesi server. Misalnya, hasil ekspresi CONVERT (datetime, '30 listopad 1996', 113)
bergantung pada pengaturan BAHASA karena string '30 listopad 1996
' berarti bulan yang berbeda dalam bahasa yang berbeda. Demikian pula, dalam ekspresi DATEADD(mm,3,'2000-12-01')
, Mesin Database menginterpretasikan string '2000-12-01'
berdasarkan pengaturan DATEFORMAT.
Konversi implisit data karakter non-Unicode antara kolase juga dianggap nondeterministik, kecuali tingkat kompatibilitas diatur ke 80 atau lebih lama.
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 hingga konversi tanggal, untuk menghindari kemungkinan kerusakan indeks, pastikan pengaturan LANGUAGE dan DATEFORMAT konsisten dalam database dan aplikasi Anda.
Persyaratan Presisi
Computed_column_expression harus tepat. Computed_column_expression tepat ketika satu atau beberapa hal berikut ini benar:
Ini bukan ekspresi dari
float
jenis data ataureal
.Ini tidak menggunakan
float
jenis data ataureal
dalam definisinya. Misalnya, dalam pernyataan berikut, kolomy
adalahint
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
Ekspresi atau real
apa pun float
dianggap tidak tepat dan tidak dapat menjadi kunci indeks; float
ekspresi atau real
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 ekspresi atau real
apa punfloat
. Ini termasuk yang logis (perbandingan).
Properti IsPrecise dari fungsi COLUMNPROPERTY melaporkan apakah computed_column_expression tepat.
Persyaratan Jenis Data
computed_column_expression yang ditentukan untuk kolom komputasi tidak dapat dievaluasi ke
text
jenis data ,ntext
, atauimage
.Kolom komputasi yang berasal dari
image
jenis data , ,ntext
,varchar(max)
text
,nvarchar(max)
,varbinary(max)
, danxml
dapat diindeks selama jenis data kolom komputasi diizinkan sebagai kolom kunci indeks.Kolom komputasi yang berasal dari
image
jenis data , ,ntext
dantext
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 tingkat koneksi ANSI_NULLS harus diatur ke AKTIF saat pernyataan CREATE TABLE atau ALTER TABLE yang menentukan kolom komputasi dijalankan. Fungsi OBJECTPROPERTY melaporkan apakah opsi aktif melalui properti IsAnsiNullsOn .
Koneksi tempat indeks dibuat, dan semua koneksi yang mencoba pernyataan INSERT, UPDATE, atau DELETE yang akan mengubah nilai dalam indeks, harus memiliki enam opsi SET yang diatur ke AKTIF dan satu opsi diatur ke NONAKTIF. Pengoptimal mengabaikan indeks pada kolom komputasi untuk pernyataan SELECT apa pun yang dijalankan oleh koneksi yang tidak memiliki pengaturan opsi yang sama ini.
Opsi NUMERIC_ROUNDABORT harus diatur ke NONAKTIF, dan opsi berikut harus diatur ke AKTIF:
ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
Mengatur ANSI_WARNINGS ke AKTIF secara implisit mengatur ARITHABORT ke AKTIF saat tingkat kompatibilitas database diatur ke 90 atau lebih tinggi.
Membuat Indeks pada Kolom Komputasi Yang Dipertahankan
Anda dapat membuat indeks pada kolom komputasi yang ditentukan dengan deterministik, tetapi tidak tepat, ekspresi jika kolom ditandai PERSISTED dalam pernyataan CREATE TABLE atau ALTER TABLE. Ini berarti bahwa Mesin Database menggunakan nilai yang bertahan ini saat membuat indeks pada kolom, dan ketika indeks dirujuk dalam kueri. Opsi ini memungkinkan Anda membuat indeks pada kolom komputasi saat .NET Framework, adalah deterministik dan tepat.