SQL Server'da Hesaplanan Sütunlarla garip davranış


12

70-433 sınav kitabımı okurken, çalışmadığını görebildiğim bir şey düşündüm, ama işe yaradığına inanıyorum. Passage şöyle bir şey okudu:

Sütun da PERSISTED olarak işaretlenmelidir ; bu, SQL Server'ın hesaplanan sütunun ifadesinin sonucunu, her sorguda başvurulduğunda hesaplamak yerine veri satırında fiziksel olarak depoladığı anlamına gelir.

Bundan iki şeyi anlıyorum:

  1. Bir kalıcı olmayan hesaplanan sütun bir sorgu başvurulan, her zaman hesaplanır
  2. Hesaplanan sütun için hiçbir şey saklanmadığından, sütun için hiçbir dizin oluşturulamayacağını varsayıyorum.

Okuduktan sonra, önceki bir projede kalıcı olmayan bir sütun üzerinde bir dizin oluşturmayı başardığım için bunun biraz garip olduğunu düşündüm.

Kalıcı olmayan bir şey için bir indeks nasıl oluşturulabilir ve bu uzun vadede zararlı mıdır?


Bunu kanıtlamak için aşağıdaki SQL deyimini çalıştırdım:

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);

Ve sonra aşağıdaki sorguları çalıştırın:

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

Yukarıdaki kod için sorgu planına baktıktan sonra, her iki seçme sorguları kalıcı olmayan dizini kullandığını görebilirsiniz. Yine nasıl?

resim açıklamasını buraya girin


70-433 kitabı olanlar için alıntılanan metinler sayfa 111'in en üstünde yer alır.
Stuart Blackler

Yanıtlar:


9

Hesaplanan sütun için hiçbir şey saklanmadığından, sütun için dizin oluşturulamayacağını varsayıyorum.

Bu varsayım doğru değildir - her iki tür de endekslenebilir . Hesaplanan sütun her iki durumda da deterministik olmalıdır , ancak hesaplanan sütun devam ettiğinde, hesaplamanın da kesin olması şartı rahatlatılır (yani kayan nokta işlemlerini içerebilir).

Kalıcı olmayan bir şey için bir indeks nasıl oluşturulabilir ve bu uzun vadede zararlı mıdır?

Her iki durumda da işlevin sonucu dizinde 'kalıcı' olur - tek fark, tabloda kalıcı olup olmadığıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.