SQL Server 2017에서 SNAPSHOT_MATERIALIZATION으로 뷰를 어떻게 만듭니 까?


36

SQL Server 2017에는 몇 가지 새로운 저장 프로 시저가 있습니다.

  • sp_refresh_single_snapshot_view – @view_name nvarchar (261)의 입력 매개 변수, @rgCode int
  • sp_refresh_snapshot_views – @rgCode int의 입력 매개 변수

sys.messages의 새로운 항목 :

  • 10149 – 뷰 정의에 메모리 최적화 테이블이 포함되어 있으므로 뷰 '%. * ls'에서 SNAPSHOT_MATERIALIZATION이있는 인덱스를 만들 수 없습니다.
  • 10642 – SNAPSHOT_MATERIALIZATION은 '%. * ls'의 인덱스 '%. * ls'에 대해 뷰의 인덱스에만 적용 할 수 있으므로 설정할 수 없습니다.
  • 10643 – SNAPSHOT_MATERIALIZATION은 '%. * ls'의 '%. * ls'에 대해 뷰의 클러스터 된 인덱스에만 적용 할 수 있으므로 설정할 수 없습니다.
  • 10648 – '%. * ls'의 분할 된 인덱스 '%. * ls'에 SNAPSHOT_MATERIALIZATION을 설정할 수 없습니다.
  • 10649 – SNAPSHOT_MATERIALIZATION으로 클러스터 된 인덱스 '%. * ls'이 (가)있는 '%. * ls'에 클러스터되지 않은 인덱스 '%. * ls'을 (를) 만들 수 없습니다.
  • 10650 – 스냅 샷보기를 새로 고치려면 데이터베이스에서 스냅 샷 격리를 활성화해야합니다.
  • 3760 – SNAPSHOT_MATERIALIZATION이있는 뷰 '%. * ls'에서 인덱스 '%. * ls'을 (를) 삭제할 수 없습니다.
  • 4524 – 뷰 '%. * ls'에 스냅 숏 구체화가 있으므로 변경할 수 없습니다.
  • 4525 – 뷰를 새로 고치기 전에 스냅 숏 구체화가있는 뷰 '%. * ls'에서 힌트 '% ls'을 (를) 사용할 수 없습니다.

새로운 확장 이벤트 :

스냅 샷보기 확장 이벤트

그렇다면 어떻게 스냅 샷으로 구체화 된 뷰를 만들 수 있습니까? (마이크로 소프트는 아직 문서화하지 않았다.) 여기 까지 내가 시도해 보지 못한 것들이있다 .

답변:


55

당신은 할 수 없습니다. 이 기능은 2017 RTM에서 비활성화되어 있습니다.


즉, 당신은 할 수 ...

AdventureWorks 사용 :

CREATE VIEW dbo.TH
WITH SCHEMABINDING
AS
SELECT P.ProductID, COUNT_BIG(*) AS cbs
FROM Production.Product AS P
JOIN Production.TransactionHistory AS TH
    ON TH.ProductID = P.ProductID
GROUP BY P.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);

기본 테이블에 대한 변경 내용은 뷰에 즉시 반영되지 않습니다 (일반적으로 SQL Server의 경우). 마찬가지로 기본 테이블에 대한 데이터 수정은 스냅 샷 인덱싱 된 뷰를 유지할 필요가 없습니다.

뷰 내용을 새로 고치려면 새로운 저장 프로 시저 중 하나를 호출해야합니다.

EXECUTE sys.sp_refresh_single_snapshot_view
    @view_name = N'dbo.TH',
    @rgCode = 0; -- don't know what this is for yet

실행 계획이 생성됩니다.

계획

문서화되지 않은 추적 플래그가 필요하거나 내가 한 특히 불쾌한 작업을 수행해야하기 때문에이 기능이 작동하지 않을 수 있습니다 (디버거를 사용하여 기능 플래그를 보유하는 메모리 위치에 쓰기).

궁금한 경우 기능 플래그는의 바이트 sqllang!g_featureSwitchesLangSvc+0x10f입니다. 동안 점검됩니다 sqllang!SpRefreshSingleSnapshotView.

실행하고 SQL Server 코드가 실행되는 동안 해킹의 결과를 받아들이고 Microsoft가 아직 준비하지 않은 기능을 사용할 준비가 되었으면 다음과 같이하십시오.

  1. 디버거를 SQL Server 2017 프로세스에 연결하십시오. WinDbg를 사용합니다.
  2. 중단 점을 설정하십시오.

    bp sqllang!SpRefreshSingleSnapshotView
  3. Go 명령을 사용하여 SQL Server 다시 시작 ( g)

  4. 고유 클러스터형 인덱스가 아닌 위의 뷰를 작성하십시오.
  5. sys.sp_refresh_single_snapshot_view위 의 명령을 실행
  6. 중단 점에 도달하면 코드 행이 표시 될 때까지 단계별로 진행하십시오.

    cmp byte ptr [sqllang!g_featureSwitchesLangSvc+0x10f (00007fff`328dfbcf)],0

    다른 빌드에서는 오프셋이 다를 수 있습니다 (예 : 2017 RTM CU3). sqllang!g_featureSwitchesLangSvc+0x114

  7. 괄호 안의 메모리 주소가 다를 수 있습니다. 당신이 보는 것을 사용하십시오.

  8. display memory 명령을 사용하여 찾은 메모리 주소의 현재 값을 확인하십시오.

    db 00007fff`328dfbcf L1
  9. 기능이 비활성화되었음을 나타내는 0이 표시되어야합니다.

  10. enter values ​​명령을 사용하여 메모리 주소와 함께 0을 1로 변경하십시오.

    eb 00007fff`328dfbcf 1
  11. 중단 점을 비활성화하고 SQL Server 실행을 재개하십시오.

  12. 이제 기능이 활성화되었습니다.
  13. 뷰에서 고유 한 클러스터형 인덱스를 작성하십시오.
  14. 놀아

참고 SNAPSHOT_MATERIALIZATION로 색인화 할 수없는 쿼리 사양의 스냅 샷을 구체화 할 수 있습니다 (예 MAX: 아래 사용) .

CREATE VIEW dbo.TH2
WITH SCHEMABINDING
AS
SELECT TH.ProductID, MaxTransactionID = MAX(TH.TransactionID)
FROM Production.TransactionHistory AS TH
GROUP BY TH.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH2 (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);

결과:

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