ADVANCED DATABASE SYSTEMS Multi-Version Concurrency Control - - PowerPoint PPT Presentation

advanced database
SMART_READER_LITE
LIVE PREVIEW

ADVANCED DATABASE SYSTEMS Multi-Version Concurrency Control - - PowerPoint PPT Presentation

Lect ure # 03 ADVANCED DATABASE SYSTEMS Multi-Version Concurrency Control (Design Decisions) @ Andy_Pavlo // 15- 721 // Spring 2020 2 M ULTI- VERSIO N CO N CURREN CY CO N TRO L The DBMS maintains multiple physical versions of a single


slide-1
SLIDE 1

Lect ure # 03

Multi-Version Concurrency Control (Design Decisions)

@ Andy_Pavlo // 15- 721 // Spring 2020

ADVANCED DATABASE SYSTEMS

slide-2
SLIDE 2

15-721 (Spring 2020)

M ULTI- VERSIO N CO N CURREN CY CO N TRO L

The DBMS maintains multiple physical versions

  • f a single logical object in the database:

→ When a txn writes to an object, the DBMS creates a new version of that object. → When a txn reads an object, it reads the newest version that existed when the txn started.

First proposed in 1978 MIT PhD dissertation. First implementation was InterBase (Firebird). Used in almost every new DBMS in last 10 years.

2

slide-3
SLIDE 3

15-721 (Spring 2020)

M ULTI- VERSIO N CO N CURREN CY CO N TRO L

Writers don't block readers. Readers don't block writers. Read-only txns can read a consistent snapshot without acquiring locks or txn ids.

→ Use timestamps to determine visibility.

Easily support time-travel queries.

5

slide-4
SLIDE 4

15-721 (Spring 2020)

SN APSH OT ISO LATIO N (SI)

When a txn starts, it sees a consistent snapshot of the database that existed when that the txn started.

→ No torn writes from active txns. → If two txns update the same object, then first writer wins.

SI is susceptible to the Write Skew Anomaly.

4

slide-5
SLIDE 5

15-721 (Spring 2020)

WRITE SKEW AN O M ALY

5

Txn #1

Change white marbles to black.

Txn #2

Change black marbles to white.

slide-6
SLIDE 6

15-721 (Spring 2020)

WRITE SKEW AN O M ALY

5

Txn #1

Change white marbles to black.

Txn #2

Change black marbles to white.

slide-7
SLIDE 7

15-721 (Spring 2020)

WRITE SKEW AN O M ALY

5

Txn #1

Change white marbles to black.

Txn #2

Change black marbles to white.

slide-8
SLIDE 8

15-721 (Spring 2020)

WRITE SKEW AN O M ALY

5

Txn #1

Change white marbles to black.

Txn #2

Change black marbles to white.

slide-9
SLIDE 9

15-721 (Spring 2020)

WRITE SKEW AN O M ALY

5

Txn #1

Change white marbles to black.

Txn #2

Change black marbles to white.

slide-10
SLIDE 10

15-721 (Spring 2020)

ISO LATIO N LEVEL H IERARCH Y

6

REPEATABLE READS SNAPSHOT ISOLATION READ UNCOMMITTED SERIALIZABLE READ COMMITTED

slide-11
SLIDE 11

15-721 (Spring 2020)

ISO LATIO N LEVEL H IERARCH Y

6

REPEATABLE READS SNAPSHOT ISOLATION READ UNCOMMITTED SERIALIZABLE READ COMMITTED

slide-12
SLIDE 12

15-721 (Spring 2020)

M VCC DESIGN DECISIO N S

Concurrency Control Protocol Version Storage Garbage Collection Index Management

7

AN EMPIRICAL EVALUATION OF IN- MEMORY MULTI- VERSION CONCURRENCY CONTROL

VLDB 2017

slide-13
SLIDE 13

15-721 (Spring 2020)

CO N CURREN CY CO N TRO L PROTO CO L

Approach #1: Timestamp Ordering

→ Assign txns timestamps that determine serial order. → Considered to be original MVCC protocol.

Approach #2: Optimistic Concurrency Control

→ Three-phase protocol from last class. → Use private workspace for new versions.

Approach #3: Two-Phase Locking

