Indeks pada kolom komputasi

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Anda dapat menentukan indeks pada kolom komputasi selama persyaratan berikut terpenuhi:

  • Persyaratan kepemilikan
  • Persyaratan determinisme
  • Persyaratan presisi
  • Persyaratan jenis data
  • SET persyaratan opsi

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. Properti IsDeterministic dari fungsi COLUMNPROPERTY melaporkan apakah computed_column_expression bersifat 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 untuk kolom terhitung yang dipersistenkan di bagian akhir 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 presisi. Sebuah computed_column_expression bersifat presisi jika satu atau beberapa kondisi berikut ini benar:

  • Ini bukan ekspresi dari tipe data float atau real.

  • 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. Setiap fungsi, ekspresi, atau fungsi yang ditentukan pengguna dianggap tidak presisi jika mengandung ekspresi float atau real. Ini termasuk yang logis (perbandingan).

Properti IsPrecise dari fungsi COLUMNPROPERTY menunjukkan apakah computed_column_expression bersifat presisi.

Persyaratan jenis data

  • computed_column_expression yang ditentukan untuk kolom terhitung tidak dapat menghasilkan jenis data text, ntext, atau image.
  • 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.

SET persyaratan opsi

  • 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 yang digunakan untuk membuat indeks, dan semua koneksi yang mencoba menjalankan pernyataan INSERT, UPDATE, atau DELETE yang akan mengubah nilai dalam indeks tersebut, harus memiliki enam opsi SET yang diatur ke ON dan satu opsi yang 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 terhitung yang didefinisikan oleh ekspresi yang deterministik tetapi tidak presisi. Anda dapat melakukan ini saat kolom ditandai PERSISTED dalam pernyataan CREATE TABLE 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