Дивна поведінка з обчислюваними стовпцями в SQL-сервері


12

Поки читав мою книгу іспитів 70-433, я подумав про те, що я можу побачити, що це не працює, але я вважаю, що це робить. Уривок читав щось на кшталт:

Стовпець також повинен бути позначений як ПЕРСИСТИЧНИЙ , що означає, що SQL Server фізично зберігає результат вираженого обчисленого стовпця в рядку даних, а не обчислює його щоразу, коли на нього посилається запит.

З цього я розумію дві речі:

  1. Ні-і бунтувалися обчислюваний стовпець обчислюється кожного разу, коли він посилається в запиті
  2. Оскільки для обчисленого стовпця нічого не зберігається, я припускаю, що жоден індекс не може бути створений для стовпця.

Прочитавши це, я подумав, що це було трохи дивно, оскільки мені вдалося створити індекс на непостійній колонці в попередньому проекті.

Як можна створити індекс для того, що не зберігається, і чи це це згубно в перспективі?


Щоб довести це, я запустив наступний оператор 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);

А потім запустіть такі запити:

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

Переглянувши план запитів вищевказаного коду, я можу побачити, що обидва обрані запити використовують неперсистуючий індекс. Знову, як?

введіть тут опис зображення


Для тих, хто має книгу 70-433, текст цитується вгорі сторінки 111.
Стюарт Блеклер

Відповіді:


9

2. Оскільки для обчислюваного стовпця нічого не зберігається, я припускаю, що індекс не може бути створений для стовпця.

Це припущення не вірно - індексувати можна будь-який вид . Обчислений стовпець повинен бути детермінованим в будь-якому випадку, але коли обчислюваний стовпчик зберігається, вимога, щоб обчислення було також точним , послаблюється (тобто воно може включати операції з плаваючою точкою).

Як можна створити індекс для того, що не зберігається, і чи це це згубно в перспективі?

Результат функції "зберігається" в індексі в будь-якому випадку - різниця лише в тому, чи зберігається вона в таблиці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.