Perilaku aneh dengan Kolom yang Dihitung dalam SQL-Server

12

Sementara membaca buku ujian 70-433 saya, saya memikirkan sesuatu yang saya lihat tidak berfungsi, namun saya yakin itu berhasil. Bagian itu berbunyi seperti:

Kolom juga harus ditandai sebagai PERSISTED , yang berarti bahwa SQL Server secara fisik menyimpan hasil ekspresi kolom yang dihitung dalam baris data alih-alih menghitungnya setiap kali direferensikan dalam kueri.

Dari sini saya mengerti dua hal:

  1. Sebuah non-tetap ngotot kolom dihitung dihitung setiap kali bahwa itu dirujuk dalam query
  2. Karena tidak ada yang disimpan untuk kolom yang dihitung, saya berasumsi tidak ada indeks yang dapat dibuat untuk kolom tersebut.

Setelah membacanya, saya pikir ini agak aneh karena saya berhasil membuat indeks pada kolom yang tidak ada di proyek sebelumnya.

Bagaimana indeks dapat dibuat untuk sesuatu yang tidak bertahan dan apakah ini merugikan dalam jangka panjang?


Untuk membuktikan ini, saya telah menjalankan pernyataan SQL berikut:

CREATE TABLE testTable
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    telephone VARCHAR(14),
    c_areaCode AS (SUBSTRING(telephone,0,5)),
    cp_areaCode AS (SUBSTRING(telephone,0,5)) PERSISTED
)

INSERT INTO testTable VALUES('09823 000000');
INSERT INTO testTable VALUES('09824 000000');
INSERT INTO testTable VALUES('09825 000000');

CREATE NONCLUSTERED INDEX IX_NotPersisted ON testTable(c_areaCode);
CREATE NONCLUSTERED INDEX IX_Persisted ON testTable(cp_areaCode);

Dan kemudian jalankan kueri berikut:

DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;

Setelah melihat rencana permintaan untuk kode di atas, saya dapat melihat bahwa kedua kueri pemilihan menggunakan indeks non-persisten. Lagi bagaimana?

masukkan deskripsi gambar di sini

Stuart Blackler
sumber
Bagi mereka yang memiliki buku 70-433, teks yang dikutip ada di bagian atas halaman 111.
Stuart Blackler

Jawaban:

9

2.Karena tidak ada yang disimpan untuk kolom yang dihitung, saya menganggap tidak ada indeks yang dapat dibuat untuk kolom tersebut.

Asumsi ini tidak benar - jenis apa pun dapat diindeks . Kolom yang dihitung harus deterministik dalam kedua kasus tersebut tetapi ketika kolom yang dikomputasi tetap ada, persyaratan bahwa perhitungannya juga tepat adalah santai (yaitu dapat melibatkan operasi titik mengambang).

Bagaimana indeks dapat dibuat untuk sesuatu yang tidak bertahan dan apakah ini merugikan dalam jangka panjang?

Hasil dari fungsi ini 'bertahan' dalam indeks dalam kedua kasus - satu-satunya perbedaan adalah apakah itu tetap ada dalam tabel.

Jack mengatakan coba topanswers.xyz
sumber