2017-03-02 5 views
0

약 4 천만 개의 행이있는 테이블이 있습니다. 이 테이블은 힙이며 여러 개의 클러스터되지 않은 인덱스가 있습니다. 나는 항상 1 행에 오직 하나의 forward fetch만을 가질 수 있다고 생각했다.힙 테이블의 전달 된 페치

현재 성능 문제를 진단하기 위해 Brent Ozar의 sp_blitzindex을 실행했습니다.

sp_blitzindex에 따르면이 힙에는 50 억 개가 넘는 전달 된 페치 (...)가 있습니다.

누구나 가능할 수 있습니까? 나는 어떤 디자인 고려 사항도 찾고 있지 않다. 어떻게 작동하는지에 대한 설명이다. 고마워요! 감사합니다, SQL_M.

+0

에 지금은 삭제 된 대답하여 소스로 사용되는 물품되어 있지 시작하는 나쁜 장소를 얻을 수 removal-forwarded-records-heap-tables - 행의 각 가변 길이 열에는 forward fetch가있을 수 있습니다. –

+0

감사합니다. 에드, 나는이 기사를 읽을 것이다. –

답변

1

논리적 인 단편화.

한 번에 : 행 1은 행 2 옆에 있었고, 행 3은 같은 페이지에서 옆에있었습니다. 초기 삽입시 발생했을 수 있습니다.

시간이 지남에 따라 행 2가 업데이트되었습니다 (varchar 열이 저장된 문자 수로 두 배가되었다고 가정 해 봅시다). 2 번 줄은 39,999,998 줄이 "약간 아래로"이동하는 것을 피하기 위해 새로운 페이지로 이동되었습니다.

이에 대응하기 위해, 포인터는 행이 새로운 위치로 행 1에서 생성 한 후, 다시의 데이터를 조각 모음 할 수있는 방법을 의미없는 클러스터 된 인덱스와 3

반복 만 40 행을 행하기 http://sqlmag.com/stored-procedures/ - 디스크, 당신은 쉽게 50 억

I para-phrased Brent

+0

답변 해 주셔서 감사합니다. –