-
Q-01이 secondary index와 clustered row를 함께 읽는 이유
active command · Q-01 definition
Q-01 · reference-context · native plan · reference-context
현재 command는 Q-01 definition입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
tenant_id = 7과 state = 'READY'가 idx_tenant_state_order의 앞 두 key part를 고정합니다. entry 101은 PK 101을 운반하지만 amount_cents=1200은 index에 없으므로 clustered row에서 읽습니다. 첫 row set은 101, 102, 103, 105입니다.
Model · not-created · none Visible result · not-run · 0 rows
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-serverevidence:mvcc-consistent-read-captured-transaction-connections-readyevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A가 REPEATABLE READ read-only transaction을 시작
active command · A START TRANSACTION READ ONLY
Q-01 · reference-context · native plan · reference-context
현재 command는 A START TRANSACTION READ ONLY입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
A(connection 12)는 START TRANSACTION READ ONLY를 실행했지만 A1은 아직 실행하지 않았습니다. row 101의 amount_cents=1200은 fixture에 존재하나, A의 첫 consistent-read boundary는 아직 만들어지지 않았습니다.
Model · not-created · none Visible result · not-run · 0 rows
evidence:mvcc-consistent-read-captured-connection-aevidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-transaction-connections-readyevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
C가 READ COMMITTED read-only transaction을 시작
active command · C START TRANSACTION READ ONLY
Q-01 · reference-context · native plan · reference-context
현재 command는 C START TRANSACTION READ ONLY입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
C(connection 11)도 START TRANSACTION READ ONLY를 실행합니다. C1 이전에는 statement snapshot이 없으며, row 102의 현재 fixture 값은 amount_cents=2400, revision 1입니다.
Model · not-created · none Visible result · not-run · 0 rows
evidence:mvcc-consistent-read-captured-connection-cevidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-transaction-connections-readyevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A1이 RR transaction의 첫 row set을 고정
active command · A1 Q-01
Q-01 · execution-target · native plan · execution-target
현재 command는 A1 Q-01입니다. Q-01과 native iterator가 현재 단계의 실행 또는 분석 대상입니다. actual time, rows, loops는 plan-boundary에서 확인하는 참고 수치입니다.
A1은 101=1200, 102=2400/revision 1, 103=3600, 105=6000을 반환합니다. row IDs 101, 102, 103, 105와 old checksum 0f6e4ce02300c310ea47dee95ba35ac7e0a74a7dfc5851e4246235c65b5ff171가 A의 첫 consistent-read boundary에 연결됩니다.
Model · first-read · transaction-snapshot-established - row 101 · 101-seed · no prior · visible-head · not-followed
- row 102 · 102-before · no prior · visible-head · not-followed
- row 103 · 103-before-delete · no prior · visible-head · not-followed
- row 105 · 105-seed · no prior · visible-head · not-followed
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-connections-readyevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
C1도 writer 이전의 old row set을 반환
active command · C1 Q-01
Q-01 · execution-target · native plan · execution-target
현재 command는 C1 Q-01입니다. Q-01과 native iterator가 현재 단계의 실행 또는 분석 대상입니다. actual time, rows, loops는 plan-boundary에서 확인하는 참고 수치입니다.
C1은 101=1200, 102=2400/revision 1, 103=3600, 105=6000을 반환합니다. A의 transaction snapshot과 row IDs 101, 102, 103, 105를 함께 확인할 수 있습니다.
Model · first-read · transaction-snapshot-established - row 101 · 101-seed · no prior · visible-head · not-followed
- row 102 · 102-before · no prior · visible-head · not-followed
- row 103 · 103-before-delete · no prior · visible-head · not-followed
- row 105 · 105-seed · no prior · visible-head · not-followed
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-reader-baseline-completeevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B가 row 102의 payload를 갱신
active command · B UPDATE order_id=102
Q-01 · reference-context · native plan · reference-context
현재 command는 B UPDATE order_id=102입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
B의 UPDATE는 row 102를 amount_cents=2400, revision 1, note=seed-102에서 amount_cents=2500, revision 2, note=updated-by-b로 바꾸고 ROW_COUNT()=1을 반환했습니다. 102-after에서 102-before로 이어지는 version link는 Model band에 표시됩니다.
Model · first-read · transaction-snapshot-established - row 102 · 102-after · 102-before · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-connection-bevidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-reader-baseline-completeevidence:mvcc-consistent-read-captured-writer-update-order102evidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B가 새로운 secondary entry 106을 삽입
active command · B INSERT order_id=106
Q-01 · reference-context · native plan · reference-context
현재 command는 B INSERT order_id=106입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
INSERT는 row 106을 tenant_id=7, state=READY, amount_cents=6600, revision 1로 만들고 ROW_COUNT()=1을 반환했습니다. A1과 C1의 old row set에는 106이 없으며, writer commit 전 reader 결과도 바뀌지 않습니다.
Model · first-read · transaction-snapshot-established - row 106 · 106-inserted · no prior · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-reader-baseline-completeevidence:mvcc-consistent-read-captured-writer-insert-order106evidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B가 row 103을 삭제
active command · B DELETE order_id=103
Q-01 · reference-context · native plan · reference-context
현재 command는 B DELETE order_id=103입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
DELETE는 amount_cents=3600, revision 1인 row 103에 대해 ROW_COUNT()=1을 반환했습니다. 103 delete-mark와 103-before-delete payload의 연결을 Model로 표시하고, A1/C1 결과의 103은 그대로 유지합니다.
Model · first-read · transaction-snapshot-established - row 103 · 103-delete-mark · 103-before-delete · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-reader-baseline-completeevidence:mvcc-consistent-read-captured-writer-delete-order103evidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B를 COMMIT 전 hold하고 transaction과 lock을 함께 관찰
active command · B transaction open
Q-01 · reference-context · native plan · reference-context
현재 command는 B transaction open입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
A=12, B=10, C=11가 ACTIVE입니다. B에는 granted locks 3, waiting locks 0이 있고 A/C grants는 0이며 data_lock_waits edge는 0입니다. B가 만든 row 102=2500, row 103 delete, row 106=6600을 한 화면에 연결합니다.
Model · first-read · transaction-snapshot-established - row 102 · 102-after · 102-before · not-evaluated · not-evaluated
- row 103 · 103-delete-mark · 103-before-delete · not-evaluated · not-evaluated
- row 106 · 106-inserted · no prior · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-connection-oevidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-writer-holdevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B COMMIT 이후 fresh snapshot이 볼 수 있는 row set 변경
active command · B COMMIT
Q-01 · reference-context · native plan · reference-context
현재 command는 B COMMIT입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
B COMMIT이 acknowledged=true가 되면서 writer locks는 0으로 닫힙니다. A의 기존 snapshot은 row 102=2400을 유지하고, C의 다음 statement는 committed row 102=2500과 106=6600을 볼 수 있습니다.
Model · first-read · transaction-snapshot-established - row 102 · 102-after · 102-before · not-evaluated · not-evaluated
- row 103 · 103-delete-mark · 103-before-delete · not-evaluated · not-evaluated
- row 106 · 106-inserted · no prior · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-writer-commit-closedevidence:mvcc-consistent-read-captured-writer-commitevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A2가 row 102의 prior version을 선택
active command · A2 Q-01
Q-01 · execution-target · native plan · execution-target
현재 command는 A2 Q-01입니다. Q-01과 native iterator가 현재 단계의 실행 또는 분석 대상입니다. actual time, rows, loops는 plan-boundary에서 확인하는 참고 수치입니다.
A2는 row 102에서 current payload 2500/revision 2를 지나 prior payload 2400/revision 1을 선택합니다. Captured A2 row IDs는 101, 102, 103, 105이며 old checksum을 유지합니다.
Model · reused · transaction-snapshot-reused - row 102 · 102-after · 102-before · visible-prior · followed
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-writer-commit-closedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A2는 103을 포함하고 106을 제외
active command · A2 Q-01
Q-01 · execution-target · native plan · execution-target
현재 command는 A2 Q-01입니다. Q-01과 native iterator가 현재 단계의 실행 또는 분석 대상입니다. actual time, rows, loops는 plan-boundary에서 확인하는 참고 수치입니다.
A2의 reused snapshot은 prior row 103=3600을 포함하고 새 row 106=6600을 제외합니다. 결과 101, 102, 103, 105는 A1과 동일합니다.
Model · reused · transaction-snapshot-reused - row 103 · 103-delete-mark · 103-before-delete · visible-prior · followed
- row 106 · 106-inserted · no prior · not-visible · not-followed
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-writer-commit-closedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
C2가 실행돼도 A2의 old payload는 유지
active command · C2 Q-01
Q-01 · execution-target · native plan · execution-target
현재 command는 C2 Q-01입니다. Q-01과 native iterator가 현재 단계의 실행 또는 분석 대상입니다. actual time, rows, loops는 plan-boundary에서 확인하는 참고 수치입니다.
C2는 row 102=2500/revision 2를 반환하지만 A lane은 reused snapshot의 102=2400/revision 1을 계속 표시합니다. A2 row IDs 101, 102, 103, 105에는 변화가 없습니다.
Model · reused · transaction-snapshot-reused - row 102 · 102-after · 102-before · visible-prior · followed
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-writer-commit-closedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
C2의 membership 변화와 A2의 고정 row set 비교
active command · C2 Q-01
Q-01 · execution-target · native plan · execution-target
현재 command는 C2 Q-01입니다. Q-01과 native iterator가 현재 단계의 실행 또는 분석 대상입니다. actual time, rows, loops는 plan-boundary에서 확인하는 참고 수치입니다.
C2는 row 103=3600을 제외하고 row 106=6600을 포함하지만 A2는 103을 포함하고 106을 제외합니다. A2는 101, 102, 103, 105를 유지합니다.
Model · reused · transaction-snapshot-reused - row 103 · 103-delete-mark · 103-before-delete · visible-prior · followed
- row 106 · 106-inserted · no prior · not-visible · not-followed
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-reader-second-reads-completeevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
native EXPLAIN이 보여주는 index lookup 경계
active command · A EXPLAIN ANALYZE Q-01
Q-01 · execution-target · native plan · execution-target
현재 command는 A EXPLAIN ANALYZE Q-01입니다. Q-01과 native iterator가 현재 단계의 실행 또는 분석 대상입니다. actual time, rows, loops는 이 EXPLAIN ANALYZE의 수치입니다.
A의 native plan은 access type ref, key idx_tenant_state_order, cost 0.35, estimated rows 1, actual rows 4, loops=1를 기록했습니다. row 102는 2400/revision 1로 보이지만 별도 MVCC operator는 plan에 추가하지 않습니다.
Model · reused · transaction-snapshot-reused Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-plans-capturedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A COMMIT 후에도 마지막 A2 결과를 보존
active command · A COMMIT
Q-01 · reference-context · native plan · reference-context
현재 command는 A COMMIT입니다. Q-01은 현재 단계에서 실행되지 않습니다. SQL span과 native iterator는 참고 문맥이며 actual time, rows, loops도 현재 command의 수치가 아닙니다.
A가 COMMIT되어 transaction state는 closed가 되지만 마지막 Captured A2 결과 101, 102, 103, 105와 row 102=2400/revision 1은 그대로 남습니다.
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-readers-committedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings