Bagikan melalui


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 atau real .

  • Ini tidak menggunakan float jenis data atau real dalam definisinya. Misalnya, dalam pernyataan berikut, kolom y adalah 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

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 textjenis data , ntext, atau image .

  • Kolom komputasi yang berasal dari imagejenis data , , ntext, varchar(max)text, nvarchar(max), varbinary(max), dan xml dapat diindeks selama jenis data kolom komputasi diizinkan sebagai kolom kunci indeks.

  • Kolom komputasi yang berasal dari imagejenis data , , ntextdan text 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.

COLUMNPROPERTY (Transact-SQL)