Indeks pada kolom komputasi

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure 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 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 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 IsPreciseCOLUMNPROPERTY 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 ke ON saat CREATE TABLE pernyataan atau ALTER TABLE yang menentukan kolom komputasi dijalankan. Fungsi OBJECTPROPERTY melaporkan apakah opsi aktif melalui IsAnsiNullsOn properti .

  • Koneksi tempat indeks dibuat, dan semua koneksi yang mencoba INSERT, , UPDATEatau DELETE pernyataan yang akan mengubah nilai dalam indeks, harus memiliki enam SET opsi yang diatur ke ON dan satu opsi diatur ke OFF. Pengoptimal mengabaikan indeks pada kolom komputasi untuk pernyataan apa pun SELECT yang dijalankan oleh koneksi yang tidak memiliki pengaturan opsi yang sama ini.

    Opsi NUMERIC_ROUNDABORT harus diatur ke OFF, dan opsi berikut harus diatur ke ON:

    • 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.

Langkah berikutnya