→ Txns acquire appropriate lock on physical version before they can read/write a logical tuple.

8

slide-14
SLIDE 14

15-721 (Spring 2020)

TUPLE FO RM AT

9

Unique Txn Identifier Version Lifetime Next/Prev Version Additional Meta-data

TXN-ID DATA BEGIN-TS END-TS POINTER ...

slide-15
SLIDE 15

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

slide-16
SLIDE 16

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

Thread #1 Tid=10

slide-17
SLIDE 17

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts.

Thread #1 Tid=10

slide-18
SLIDE 18

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts.

Thread #1 Tid=10

slide-19
SLIDE 19

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

10

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts.

Thread #1 Tid=10

slide-20
SLIDE 20

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

10

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts. Txn creates a new version if no other txn holds latch and Tid is greater than read-ts.

Thread #1 Tid=10

slide-21
SLIDE 21

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

10

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts. Txn creates a new version if no other txn holds latch and Tid is greater than read-ts.

Thread #1 Tid=10

slide-22
SLIDE 22

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

10

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts. Txn creates a new version if no other txn holds latch and Tid is greater than read-ts.

10

Thread #1 Tid=10

slide-23
SLIDE 23

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

10

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts. Txn creates a new version if no other txn holds latch and Tid is greater than read-ts.

10 B2 10 10

Thread #1 Tid=10

slide-24
SLIDE 24

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

10

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts. Txn creates a new version if no other txn holds latch and Tid is greater than read-ts.

10 B2 10 10

10

Thread #1 Tid=10

slide-25
SLIDE 25

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1 1 1

B1 1

TIM ESTAM P O RDERIN G (M VTO )

10

Use read-ts field in the header to keep track of the timestamp of the last txn that read it.

READ(A) WRITE(B)

10

Txn can read version if the latch is unset and its Tid is between begin-ts and end-ts. Txn creates a new version if no other txn holds latch and Tid is greater than read-ts.

B2 10 10

10

Thread #1 Tid=10

slide-26
SLIDE 26

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

Thread #1 Tid=10

slide-27
SLIDE 27

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

If txn-id is zero, then the txn acquires the SHARED lock by incrementing the read-cnt field.

Thread #1 Tid=10

slide-28
SLIDE 28

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

1

If txn-id is zero, then the txn acquires the SHARED lock by incrementing the read-cnt field.

Thread #1 Tid=10

slide-29
SLIDE 29

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

1

If txn-id is zero, then the txn acquires the SHARED lock by incrementing the read-cnt field.

Thread #1 Tid=10

slide-30
SLIDE 30

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

1

If txn-id is zero, then the txn acquires the SHARED lock by incrementing the read-cnt field. If both txn-id and read-cnt are zero, then txn acquires the EXCLUSIVE lock by setting both of them.

Thread #1 Tid=10

slide-31
SLIDE 31

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

1

If txn-id is zero, then the txn acquires the SHARED lock by incrementing the read-cnt field. If both txn-id and read-cnt are zero, then txn acquires the EXCLUSIVE lock by setting both of them.

10 1

Thread #1 Tid=10

slide-32
SLIDE 32

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

1

If txn-id is zero, then the txn acquires the SHARED lock by incrementing the read-cnt field. If both txn-id and read-cnt are zero, then txn acquires the EXCLUSIVE lock by setting both of them.

10 B2 10 10

1

Thread #1 Tid=10

slide-33
SLIDE 33

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

1

If txn-id is zero, then the txn acquires the SHARED lock by incrementing the read-cnt field. If both txn-id and read-cnt are zero, then txn acquires the EXCLUSIVE lock by setting both of them.

10 B2 10 10

10 1

Thread #1 Tid=10

slide-34
SLIDE 34

15-721 (Spring 2020)

TXN-ID READ-CNT BEGIN-TS END-TS

A1 1

B1 1

TWO - PH ASE LO CKIN G (M V2PL)

11

Txns use the tuple's read- cnt field as SHARED lock. Use txn-id and read-cnt together as EXCLUSIVE lock.

READ(A) WRITE(B)

If txn-id is zero, then the txn acquires the SHARED lock by incrementing the read-cnt field. If both txn-id and read-cnt are zero, then txn acquires the EXCLUSIVE lock by setting both of them.

