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

필자의 기사 에서 Enterprise Edition의 힌트 를 사용하는 또 다른 이유NOEXPAND :

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'는 개체 'VT'의 'WITH'절에 나타납니다.
해당 'TABLE HINT'절에는 없습니다.
의미에 영향을주는 힌트를 제공하도록 OPTION (TABLE HINTS ...) 절을 변경하십시오.
WITH 절과 일치하십시오.

NOEXPAND힌트 없이 인덱싱 된 뷰를 참조하면 뷰가 확장되어 (컴파일 및 최적화가 시작되기 전에) 기본 개체를 참조합니다. 프로세스 후반에 옵티마이 저는 쿼리 트리를 전체 또는 부분적으로 인덱싱 된 뷰와 다시 일치시키는 것을 고려할 수 있습니다.

경우 READPAST없이 사용 NOEXPAND힌트는 전파 뷰 매칭 (다른 의미)을 방지 기본 테이블.

를 사용 NOEXPAND하면 힌트가 뷰에 직접 적용되므로 문제가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.