Dziwne zachowanie z kolumnami obliczeniowymi w serwerze SQL


12

Czytając książkę do egzaminu 70-433, pomyślałem o czymś, co nie działa, ale wierzę, że tak. Fragment brzmiał mniej więcej tak:

Kolumna musi być również oznaczona jako PERSISTED , co oznacza, że ​​SQL Server fizycznie przechowuje wynik wyrażenia kolumny obliczeniowej w wierszu danych, zamiast obliczać go za każdym razem, gdy odwołuje się do niego w zapytaniu.

Z tego rozumiem dwie rzeczy:

  1. Nie utrzymywały kolumna obliczana jest obliczany za każdym razem, że jest on wymieniony w zapytaniu
  2. Ponieważ nic nie jest przechowywane dla kolumny obliczanej, zakładam, że nie można utworzyć indeksu dla kolumny.

Po przeczytaniu pomyślałem, że to trochę dziwne, ponieważ udało mi się utworzyć indeks na nietrwałej kolumnie w poprzednim projekcie.

Jak można utworzyć indeks dla czegoś, co nie zostanie utrwalone i czy na dłuższą metę jest to szkodliwe?


Aby to udowodnić, uruchomiłem następującą instrukcję SQL:

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

A następnie uruchom następujące zapytania:

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

Po zapoznaniu się z planem zapytań dla powyższego kodu widzę, że oba wybrane zapytania używają nietrwałego indeksu. Znowu jak?

wprowadź opis zdjęcia tutaj


Dla tych, którzy mają książkę 70-433, cytowany tekst znajduje się na górze strony 111.
Stuart Blackler

Odpowiedzi:


9

2. Ponieważ nic nie jest przechowywane dla kolumny obliczanej, zakładam, że nie można utworzyć indeksu dla kolumny.

To założenie nie jest prawdziwe - każdy z nich może być indeksowany . Obliczona kolumna musi być deterministyczna w obu przypadkach, ale gdy kolumna obliczeniowa zostanie utrwalona, ​​wymóg, aby obliczenia również były precyzyjne, został złagodzony (tzn. Może obejmować operacje zmiennoprzecinkowe).

Jak można utworzyć indeks dla czegoś, co nie zostanie utrwalone i czy na dłuższą metę jest to szkodliwe?

Wynik funkcji jest „utrwalany” w indeksie w obu przypadkach - jedyną różnicą jest to, czy jest on utrwalany w tabeli.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.