B2 10 10

10

Thread #1 Tid=10

slide-35
SLIDE 35

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1

  • 99999

O BSERVATIO N

12

If the DBMS reaches the max value for its timestamps, it will have to wrap around and restart at one. This will make all previous versions be in the "future" from new transactions. Thread #1 Tid=231-1

WRITE(A)

slide-36
SLIDE 36

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1

  • 99999

O BSERVATIO N

12

If the DBMS reaches the max value for its timestamps, it will have to wrap around and restart at one. This will make all previous versions be in the "future" from new transactions. Thread #1 Tid=231-1

WRITE(A)

231-1 A2

  • 231-1

231-1 231-1

slide-37
SLIDE 37

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1

  • 99999

O BSERVATIO N

12

If the DBMS reaches the max value for its timestamps, it will have to wrap around and restart at one. This will make all previous versions be in the "future" from new transactions. Thread #1 Tid=231-1

WRITE(A)

231-1 A2

  • 231-1

slide-38
SLIDE 38

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1

  • 99999

O BSERVATIO N

12

If the DBMS reaches the max value for its timestamps, it will have to wrap around and restart at one. This will make all previous versions be in the "future" from new transactions. Thread #1 Tid=231-1 Thread #2 Tid=1

WRITE(A)

231-1 A2

  • 231-1

slide-39
SLIDE 39

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1

  • 99999

O BSERVATIO N

12

If the DBMS reaches the max value for its timestamps, it will have to wrap around and restart at one. This will make all previous versions be in the "future" from new transactions.

A3

  • 1

1

Thread #1 Tid=231-1 Thread #2 Tid=1

WRITE(A)

231-1 A2

  • 231-1

1 1

slide-40
SLIDE 40

15-721 (Spring 2020)

TXN-ID READ-TS BEGIN-TS END-TS

A1

  • 99999

O BSERVATIO N

12

If the DBMS reaches the max value for its timestamps, it will have to wrap around and restart at one. This will make all previous versions be in the "future" from new transactions.

A3

  • 1

Thread #1 Tid=231-1 Thread #2 Tid=1

231-1 A2

  • 231-1

1

slide-41
SLIDE 41

15-721 (Spring 2020)

PO STGRES TXN ID WRAPARO UN D

Set a flag in each tuple header that says that it is "frozen" in the past. Any new txn id will always be newer than a frozen version. Runs the vacuum before the system gets close to this upper limit. Otherwise it must stop accepting new commands when the system gets close to the max txn id.

13

slide-42
SLIDE 42

15-721 (Spring 2020)

VERSIO N STO RAGE

The DBMS uses the tuples’ pointer field to create a latch-free version chain per logical tuple.

→ This allows the DBMS to find the version that is visible to a particular txn at runtime. → Indexes always point to the “head” of the chain.

Different storage schemes determine where/what to store for each version.

14

slide-43
SLIDE 43

15-721 (Spring 2020)

VERSIO N STO RAGE

Approach #1: Append-Only Storage

→ New versions are appended to the same table space.

Approach #2: Time-Travel Storage

→ Old versions are copied to separate table space.

Approach #3: Delta Storage

→ The original values of the modified attributes are copied into a separate delta record space.

15

slide-44
SLIDE 44

15-721 (Spring 2020)

APPEN D- O N LY STO RAGE

All the physical versions of a logical tuple are stored in the same table

  • space. The versions are mixed

together. On every update, append a new version of the tuple into an empty space in the table.

16

Main Table

VALUE

A0 $111

POINTER

A1 $222 Ø B1 $10 Ø

slide-45
SLIDE 45

15-721 (Spring 2020)

APPEN D- O N LY STO RAGE

All the physical versions of a logical tuple are stored in the same table

  • space. The versions are mixed

together. On every update, append a new version of the tuple into an empty space in the table.

16

Main Table

VALUE

A0 $111

POINTER

A1 $222 Ø A2 $333 Ø B1 $10 Ø

slide-46
SLIDE 46

15-721 (Spring 2020)

APPEN D- O N LY STO RAGE

All the physical versions of a logical tuple are stored in the same table

  • space. The versions are mixed

