Чому підказка READPAST викликає ігнорування індексованих поглядів?


10

Я розслідую, використовуючи READPASTпідказку, щоб зменшити блокування ресурсів у фінансовій підсистемі нашого додатка.

Здавалося, це вдалий шлях, оскільки записи про фінансові операції додаються лише ніколи, ніколи не оновлюються та не видаляються. Єдині рядки, які коли-небудь можна було б пропустити, - це абсолютно нові рядки, вставлені всередину транзакції; вони фактично не існують у зовнішньому світі, поки транзакція не буде здійснена.

Однак я помітив гіршу ефективність у запитах, що використовують індексовані види, на які я READPASTпідказав. Порівнюючи плани запитів, це виглядає як із підказкою, оптимізатор запитів вирішує не використовувати індексований вигляд, а замість цього переходить до трактування його як до звичайного перегляду.

Я не впевнений, чому це було б; Я уявляю, що індексовані види виглядають так само, як і будь-який інший індекс у тому, що ключі можуть бути заблоковані під час операцій, а додавання READPASTпрацюватиме аналогічно.

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa WITH (READPAST)
WHERE isa.TotalOwedAmount = 0.0

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

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa
WHERE isa.TotalOwedAmount = 0.0

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

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

Відповіді:


7

Повторне використання прикладної таблиці та індексованого перегляду з моєї статті Ще одна причина використання NOEXPANDпідказок у Enterprise Edition :

CREATE TABLE dbo.T
(
    col1 integer NOT NULL
);
GO
INSERT dbo.T WITH (TABLOCKX)
    (col1)
SELECT 
    SV.number
FROM master.dbo.spt_values AS SV
WHERE 
    SV.type = N'P';
GO
CREATE VIEW dbo.VT
WITH SCHEMABINDING
AS
SELECT T.col1 
FROM dbo.T AS T;

Репро

Цей запит відповідає індексованому виду (хоча і із надлишковою сукупністю):

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT;

Індексований вигляд збігається

Додавання READPASTпідказок призводить до доступу до базової таблиці:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

Індексований вигляд не збігається

Пояснення

READPASTНатяк семантичний впливає. Оптимізатор чинить опір перезапису запитів таким чином, що результати змінюються. Проілюструвати:

Наступний запит виконується без проблем:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

Однак:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST)
OPTION 
    (TABLE HINT (VT, FORCESCAN));

Виводить помилку:

Повідомлення 8722, рівень 16, стан 1, рядок 42
Неможливо виконати запит.
Семантичний вплив, що впливає на підказку "readpast", з'являється в пункті "WITH" об'єкта "VT"
але не у відповідному пункті "ТАБЛИЧНА ПОДАКА".
Змініть пункт OPTION (ТАБЛИЧНІ ПІДКРИТКИ ...) таким чином, що впливає на семантичні підказки
відповідність пункту З.

Коли ви посилаєтесь на індексований вигляд без NOEXPANDпідказки, подання розширюється (перед початком компіляції та оптимізації) для посилання на базові об'єкти. Пізніше в процесі оптимізатор може повністю або частково розглянути питання про відповідність дерева запитів індексованому виду.

Якщо READPASTвикористовується без NOEXPAND, підказка поширюється на базову таблицю, запобігаючи збігу перегляду (різної семантики).

З NOEXPAND, натяк стосується прямого перегляду, тому проблем немає.

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