together. On every update, append a new version of the tuple into an empty space in the table.

16

Main Table

VALUE

A0 $111

POINTER

A1 $222 A2 $333 Ø B1 $10 Ø

slide-47
SLIDE 47

15-721 (Spring 2020)

VERSIO N CH AIN O RDERIN G

Approach #1: Oldest-to-Newest (O2N)

→ Append every new version to end of the chain. → Must traverse chain on look-ups.

Approach #2: Newest-to-Oldest (N2O)

→ Must update index pointers for every new version. → Don’t have to traverse chain on look ups.

The ordering of the chain has different performance trade-offs.

17

slide-48
SLIDE 48

15-721 (Spring 2020)

TIM E- TRAVEL STO RAGE

18

Main Table

VALUE

A2 $222

POINTER

B1 $10

Time-Travel Table

VALUE

A1 $111

POINTER

Ø

On every update, copy the current version to the time- travel table. Update pointers.

slide-49
SLIDE 49

15-721 (Spring 2020)

TIM E- TRAVEL STO RAGE

18

Main Table

VALUE

A2 $222

POINTER

B1 $10

Time-Travel Table

VALUE

A1 $111

POINTER

A2 $222 Ø

On every update, copy the current version to the time- travel table. Update pointers.

slide-50
SLIDE 50

15-721 (Spring 2020)

TIM E- TRAVEL STO RAGE

18

Overwrite master version in the main table and update pointers. Main Table

VALUE

A2 $222

POINTER

B1 $10

Time-Travel Table

VALUE

A1 $111

POINTER

A2 $222 Ø

On every update, copy the current version to the time- travel table. Update pointers.

slide-51
SLIDE 51

15-721 (Spring 2020)

TIM E- TRAVEL STO RAGE

18

Overwrite master version in the main table and update pointers. Main Table

VALUE

A2 $222

POINTER

B1 $10 A3 $333

Time-Travel Table

VALUE

A1 $111

POINTER

A2 $222 Ø

On every update, copy the current version to the time- travel table. Update pointers.

slide-52
SLIDE 52

15-721 (Spring 2020)

TIM E- TRAVEL STO RAGE

18

Overwrite master version in the main table and update pointers. Main Table

VALUE

A2 $222

POINTER

B1 $10 A3 $333

Time-Travel Table

VALUE

A1 $111

POINTER

A2 $222 Ø

On every update, copy the current version to the time- travel table. Update pointers.

slide-53
SLIDE 53

15-721 (Spring 2020)

TIM E- TRAVEL STO RAGE

18

Overwrite master version in the main table and update pointers. Main Table

VALUE

A2 $222

POINTER

B1 $10 A3 $333

Time-Travel Table

VALUE

A1 $111

POINTER

A2 $222 Ø

On every update, copy the current version to the time- travel table. Update pointers.

slide-54
SLIDE 54

15-721 (Spring 2020)

DELTA STO RAGE

19

Main Table

VALUE

A1 $111

POINTER

B1 $10

Delta Storage Segment On every update, copy only the values that were modified to the delta storage and

  • verwrite the master version.
slide-55
SLIDE 55

15-721 (Spring 2020)

DELTA STO RAGE

19

Main Table

VALUE

A1 $111

POINTER

B1 $10

Delta Storage Segment

DELTA POINTER

A1 (VALUE→$111) Ø

On every update, copy only the values that were modified to the delta storage and

  • verwrite the master version.
slide-56
SLIDE 56

15-721 (Spring 2020)

DELTA STO RAGE

19

Main Table

VALUE

A1 $111

POINTER

B1 $10

Delta Storage Segment

DELTA POINTER

A1 (VALUE→$111) Ø A2 $222

On every update, copy only the values that were modified to the delta storage and

  • verwrite the master version.
slide-57
SLIDE 57

15-721 (Spring 2020)

DELTA STO RAGE

19

Main Table

VALUE

A1 $111

POINTER

B1 $10

Delta Storage Segment

DELTA POINTER

A2 (VALUE→$222) A1 (VALUE→$111) Ø A2 $222

On every update, copy only the values that were modified to the delta storage and

  • verwrite the master version.
slide-58
SLIDE 58

15-721 (Spring 2020)

DELTA STO RAGE

19

Txns can recreate old versions by applying the delta in reverse order. Main Table

VALUE

A1 $111

POINTER

B1 $10

Delta Storage Segment

DELTA POINTER

A2 (VALUE→$222) A1 (VALUE→$111) Ø A2 $222 A3 $333

On every update, copy only the values that were modified to the delta storage and

  • verwrite the master version.
slide-59
SLIDE 59

15-721 (Spring 2020)

N O N- IN LIN E ATTRIBUTES

20

INT_VAL

A1 $100

Variable-Length Data

A1

STR_VAL

MY_LONG_STRING

Main Table Reuse pointers to variable- length pool for values that do not change between versions.

slide-60
SLIDE 60

15-721 (Spring 2020)

N O N- IN LIN E ATTRIBUTES

20

INT_VAL

A1 $100 A2 $90

Variable-Length Data

A1

STR_VAL

MY_LONG_STRING MY_LONG_STRING

Main Table Reuse pointers to variable- length pool for values that do not change between versions.

slide-61
SLIDE 61

15-721 (Spring 2020)

N O N- IN LIN E ATTRIBUTES

20

Requires reference counters to know when it is safe to free memory. Unable to relocate memory easily.

INT_VAL

A1 $100 A2 $90

Variable-Length Data

MY_LONG_STRING Refs=1 A1

STR_VAL

Main Table Reuse pointers to variable- length pool for values that do not change between versions.

slide-62
SLIDE 62

15-721 (Spring 2020)

N O N- IN LIN E ATTRIBUTES

20

Requires reference counters to know when it is safe to free memory. Unable to relocate memory easily.

INT_VAL

A1 $100 A2 $90

Variable-Length Data

MY_LONG_STRING Refs=1 A1

STR_VAL

Refs=2

Main Table Reuse pointers to variable- length pool for values that do not change between versions.

slide-63
SLIDE 63

15-721 (Spring 2020)

GARBAGE CO LLECTIO N

The DBMS needs to remove reclaimable physical versions from the database over time.

→ No active txn in the DBMS can “see” that version (SI). → The version was created by an aborted txn.

Three additional design decisions:

→ How to look for expired versions? → How to decide when it is safe to reclaim memory? → Where to look for expired versions?

21

slide-64
SLIDE 64

15-721 (Spring 2020)

GARBAGE CO LLECTIO N

Approach #1: Tuple-level

→ Find old versions by examining tuples directly. → Background Vacuuming vs. Cooperative Cleaning

Approach #2: Transaction-level

→ Txns keep track of their old versions so the DBMS does not have to scan tuples to determine visibility.

22

slide-65
SLIDE 65

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

BEGIN-TS END-TS

A100 1 9 B100 1 9 B101 10 20

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Vacuum

slide-66
SLIDE 66

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

BEGIN-TS END-TS

A100 1 9 B100 1 9 B101 10 20

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Vacuum

slide-67
SLIDE 67

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

BEGIN-TS END-TS

A100 1 9 B100 1 9 B101 10 20

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Vacuum

slide-68
SLIDE 68

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

BEGIN-TS END-TS

A100 1 9 B100 1 9 B101 10 20

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Vacuum

Dirty Block BitMap

slide-69
SLIDE 69

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

BEGIN-TS END-TS

A100 1 9 B100 1 9 B101 10 20

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Vacuum

Dirty Block BitMap

slide-70
SLIDE 70

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

BEGIN-TS END-TS

A100 1 9 B100 1 9 B101 10 20

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Vacuum

Dirty Block BitMap

slide-71
SLIDE 71

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Cooperative Cleaning: Worker threads identify reclaimable versions as they traverse version chain. Only works with O2N.

A2 A3 B0 B1 B2 B3

INDEX

A0 A1

slide-72
SLIDE 72

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Cooperative Cleaning: Worker threads identify reclaimable versions as they traverse version chain. Only works with O2N.

A2 A3 B0 B1 B2 B3

INDEX

A0 A1

GET(A)

slide-73
SLIDE 73

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Cooperative Cleaning: Worker threads identify reclaimable versions as they traverse version chain. Only works with O2N.

A2 A3 B0 B1 B2 B3

INDEX

A0 A1

GET(A)

slide-74
SLIDE 74

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Cooperative Cleaning: Worker threads identify reclaimable versions as they traverse version chain. Only works with O2N.

A2 A3 B0 B1 B2 B3

INDEX

A0 A1

X

GET(A)

slide-75
SLIDE 75

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Cooperative Cleaning: Worker threads identify reclaimable versions as they traverse version chain. Only works with O2N.

A2 A3 B0 B1 B2 B3

INDEX

A0 A1

X X

GET(A)

slide-76
SLIDE 76

15-721 (Spring 2020)

Thread #1 Tid=12 Thread #2 Tid=25

TUPLE- LEVEL GC

23

Background Vacuuming: Separate thread(s) periodically scan the table and look for reclaimable versions. Works with any storage. Cooperative Cleaning: Worker threads identify reclaimable versions as they traverse version chain. Only works with O2N.

A2 A3 B0 B1 B2 B3

INDEX

GET(A)

slide-77
SLIDE 77

15-721 (Spring 2020)

TRAN SACTIO N - LEVEL GC

Each txn keeps track of its read/write set. The DBMS determines when all versions created by a finished txn are no longer visible. May still require multiple threads to reclaim the memory fast enough for the workload.

24

slide-78
SLIDE 78

15-721 (Spring 2020)

IN DEX M AN AGEM EN T

PKey indexes always point to version chain head.

→ How often the DBMS must update the pkey index depends on whether the system creates new versions when a tuple is updated. → If a txn updates a tuple’s pkey attribute(s), then this is treated as a DELETE followed by an INSERT.

Secondary indexes are more complicated…

25

slide-79
SLIDE 79

15-721 (Spring 2020)

IN DEX M AN AGEM EN T

PKey indexes always point to version chain head.

→ How often the DBMS must update the pkey index depends on whether the system creates new versions when a tuple is updated. → If a txn updates a tuple’s pkey attribute(s), then this is treated as a DELETE followed by an INSERT.

Secondary indexes are more complicated…

25

slide-80
SLIDE 80

15-721 (Spring 2020)

SECO N DARY IN DEXES

Approach #1: Logical Pointers

→ Use a fixed identifier per tuple that does not change. → Requires an extra indirection layer. → Primary Key vs. Tuple Id

Approach #2: Physical Pointers

→ Use the physical address to the version chain head.

26

slide-81
SLIDE 81

15-721 (Spring 2020)

IN DEX PO IN TERS

27

PRIMARY INDEX SECONDARY INDEX

A4 A3 A2 A1

GET(A) Append-Only Newest-to-Oldest

Physical Address

slide-82
SLIDE 82

15-721 (Spring 2020)

IN DEX PO IN TERS

27

PRIMARY INDEX SECONDARY INDEX

A4 A3 A2 A1

Append-Only Newest-to-Oldest GET(A)

Physical Address

slide-83
SLIDE 83

15-721 (Spring 2020)

SECONDARY INDEX SECONDARY INDEX SECONDARY INDEX

IN DEX PO IN TERS

27

PRIMARY INDEX SECONDARY INDEX

A4 A3 A2 A1

Append-Only Newest-to-Oldest GET(A)

slide-84
SLIDE 84

15-721 (Spring 2020)

IN DEX PO IN TERS

27

PRIMARY INDEX SECONDARY INDEX

A4 A3 A2 A1

Append-Only Newest-to-Oldest GET(A)

Physical Address Primary Key

slide-85
SLIDE 85

15-721 (Spring 2020)

IN DEX PO IN TERS

27

PRIMARY INDEX SECONDARY INDEX

A4 A3 A2 A1

Append-Only Newest-to-Oldest GET(A)

TupleId→Address

TupleId Physical Address

slide-86
SLIDE 86

15-721 (Spring 2020)

M VCC IN DEXES

MVCC DBMS indexes (usually) do not store version information about tuples with their keys.

→ Exception: Index-organized tables (e.g., MySQL)

Every index must support duplicate keys from different snapshots:

→ The same key may point to different logical tuples in different snapshots.

28

slide-87
SLIDE 87

15-721 (Spring 2020)

M VCC DUPLICATE KEY PRO BLEM

29

Index

A1

BEGIN-TS END-TS

1

POINTER

Ø

READ(A)

Thread #1 Begin @ 10

slide-88
SLIDE 88

15-721 (Spring 2020)

M VCC DUPLICATE KEY PRO BLEM

29

Index Thread #2 Begin @ 20

A1

BEGIN-TS END-TS

1

POINTER

Ø

UPDATE(A) READ(A)

Thread #1 Begin @ 10

slide-89
SLIDE 89

15-721 (Spring 2020)

M VCC DUPLICATE KEY PRO BLEM

29

Index Thread #2 Begin @ 20

A1

BEGIN-TS END-TS

1

POINTER

Ø

UPDATE(A)

A2 20

Ø 20

READ(A)

Thread #1 Begin @ 10

slide-90
SLIDE 90

15-721 (Spring 2020)

M VCC DUPLICATE KEY PRO BLEM

29

Index

DELETE(A)

Thread #2 Begin @ 20

A1

BEGIN-TS END-TS

1

POINTER

Ø

UPDATE(A)

A2 20

Ø 20

READ(A)

Thread #1 Begin @ 10

slide-91
SLIDE 91

15-721 (Spring 2020)

M VCC DUPLICATE KEY PRO BLEM

29

Index

DELETE(A)

Thread #2 Begin @ 20

A1

BEGIN-TS END-TS

1

POINTER

Ø

UPDATE(A)

A2 20

Ø 20

READ(A)

Thread #1 Begin @ 10 Commit @ 25

25 25 25

slide-92
SLIDE 92

15-721 (Spring 2020)

M VCC DUPLICATE KEY PRO BLEM

29

Index

DELETE(A)

Thread #2 Begin @ 20

INSERT(A)

Thread #3 Begin @ 30

A1

BEGIN-TS END-TS

1

POINTER

Ø

UPDATE(A)

A2 20

Ø 20 A1 30

Ø

READ(A)

Thread #1 Begin @ 10 Commit @ 25

25 25 25

slide-93
SLIDE 93

15-721 (Spring 2020)

M VCC DUPLICATE KEY PRO BLEM

29

Index

DELETE(A)

Thread #2 Begin @ 20

INSERT(A)

Thread #3 Begin @ 30

A1

BEGIN-TS END-TS

1

POINTER

Ø

UPDATE(A)

A2 20

Ø 20 A1 30

Ø

READ(A)

Thread #1 Begin @ 10 Commit @ 25

25 25 25

READ(A)

slide-94
SLIDE 94

15-721 (Spring 2020)

M VCC IN DEXES

Each index's underlying data structure must support the storage of non-unique keys. Use additional execution logic to perform conditional inserts for pkey / unique indexes.

→ Atomically check whether the key exists and then insert.

Workers may get back multiple entries for a single

  • fetch. They then must follow the pointers to find

the proper physical version.

30

slide-95
SLIDE 95

15-721 (Spring 2020)

M VCC EVALUATIO N PAPER

We implemented all the design decisions in the Peloton DBMS as part of 15-721 in Spring 2016. Two categories of experiments:

→ Evaluate each of the design decisions in isolation to determine their trade-offs. → Compare configurations of real-world MVCC systems.

31

AN EMPIRICAL EVALUATION OF IN- MEMORY MULTI- VERSION CONCURRENCY CONTROL

VLDB 2017

slide-96
SLIDE 96

15-721 (Spring 2020)

M VCC DESIGN DECISIO N S

CC Protocol: Inconclusive results… Version Storage: Deltas Garbage Collection: Tuple-Level Vacuuming Indexes: Logical Pointers

32

slide-97
SLIDE 97

15-721 (Spring 2020)

M VCC CO N FIGURATIO N EVALUATIO N

33

Protocol Version Storage Garbage Collection Indexes

Oracle MV2PL Delta Vacuum Logical Postgres MV-2PL/MV-TO Append-Only Vacuum Physical MySQL-InnoDB MV-2PL Delta Vacuum Logical HYRISE MV-OCC Append-Only – Physical Hekaton MV-OCC Append-Only Cooperative Physical MemSQL MV-OCC Append-Only Vacuum Physical SAP HANA MV-2PL Time-travel Hybrid Logical NuoDB MV-2PL Append-Only Vacuum Logical HyPer MV-OCC Delta Txn-level Logical CMU's TBD MV-OCC Delta Txn-level Logical

slide-98
SLIDE 98

15-721 (Spring 2020)

M VCC CO N FIGURATIO N EVALUATIO N

34

25 50 75 100

8 16 24 32 40

Throughput (txn/sec) # Threads Oracle/MySQL NuoDB HyPer HYRISE MemSQL HANA HEKATON Postgres

Database: TPC-C Benchmark (40 Warehouses) Processor: 4 sockets, 10 cores per socket

slide-99
SLIDE 99

15-721 (Spring 2020)

M VCC CO N FIGURATIO N EVALUATIO N

34

25 50 75 100

8 16 24 32 40

Throughput (txn/sec) # Threads Oracle/MySQL NuoDB HyPer HYRISE MemSQL HANA HEKATON Postgres

Database: TPC-C Benchmark (40 Warehouses) Processor: 4 sockets, 10 cores per socket

slide-100
SLIDE 100

15-721 (Spring 2020)

PRO J ECT # 1

Identify bottlenecks in the DBMS's sequential scan implementation using profiling tools and refactor the system to remove it. This project is meant to teach you how to work in a highly concurrent system.

100

slide-101
SLIDE 101

15-721 (Spring 2020)

YET- TO - BE- N AM ED DBM S

CMU’s new in-memory hybrid relational DBMS

→ HyPer-style MVCC column store → Multi-threaded architecture → Latch-free Bw-Tree Index → Native support for Apache Arrow format → Vectorized Execution Engine → MemSQL-style LLVM-based Query Compilation → Cascades-style Query Optimizer → Postgres Wire Protocol / Catalog Compatible

Long term vision is to build a "self-driving" system

101

slide-102
SLIDE 102

15-721 (Spring 2020)

PRO J ECT # 1 TESTIN G

We are providing you with a suite of C++ benchmarks for you check your implementation.

→ Focus on the ConcurrentSlotIterators microbenchmark but you will want to run all of them to make sure your code works.

We strongly encourage you to do your own additional testing.

→ Different workloads → Different # of threads → Different access patterns

102

slide-103
SLIDE 103

15-721 (Spring 2020)

PRO J ECT # 1 GRADIN G

We will run additional tests beyond what we provided you for grading. We will also use Google's Sanitizers when testing your code. All source code must pass ClangFormat + ClangTidy syntax formatting checker.

→ See documentation for formatting guidelines

103

slide-104
SLIDE 104

15-721 (Spring 2020)

DEVELO PM EN T EN VIRO N M EN T

The DBMS builds on Ubuntu 18.04+ and OSX.

→ You can also do development on docker or VM.

This is CMU so I’m going to assume that each of you can get access to a machine. Important: You will not be able to identify the bottleneck on a machine with less than 8 cores.

104

slide-105
SLIDE 105

15-721 (Spring 2020)

TESTIN G EN VIRO N M EN T

Every student will receive $50 of Amazon AWS credits to run experiments on EC2.

→ Setup monitoring + alerts to prevent yourself from burning through your credits. → Use spot instances whenever possible.

Target EC2 Instance: c5.9xlarge

→ On Demand: $1.53/hr → Spot Instance: $0.34/hr (as of Jan 2020)

105

slide-106
SLIDE 106

15-721 (Spring 2020)

PRO J ECT # 1

Due Date: February 16th @ 11:59pm Source code + final report will be turned in using Gradescope but graded using a different machine. Full description and instructions: https://15721.courses.cs.cmu.edu/spring2020/proj ect1.html

106

slide-107
SLIDE 107

15-721 (Spring 2020)

PARTIN G TH O UGH TS

MVCC is the best approach for supporting txns in mixed workloads. We mostly only discussed MVCC for OLTP.

→ Design decisions may be different for HTAP

35

slide-108
SLIDE 108

15-721 (Spring 2020)

N EXT CLASS

Modern MVCC Implementations

→ TUM HyPer → CMU Cicada → Microsoft Hekaton

36