dat 2800 databaser i

97
SQL HiA DAT 2800 Databaser I Flerbrukerproblematikk

Upload: hanh

Post on 13-Jan-2016

73 views

Category:

Documents


1 download

DESCRIPTION

DAT 2800 Databaser I. Flerbrukerproblematikk. FlerbrukersystemClient / Server. Client. Server. Database. DBMS. Application_1. SQL-Request. Data. Application_2. Application_3. Database-sider (Pages). c:\centura\.dbs. Physical Page No 1 1024 bytes total. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: DAT 2800 Databaser I

SQL HiA

DAT 2800Databaser I

Flerbrukerproblematikk

Page 2: DAT 2800 Databaser I

SQL HiA

Flerbrukersystem Client / Server

DatabaseDBMSDBMS

Application_2Application_2

SQL-Request

Data

Application_3Application_3

Application_1Application_1

Client Server

Page 3: DAT 2800 Databaser I

SQL HiA

Database-sider (Pages)

Physical Page No 1

1024 bytes total

Physical Page No 1

1024 bytes total

Physical Page No 2

1024 bytes total

Physical Page No 2

1024 bytes total

Physical Page No 3

1024 bytes total

Physical Page No 3

1024 bytes total

…..

Logical File Offset

0 1023 1024 2047 2048 3071

c:\centura\<DatabaseName>.dbs

Page 4: DAT 2800 Databaser I

SQL HiA

Lister av ulike typer database-sider

1 Page Group Log Prior NextType No Ptr Page PageData 3 1 0 7

1st page in product table

7 Page Group Log Prior NextType No Ptr Page PageData 3 2 1 19

2nd page in product table

Database-sider deles inn i grupper.Sider innen samme gruppe lenkes sammen i dobbelt-lenkede lister.

Hoved-grupper av database-sider: DataIndexControl

Logisk nummerering (1, 2, …) av sider innen samme gruppe

Page 5: DAT 2800 Databaser I

SQL HiA

Grupper av database-sider

Data pages Selve dataene i databasenRow pages Tabell-raderExtent Pages Kolonner som ikke får plass i Row pagesLong VarChar pages Long VarChar kolonnerOverflow pages Plassmangel ved clustered hashing

Designed overflow pages Preallokering ved clustered hashingDynamically created overflow pages Designed overflow page full

Index pages Inneholder B+-tre indekser

Control pages Generelle kontroll-opplysningerDatabase control block Versjonsnr, log-info, ...Free extent list Liste av ikke-allokerte pagesGroup free page list Gruppe-allokerings info (B+-tre)Group extent map Log pages --> Physical pages infoBitmap pages Freespace info for hver tabellRow count page Antall rader pr tabellTable data page Siste rad serial nr, page nr for siste rad,

tabell størrelse, antall overflow pages.

Page 6: DAT 2800 Databaser I

SQL HiA

Row Pages

1 Page Group Log Prior NextType No Ptr Page PageData 3 1 0 7Row Page

1st page in product table

7 Page Group Log Prior NextType No Ptr Page PageData 3 2 1 19Row Page

2nd page in product table

8 Skrivebord 2.700

Tabell-rad

Plasseres i en såkalt Slot i en database-side av type Data Row Page

Page 7: DAT 2800 Databaser I

SQL HiA

Row Pages

Page HeaderPage Header

Row Page HeaderRow Page Header

FreespaceFreespace

Page FooterPage Footer

Slot Table

Slot 5 Slot 4

Slot 3 Slot 1Slot 2

Page 8: DAT 2800 Databaser I

SQL HiA

Row Pages

Page HeaderPage Header Row Page HeaderRow Page Header

PhysicalPage No.

PhysicalPage No.

PageType

PageType Group No.Group No. Logical

Page No.

LogicalPage No.

PreviousPage No.

PreviousPage No.

NextPage No.

NextPage No.

LogPointer

LogPointer Slot SizeSlot Size Free

Space

FreeSpace

ExtentPage No.

ExtentPage No.

FreespaceFreespace

Slot Table

Entry 1 Entry 2 Entry 3

Page Footer Log PointerPage Footer Log Pointer

Slot 5 Slot 4

Slot 3 Slot 1Slot 2

Entry 4 Entry 5

Row Header

Row Serial No.Update Serial No.

Nbr Columns

1 4 Berg 2 8 Grimstad 3 7 Snekker

Col ID Lengde Data

Slot 3

First Bit: Empty/Full

Peker til log-fil som inneholderinfo om før/etter-situasjonved evnt endringer.

Sikkerhet ved 512 byte lagring

Page 9: DAT 2800 Databaser I

SQL HiA

Row Header

Row Serial No.

Entydig identifikator til en rad i en tabell.Tilordnes sekvensielt ved innsetting (1,2,…).

Update Serial No.

Entydig identifikator til en rad i en tabelli en felles UPDATE / INSERT.Tilordnes sekvensielt (1,2,…).Benyttes til UPDATE-tap vedCursor Stabilitet (CS) ogRelease Lock (RL) isolasjonsnivå,samt uendelig UPDATE / INSERT loop.

Eks: UPDATE TABLE YSet x = x + 1 WHERE x > 10

Page 10: DAT 2800 Databaser I

SQL HiA

RowID - Entydig rad-identifikator

RowIDRowID

Page No.Fysisk sidenummerhvor raden befinner seg.

Slot No.Slot nummerinnen sidenhvor raden befinner seg.

Row Serial No.Insert row serie nummer.Entydig.Tilordnes ved innsetting.Endres aldri.Benyttes aldri pånytt.

Update Serial No.Update row serie nummer.Endres ved Update.

Benyttes for å gjenfinneen tabell-rad fra databasen

Verifiserer hvorvidtraden fortsattokkuperer denne lokasjonen eller er slettetog eventuelterstattet av en annen rad

Verifiserereventuell oppdateringav raden

Page 11: DAT 2800 Databaser I

SQL HiA

RowID

RowID SNr Navn PNr

CAAD 5 Nilsen 5002BACV 2 Olsen 6400ERCB 1 Hansen 9000EADD 4 Berg 6400

Selger (ID = SNr)

SNr Navn PNr

5 Nilsen 50022 Olsen 64001 Hansen 90004 Berg 6400

Selger (ID = SNr)

Et eksempel på en 3NF-tabell Selgermed tre kolonnerSNr, Navn og PNr

RowID er en ekstra kolonne i hver tabellsom alltid kommer i tillegg til de kolonnenevi eksplisitt definerer.RowID er entydig for hver radog fungerer som en slags identifikator.

Page 12: DAT 2800 Databaser I

SQL HiA

Extent Pages

Page HeaderPage Header Row Page HeaderRow Page Header

PhysicalPage No.

3

PhysicalPage No.

3

PageTypeROW

PageTypeROW

Group No.20

Group No.20

LogicalPage No.

LogicalPage No.

PreviousPage No.

PreviousPage No.

NextPage No.

NextPage No.

LogPointer

LogPointer Slot SizeSlot Size Free

Space

FreeSpace

ExtentPage No.

7

ExtentPage No.

7

Slot Table

Slot 2

Page HeaderPage Header Row Page HeaderRow Page Header

PhysicalPage No.

7

PhysicalPage No.

7

PageType

EXTENT

PageType

EXTENTGroup No.

20

Group No.20

LogicalPage No.

LogicalPage No.

PreviousPage No.

PreviousPage No.

NextPage No.

NextPage No.

LogPointer

LogPointer Slot SizeSlot Size Free

Space

FreeSpace

ExtentPage No.

15

ExtentPage No.

15

Slot Table

Slot 2

Inneholder kolonner som ikke får plass i opprinnelig Row Page

Page 13: DAT 2800 Databaser I

SQL HiA

Long VarChar Pages

Page HeaderPage Header Row Page HeaderRow Page Header

PhysicalPage No.

3

PhysicalPage No.

3

PageTypeROW

PageTypeROW

Group No.20

Group No.20

LogicalPage No.

LogicalPage No.

PreviousPage No.

PreviousPage No.

NextPage No.

NextPage No.

LogPointer

LogPointer Slot SizeSlot Size Free

Space

FreeSpace

ExtentPage No.

1014

ExtentPage No.

1014

Slot Table

Slot 2

Page HeaderPage Header Row Page HeaderRow Page Header

PhysicalPage No.

7

PhysicalPage No.

7

PageType

LONG

PageType

LONGGroup No.

20

Group No.20

LogicalPage No.

LogicalPage No.

PreviousPage No.

PreviousPage No.

NextPage No.

NextPage No.

LogPointer

LogPointer Slot SizeSlot Size Free

Space

FreeSpace

ExtentPage No.

1015

ExtentPage No.

1015

Slot Table

Slot 2

Long VarChar kolonner plasseres i egne Long Pages

Page 14: DAT 2800 Databaser I

SQL HiA

Overflow Pages - Designed Overflow Pages

Page 1Page 1 Page 2Page 2 Page 3Page 3 Page NPage N... Page 1Page 1 Page 2Page 2 Page 3Page 3 Page NPage N...

Avsettes plass til eventuelle overløps-rader for hver N page

Page 15: DAT 2800 Databaser I

SQL HiA

Overflow Pages - Dynamically Created Overflow Pages

Page 1Page 1 Page 2Page 2 Page 3Page 3 Page NPage N... Page 1Page 1 Page 2Page 2 Page 3Page 3 Page NPage N...

Hvis et ikke er plass til overløps-poster i Designed Overflow Pages,opprettes dynamiske overløps-sider.

Page 16: DAT 2800 Databaser I

SQL HiA

Indekser

• B-Trær Indeks bygget opp som tre-struktur.Benyttes både på primary keys og foreign

keys.

• Hash-tabeller Nøkkel-tranformering.Benyttes typisk på primary key (ID).Clustered Index:Bestemmer fysisk rekkefølge på datai database-tabeller.Kun en clustered index pr tabell.Må alltid lages før non-clustered index.Må alltid lages før data plasseres i tabellen.

Page 17: DAT 2800 Databaser I

SQL HiA

CREATE INDEX

Oppretter en indeksOppretter en indeks

CREATE INDEX index nameUNIQUE CLUSTERED HASHED

,ON table name ( column name )

ASCDESC

PCTFREE integer constant SIZE integer value ROWSBUCKETS

Max size = 6 + number of + sum of <= 255columns in length of allindex columns in

index

Page 18: DAT 2800 Databaser I

SQL HiA

CREATE INDEX - Eksempel

CREATE UNIQUE CLUSTERED HASHED INDEX hSNdxON Selger (SNrID)SIZE 100 ROWS

CREATE UNIQUE INDEX Bidndx ON Bedrift (BedriftsID)

CREATE INDEX BnNdx ON Bedrift (BedriftsNavn)

CREATE INDEX SNavnNdxON BEDRIFT (@UPPER(Navn))

Page 19: DAT 2800 Databaser I

SQL HiA

Clustered Index / Non-Clustered Index

Index

Data

Clustered Non-Clustered

Page 20: DAT 2800 Databaser I

SQL HiA

Indekser i form av trestruktur

…..

Page 21: DAT 2800 Databaser I

SQL HiA

Binært tre

4242

818177

Søk etter tallet 15

Hver node inneholder maksimum 2 barn.

Minimum-høyden av et binært tre som inneholder N noder er [log2N] + 1.Eks: Et tre med 100 noder vil ha minst 7 nivåer.

Page 22: DAT 2800 Databaser I

SQL HiA

Multiway tre

42 8142 81

95 10795 1077 247 24

Søk etter tallet 15

Hver node inneholder N antall nøkler (keys) (her 2).

Færre nivåer enn binære trær og lavere gjenfinningstid.

Balanserings-algoritmene er komplekse.

50 6150 61

Page 23: DAT 2800 Databaser I

SQL HiA

B-tre

Et B-tre er et balansert multiway tre med følgende endring:

Hver node trenger ikke nødvendigvis inneholde nøyaktig N keys.Noder kan vokse fra halv-full til full.Dette reduserer balanserings-algoritmene og er derfor ressurssparende.

Page 24: DAT 2800 Databaser I

SQL HiA

B-Trær

Et B-Tre av orden m er definert ved følgende:

- Roten er enten et løv eller har minst to barn- Alle intermediære noder har:

Antall key i intervallet [m, 2m]Antall barn i intervallet [m+1, 2m+1]

- Alle løv befinner seg på samme nivå

12 15 25 31 41 59 91

21 48 72

1-4-8-11 12-13 15-18-19 21-24 25-26 31-38 41-43-46 48-49-50 59-68 72-78 84-88 91-92-99

84

Eks:B-tre av orden 3

Løv

Database

Page 25: DAT 2800 Databaser I

SQL HiA

B-trær Eks: Innsetting i et B-tre (1)

8,11,12 16,17 41,5222,23,31 58,59,61

16:- 41:58

22:-

Løv

Forenkling: Tenker oss at hver node kan inneholde max tre nøkler og tre barn

Page 26: DAT 2800 Databaser I

SQL HiA

B-trær Eks: Innsetting i et B-tre (2)

8,11,12 16,17,18 41,5222,23,31 58,59,61

16:- 41:58

22:-

Page 27: DAT 2800 Databaser I

SQL HiA

B-trær Eks: Innsetting i et B-tre (3)

1,8 11,12 41,5222,23,31 58,59,61

11:16 41:58

22:-

16,17,18

Page 28: DAT 2800 Databaser I

SQL HiA

B-trær Eks: Innsetting i et B-tre (4)

1,8 11,12 41,5222,23,31 58,59,61

11:16 41:58

22:-

16,17 18,19

Page 29: DAT 2800 Databaser I

SQL HiA

B-trær Eks: Innsetting i et B-tre (5)

1,8 11,12 41,5222,23,31 58,59,61

11:- 41:58

16:22

16,17 18,19

18:-

Page 30: DAT 2800 Databaser I

SQL HiA

B-trær Eks: Innsetting i et B-tre (6)

1,8 11,12 41,5222,23 58,59,61

11:- 41:58

16:22

16,17 18,19

18:-

28,31

Page 31: DAT 2800 Databaser I

SQL HiA

B-trær Eks: Innsetting i et B-tre (7)

1,8 11,12 41,5222,23 58,59,61

11:- 58:-

16:22

16,17 18,19

18:-

28,31

28:-

Page 32: DAT 2800 Databaser I

SQL HiA

B-trær Eks: Innsetting i et B-tre (8)

1,8 11,12 41,5222,23 58,59,61

11:- 58:-

22:-

16,17 18,19

18:-

28,31

28:-

16:- 41:-

Page 33: DAT 2800 Databaser I

SQL HiA

B+ -tre

• Alle pekere til databasefil fjernes fra index-nodene

• Alle key-verdier lagres i løvene uavhengig av hvorvidt de eksisterer i index-nodene.

• Løv noder er lenket sammen i en liste kalt sekvens-settet.

B-tre er optimalt mht aksess til single-record,men ineffektivt mht sekvensiell prosessering.

B+-tre skiller seg fra B-tre ved:

Page 34: DAT 2800 Databaser I

SQL HiA

Prefix B+-tre

Prefix B+-tre er et B+-trehvor kun den delen av Key som er nødvendig mht entydighetlages i index-nodene.

Avkortede Key-verdier

SQLBase benytter Prefix B+-tre

Page 35: DAT 2800 Databaser I

SQL HiA

Hashing / Nøkkel-transformering / Randomisering

HashingKey Transformed Key

Page 36: DAT 2800 Databaser I

SQL HiA

Nøkkel-transformering

123456789...

PNr

123456789...

ID

PNr = ID En-entydig sammenheng mellom PNr (Postnummer) og ID

Page 37: DAT 2800 Databaser I

SQL HiA

Nøkkel-transformering

6 4 7 2 1KundeNr TverrSum

Distrikt

Page 38: DAT 2800 Databaser I

SQL HiA

Nøkkel-transformering

6 4 7 2 3KundeNr Siste siffer i tverrsummen av

siste siffer i produktene

6 4 7 21 2 3 46 8 21 8

KundeNr

Vekttall

Produkt

Page 39: DAT 2800 Databaser I

SQL HiA

Nøkkel-transformering

32191

51877

77638

PNr ID

PNr = ID En-entydig sammenheng mellom PNr (Postnummer) og ID

32191

51877

77638

Ubenyttet1 … 10000

Page 40: DAT 2800 Databaser I

SQL HiA

Hash-tabeller

3434

6767

88

2121

7373

6262

6868

8686

66

77

1

2

3

4

5

6

7

8

9

10

1

2

3

4

5

6

7

8

9

10

33

44

11

22

55

88

IDID TransTrans

34 467 78 121 373 862 768 786 9

34

67

Page 41: DAT 2800 Databaser I

SQL HiA

Nøkkel-tranformering - Folding

Nøkkel-transformering

ID = 29384756 PostNr [ 1 - 1000 ]

2 9 3 8 4 7 5 6

7 6 9 4

7 7 0

+

+ 1

Page 42: DAT 2800 Databaser I

SQL HiA

Nøkkel-transformering - Divisjon-rest-metoden

Nøkkel-transformering

ID = 29384756 PostNr [ 1 - 1000 ]

2 9 3 8 4 7 5 6 : 9 9 7

1 7 5

Page 43: DAT 2800 Databaser I

SQL HiA

Nøkkel-tranformering - Uheldig tranformering

HSize = 10000KeySize = 8

HValueMax = 8 * 127 = 1016

1016

10000

Tranformering av hvert tegn i Keytil tilhørende ordinal-verdi:

Page 44: DAT 2800 Databaser I

SQL HiA

Ulike nøkkel-transformeringer

int Hash1(char* Key, int HSize){return ((int)Key[0] + (int)Key[1] + (int)Key[2]) % HSize;

}

TransformedKey Data

Key

int Hash2(char* Key, int HSize){return ((int)Key[0] + 27 * (int)Key[1] + 729 * (int)Key[2]) % HSize;

}

Page 45: DAT 2800 Databaser I

SQL HiA

Ulike nøkkel-transformeringer

Key KeySize i i

i

KeySize

*320

1

int Hash3(char* Key, int KeySize, int HSize){int HashVal;

HashVal = (int)Key[0];for(int i = 1; i < KeySize; i++)HashVal = HashVal*32 + (int)Key[i];

HashVal = HashVal % Hsize;return HashVal;

}

TransformedKey Data

Key

Page 46: DAT 2800 Databaser I

SQL HiA

Hashing a key to a database page - SQLBase

1. Transformer symbolsk key ved å la hvert tegn bli representert ved tilhørende ASCII-verdi.Deretter transformeres denne ASCII-verdien som vist nedenfor til et såkalt binært fullword (4 bytes).1A. Del ASCII-key inn i 4-byte enheter.1B. XOR alle 4-byte enhetene sammen til et 4-byte resultat (ingen key-del blir borte).1C. Utfør bitwise complement (fjerner event. bias)

2. Transformer resultatet fra 1 (binary fullword) til et heltall i side-intervalletved å ta divisjonsresten med minste primtall som er større enn eller lik antall sider.

3. Transformer output fra 2 til en fysisk side adresseved å legge til start side-nummer for for første rad i tabellen.

Page 47: DAT 2800 Databaser I

SQL HiA

Hashing a key to a database page - SQLBase - Eks

1. 9 3 0 5 E J S M --> 57 51 48 53 69 74 83 77ASCII

1A. Key1 = 57 51 48 53Key2 = 69 74 83 77

1B. Key1 = 0011 1001 0011 0011 0011 0000 0011 0101XOR Key2 = 0100 0101 0100 1010 0101 0011 0100 1101-------------------------------------------------------------------------= xKey = 0111 1100 0111 1001 0110 0011 0111 1000 = 124 121 99 120 ASCII

1C. ~xKey = 1000 0011 1000 0110 1001 1100 1000 0111 = 131 134 156 135 ASCIIbfKey = 2206637191 (fullword key)

2. Page Adresses 0 - 1752 (1753 hash buckets)2206637191 MOD 1753 = 1110

3. Første side-adresse for tabellen er 60 => Side-adresse = 1110 + 60 = 1170

Page 48: DAT 2800 Databaser I

SQL HiA

Flerbrukersystem Client / Server

DatabaseDBMSDBMS

Application_2Application_2

SQL-Request

Data

Application_3Application_3

Application_1Application_1

Client Server

Page 49: DAT 2800 Databaser I

SQL HiA

Update tap i flerbrukersystem uten lås

SELECT Count FROM Products ...

Answer: 139

UPDATE Products SET Count = 39

SELECT Count FROM Products ...

Answer: 139

UPDATE Products SET Count = 14

MID PID Count

...ACI 41 139...

MID PID Count

...ACI 41 39...

MID PID Count

...ACI 41 14...

Accept Order for 100

Accept Order for 125

Joe’s Program Products Table Mary’s Program

Page 50: DAT 2800 Databaser I

SQL HiA

Commit / Rollback problem i flerbrukersystem uten lås

SELECT Count FROM Products ...

Answer: 139

UPDATE Products SET Count = 39 SELECT Count

FROM Products ...

Answer: 39

MID PID Count

...ACI 41 139...

MID PID Count

...ACI 41 39...

MID PID Count

...ACI 41 139...

Accept Order for 100

Refuse Order for 125

Joe’s Program Products Table Mary’s Program

ROLLBACK

Page 51: DAT 2800 Databaser I

SQL HiA

Inkonistens problem i et flerbrukersystem uten lås

DELETE FROM Orders WHERE ...

SELECT * FROM Orders

OrderNr Amount

112961 $31.500113012 $03.745

UPDATE Program Orders Table Report Program

OrderNr Amount

112961 $31.500113012 $03.745

OrderNr Amount

112961 $31.500113012 $03.745113102 $05.000

Answer: 112961 $31.000

Answer: 113012 $03.745

INSERT INTO Orders VALUES (113102, $05.000)

COMMIT Answer: 113102 $05.000

Page 52: DAT 2800 Databaser I

SQL HiA

Låse-mekanismer

UPDATE Orders

SELECT FROM Offices

UPDATE Orders

UPDATE Offices

COMMIT

UPDATE Products

SELECT ... FROM Offices

COMMIT

Orders Offices ProductsU U U

Ok L A

L B Ok

Ok L A

Wait

Ok

Ok

Ok U U Ok

L B

U U Ok

Transaction A DBMS Transaction B

Page 53: DAT 2800 Databaser I

SQL HiA

Shared Lock / Exclusive Lock

UnlockedSharedLock

ExclusiveLock

Unlocked

SharedLock

ExclusiveLock

Ok Ok Ok

Ok Ok No

Ok No No

Transaction B

Transaction A

S-lås Shared Lock Settes på database-siden når en brukerleser (SELECT) fra databasen.

X-lås Exclusive Lock Settes på database-siden når en bruker skal gjøre en oppdatering (UPDATE),sletting (DELETE)eller innlegging av nye data (INSERT).

SQLBase opererer med låsing avdatabase-sider (pages)som hver er på 1 K.En database-side kan kuninneholde rader fra en tabell.

Page 54: DAT 2800 Databaser I

SQL HiA

Shared Lock / Exclusive Lock

UPDATE Orders

SELECT FROM Offices

UPDATE Orders

UPDATE Offices

COMMIT

UPDATE Products

SELECT ... FROM Offices

COMMIT

Orders Offices ProductsU U U

Ok EL A

EL B Ok

Ok SL A

SL A,B Ok

Ok SL A U Ok

Ok EL A

Ok U U

Transaction A DBMS Transaction B

SL = Shared LockEL = Exclusive Lock

Page 55: DAT 2800 Databaser I

SQL HiA

Dead Lock

UPDATE Orders

UPDATE Products

Orders ProductsU U

Ok EL A

EL B Ok

W

Ok

W

Transaction A DBMS Transaction B

SL = Shared LockEL = Exclusive Lock

UPDATE Products

UPDATE Orders

Page 56: DAT 2800 Databaser I

SQL HiA

Låse-mekanismer

• Database

• Tabell

• Side (Page) 1-2-4-16 K

• Rad

• Kolonne

Låse-mekanismer kan benyttes på følgende nivåer:

Økende parallell-prosessering.Økende kompleksitet.

SQLBase låser sider (pages) på 1K

Page 57: DAT 2800 Databaser I

SQL HiA

Database access cycle

Connect

Databaseoperations

Disconnect

Prepare (Compile)

Execute

Fetch (for a SELECT)

Select, Insert,Update, Delete, ...

Page 58: DAT 2800 Databaser I

SQL HiA

Connect / Disconnect

SqlDatabase DEMOSqlUser SYSADMSqlPassword SYSADM

SqlConnectSqlDisconnect

Predefinerte variable Default-verdier

Centura-funksjoner

Page 59: DAT 2800 Databaser I

SQL HiA

Connect / Disconnect Eksempel

Global Declarations…Variables

Sql Handle: hSqlBoolean: bConnect

...On SAM_AppStartup

Set SqlDatabase = ‘Handel’Set SqlDatabase = ‘BrukerA’Set SqlPassword = ‘PBrA’Set bConnect = SqlConnect ( hSql )

On SAM_AppExitIf bConnect

Call SqlDisconnect ( hSql )

Page 60: DAT 2800 Databaser I

SQL HiA

SqlHandle

Name of DbConnectionName of DbConnection

Sql Handle: hSql

Row Position in Result SetRow Position in Result Set

Input message bufferInput message buffer

Output message bufferOutput message buffer

Work Spacein Memory

Page 61: DAT 2800 Databaser I

SQL HiA

Compiling and Exexuting SQL statements

SqlPrepare : Kompilerer et SQL statement

SqlExecute : Eksekverer et SQL statement

SqlPrepareAndExecute : Kompilerer og eksekverer et SQL statement

Page 62: DAT 2800 Databaser I

SQL HiA

SELECT

1. Prepare (compile) SELECT statement2. Execute SELECT statement3. Benytt SqlFetch…

for å hente en rad inn i INTO variable

SqlFetchNext Henter neste rad i et resultatsettSqlFetchPrevious Henter forrige rad i et resultatsettSqlFetchRow Henter en gitt rad i et resultatsettSqlGetResultSetCount Returnerer antall rader i et resultatsettSqlSetResultSet Setter resultatsett mode på/av for gitt SqlHandle.

Følgende sletter et resultatsett:- Kompilering av et annet SQL statement for samme SqlHandle- Commit / Rollback hvis DBP_PRESERVE er av for denne SqlHandle

Page 63: DAT 2800 Databaser I

SQL HiA

Fetch-indikatorer

FETCH_Delete

FETCH_EOF

FETCH_Ok

FETCH_Update

Raden er slettet siden forrige henting

Ingen flere rader kan hentes

Henting Ok

Raden er endret (Update) siden forrige henting

SqlFetchNext ( hSql, nFetch )SqlFetchPrevious ( hSql, nFetch )SqlFetchRow ( hSql, nRow, nFetch )

Page 64: DAT 2800 Databaser I

SQL HiA

SqlImmediate

SqlImmediate

SqlConnectSqlPrepareSqlExecuteSqlFetchNext (SELECT)

SqlClearImmediate

Connect en intern SqlHandle,Prepare and Executea SQL Statement.

Disconnect SqlHandle fra SqlImmediate

Page 65: DAT 2800 Databaser I

SQL HiA

Funksjoner for database-parametre Set / Get

SqlSetParameter Setter databaseparametre

SqlSetParameterAll Setter databaseparametre

SqlSetInMessage Setter størrelse på InputMessageBuffer (1-32K)

SqlSetIsolationLevel Setter isolasjonsnivå i tilknytning til S-lås

SqlSetLockTimeout Setter ventetid (-1,0,1…1800s)

SqlSetOutMessage Setter størrelse på OutputMessageBuffer (1-32K)

Page 66: DAT 2800 Databaser I

SQL HiA

DBP_* parametre

DBP_AUTOCOMMIT On: Automatisk Commit ved SQL-statem.

DBP_BRAND Ulike databaser (DBV_BRAND_SQL, …)

DBP_FETCHTHROUGH On: Henter rader direkte fra datab.server

DBP_LOCKWAITTIMEOUT Tall som viser ventetid (-1,0,1…1800s)

DBP_NOPREBUILD On: Ingen prebuild av resultatsett ved ResultSetMode og RL.S-lås settes på gjeldende side.

DBP_PRESERVE On: Bevarer resultatsett ved Commit

DBP_ROLLBACKONTIMEOUT On: Rollback ved timeout

DBP_VERSION Database server versjon

Page 67: DAT 2800 Databaser I

SQL HiA

DBP_BRAND

DBV_BRAND_ALLBASE Hewlett-Packard ALLBASEDBV_BRAND_AS400 IBM AS/400DBV_BRAND_CINCOM-SUPRA Cincom SupraDBV_BRAND_DB2 IBM DB2DBV_BRAND_INFORMIX InformixDBV_BRAND_INFORMIX-ONLINE Informix OnlineDBV_BRAND_ORACLE OracleDBV_BRAND_ORACLE7 Oracle v.7DBV_BRAND_OS2EE IBM OS/2 EEDBV_BRAND_SQL SQLBaseDBV_BRAND_SYBASE SQL Server

Page 68: DAT 2800 Databaser I

SQL HiA

DBP_LOCKWAITTIMEOUT

Verdi Beskrivelse

1-1800 Ventetid for en lås ( 1 sek - 30 min, 300 s default )-1 Vent for evig0 Ingen venting

Page 69: DAT 2800 Databaser I

SQL HiA

Input / Output Message Buffer (as seen from Client)

DatabaseDBMSDBMS

ApplicationApplication

SQL-Request

Data

Input Message BufferInput Message Buffer

Input Message BufferInput Message Buffer

Output Message BufferOutput Message Buffer

hSql1

hSql2

Input Message BufferInput Message Buffer

Output Message BufferOutput Message Buffer

Input Message BufferInput Message Buffer

Output Message BufferOutput Message Buffer

hSql1 Input Message BufferInput Message Buffer

Output Message BufferOutput Message Buffer

Application 1

Application 2

Output Message BufferOutput Message Buffer

Page 70: DAT 2800 Databaser I

SQL HiA

Resultatsett

DatabaseDBMSDBMS

ApplicationApplication

SQL-Request

Data

SELECT SNr, Navn, PNrFROM SelgerWHERE PNr = 6400

SNr Navn PNr

5 Nilsen 50022 Olsen 64001 Hansen 90004 Berg 6400

Tabellen Selger

SNr Navn PNr

2 Olsen 64004 Berg 6400

Resultatsett

Client Server

Fetch

Page 71: DAT 2800 Databaser I

SQL HiA

Resultatsett

Et resultatsett er en temporær indeks,av og til assosiert med en temporær tabell (ved beregn. eller kompl. søk)som inneholder data som representerer resultatet av et SELECT-statementved spesielle komplekse spørringer.

Innholdet i resultatsettets løvsider er pekere (ROWIDs)til rader i tabeller som tilfredsstiller SELECT-statementet.

…..

RowID

Page 72: DAT 2800 Databaser I

SQL HiA

RowID

SELECT ….. SELECT …..

Resultat-settav

løv-pekere

Resultat-settav

løv-pekere

RowID 1RowID 2RowID 3

...

RowID 1RowID 2RowID 3

...

Resultat-settav

temporær tabell-data

Resultat-settav

temporær tabell-data

…..…..…..…..

…..…..…..…..

Page 73: DAT 2800 Databaser I

SQL HiA

Resultatsett - RowID - Single tabell

Resultat-settav

løv-pekere

Resultat-settav

løv-pekere

AABCAABE

AABCAABE

ROWID SNr Navn PNr

AABB 5 Nilsen 5002AABC 2 Olsen 6400AABD 1 Hansen 9000AABE 4 Berg 6400

Selger (ID = SNr)

SELECT SNr, NavnFROM SelgerWHERE PNr = 6400

Page 74: DAT 2800 Databaser I

SQL HiA

Resultatsett - RowID - Join

Resultat-settav

løv-pekere

Resultat-settav

løv-pekere

ROWID SNr Navn PNr

AABB 5 Nilsen 5002AABC 2 Olsen 6400AABD 1 Hansen 9000AABE 4 Berg 6400

Selger (ID = SNr)

SELECT Selger.SNr, Selger.Navn, Selger.PNr, Adr.StedFROM Selger, AdrWHERE Selger.PNr = Adr.PNrID AND

Selger.PNr = 6400

ROWID PNrID Sted

GGHA 5002 BergenGGHB 6400 MoldeGGHC 9000 Tromsø

Adr (ID = PNr)

Selger-RowID Adr-RowID--------------------------------------AABC GGHBAABE GGHB

Page 75: DAT 2800 Databaser I

SQL HiA

Resultatsett - RowID - Beregnede verdier

Resultat-settav

RowID til tmpTbl

Resultat-settav

RowID til tmpTbl

ROWID SNr Navn PNr

AABB 5 Nilsen 5002AABC 2 Olsen 6400AABD 1 Hansen 9000AABE 4 Berg 6400

Selger (ID = SNr)

SELECT Selger.SNr, Selger.Navn, SUM(Mg)FROM Selger, SalgWHERE Selger.SNrID = Salg.SNrIDGROUP BY Selger.SNr, Selger.Navn

XXAAXXABXXACXXAD

ROWID SNr VNr Mg

YYAA 5 8 30YYAB 2 1 20YYAC 2 3 10YYAD 1 5 50YYAE 1 8 40YYAF 4 1 70YYAG 4 3 50YYAH 4 5 20

Salg (ID = SNr + VNr)

RowID SNrID Navn Sum(Mg)--------------------------------------------XXAA 1 Hansen 90XXAB 2 Olsen 30XXAC 4 Berg 140XXAD 5 Nilsen 30

Temporær tabell med resultat-rader

Page 76: DAT 2800 Databaser I

SQL HiA

Sletting av Resultat-sett

Resultat-sett slettes vanligvis ved:

- Eier cursor/sqlHandle disconnectes- Eier cursor/sqlHandle rekompilerer SELECT-statementet.- Transaksjonen utfører COMMIT eller ROLLBACK.- Transaksjonen endrer gjeldende isolation mode.

Hvis cursor context preservation er satt på,gjelder følgende endringer fra regelen ovenfor:

- COMMIT sletter ikke resultatsettet- ROLLBACK sletter ikke resultatsettet

ved RL isolation level og ikke bruk av DDL.

bOk = SqlSetParameter ( hSql, DBP_PRESERVE, TRUE, ‘‘ )

Page 77: DAT 2800 Databaser I

SQL HiA

X-lås / S-lås

X-lås Settes alltid automatisk ved INSERT, UPDATE eller DELETE (DML). Varigheten er inntil COMMIT/ROLLBACK.

S-lås Settes alltid ved SELECT (DQL).Varigheten er avhengig av programmert isolasjons-nivå, men slippes alltid ved COMMIT/ROLLBACK.Typen av isolasjons-nivå har innvirkning på andre brukeres tilgang til databasenog tidsgyldigheten av resultatsettet.

Låser implementeres i SQLBase vha en intern HashTabell.

Page 78: DAT 2800 Databaser I

SQL HiA

Isolation Level - Consistency / Concurrency

RR (Read Repeatability) Alle sider som brukeren aksesserer (Fethed) er låst for andreinntil commit på transaksjonen.Garanterer lese-konsistens, men forårsaker mye venting.Default.

CS (Cursor Stability) Kun den siden som i øyeblikket prosesseres (Fetched) blir låst.En rad om gangen blir sendt til output message bufferpå serveren og over nettverket til klienten.Forårsaker større nettverkstrafikk.Rader i resultatsettet kan bli endret av andre.

RO (Read Only) Kun leseadgang.Ingen låser settes.Ved lesing av en side med lås, leses history-fil(er).

RL (Release Locks) Slipper låsen med en gang resultatsettet er ferdig generert.Gir andre brukere gode aksesseringsmuligheter.Ved fetch settes en S-lås (i tilfelle av en uncommited updatefra en annen transaksjon), men slippes straks etter fetch.

4 isolasjons-nivåer:

Gjelder for alle cursors i en transaksjon

Page 79: DAT 2800 Databaser I

SQL HiA

Isolation Level

bok = SqlSetIsolationLevel ( hSql, sIsolationLevel )

sIsolationLevel = RRCSRORL

RR (Read Repeatability er default).

Isolation Level som settes gjelder for alle cursorsi transaksjonen for denne brukeren.

Endring av Isolation Level medfører en implisitt Commit.

Page 80: DAT 2800 Databaser I

SQL HiA

RR - Read Repeatability

RR (Read Repeatability) Alle sider som brukeren aksesserer er låst for andreinntil commit på transaksjonen.Garanterer lese-konsistens, men forårsaker mye venting.

Row 1Row 2Row 3Row 4

Row 1Row 2Row 3Row 4

S-lås

S-lås

Resultatsett

Database sider (pages)

S-lås

Page 81: DAT 2800 Databaser I

SQL HiA

CS - Cursor Stability

CS (Cursor Stability) Kun den siden som i øyeblikket prosesseres (Fetched) blir låst.

En rad om gangen blir sendt til output message bufferpå serveren og over nettverket til klienten.Forårsaker større nettverkstrafikk.Rader i resultatsettet kan bli endret av andre.

Row 1Row 2Row 3Row 4

Row 1Row 2Row 3Row 4 S-lås

Resultatsett

Database sider (pages)

Fetch

Page 82: DAT 2800 Databaser I

SQL HiA

RO - Read Only

RO (Read Only) Kun leseadgang.Ingen låser settes.Ved lesing av en side med lås, leses history-fil(er).

xx

Row 1Row 2Row 3Row 4

Row 1Row 2Row 3Row 4 Lås fra annen bruker

Resultatsett

Database sider (pages)

Page 83: DAT 2800 Databaser I

SQL HiA

RL - Release Locks

RL (Release Locks) Slipper låsen med en gang resultatsettet er ferdig generert.Gir andre brukere gode aksesseringsmuligheter.Ved fetch settes en S-lås (i tilfelle av en uncommited updatefra en annen transaksjon), men slippes straks etter fetch.

Row 1Row 2Row 3Row 4

Row 1Row 2Row 3Row 4

S-lås som slippesstraks resultatsetteter ferdig generert

Resultatsett

Database sider (pages)

Fetch

S-lås settes ved Fetch-operasjon(pga evnt uncommited update),men slippes straks etter.

Page 84: DAT 2800 Databaser I

SQL HiA

FetchThrough

bOk = SqlSetParameter ( hSql, nParameter, nNumber, sString ) Syntaks

bOk = SqlSetParameter ( hSqlA, DBP_FETCHTHROUGH, TRUE, ‘‘ ) Eksempel

Row 1Row 2Row 3Row 4

Row 1Row 2Row 3Row 4

Resultatsett

Database sider (pages)

Fetch

DBP_FETCHTHROUGH

Page 85: DAT 2800 Databaser I

SQL HiA

Isolation Level

Isolation LevelIsolation Level Locks (S-Locks)Locks (S-Locks) Data ConsistencyData Consistency

RRRRLås holdes gjennomhele transaksjonen.Mer enn en sidekan være låst.

CSCS

Lås holdes kunpå den siden som inneholder gjeldende rad.

RORO

RLRL

Ingen lås.Ingen INSERT,UPDATE, DELETE.

Lås slippesstraks vedend-of-fetch(når resultatsetteter ferdig generert).

User ConcurrencyUser Concurrency

Høy Lav

Middels Middels

Høy Høyest

Lav Høy

Page 86: DAT 2800 Databaser I

SQL HiA

Data Consistency - User Concurrency

DataConsistency

UserConcurrency

RO RR CS RL RO

Page 87: DAT 2800 Databaser I

SQL HiA

Kriterier for valg av Isolation Level

1. Buffere : Hvor kritisk er gjenfinningshastigheten (performance) i applikasjonen?Hvis kritisk performance, velg et isolasjonsnivå hvor input message buffer på serverfylles helt med rader før oversending til client (unngå CS).

2. Contention : Hvis det forventes at mange brukere samtidig vil aksessere de samme sidene, ikke velg et isolasjonsnivå hvor S-låser plasseres på alle leste datainntil commit / rollback.

3. Update : Vil brukere i stor utstrekning benytte insert/update/delete?I så fall, velg et isolasjonsnivå som tillater disse operasjonene.

4. Consistency : Er konstistente data gjennom applikasjonen viktig?Hvis det er viktig at dataene vil beholde de samme verdiene inntil transaksjonenavsluttes, velg et isolasjonsnivå som holder S-lås inntil commit eller avslutt.

Page 88: DAT 2800 Databaser I

SQL HiA

Isolation Level - Kriterier

Isolation LevelIsolation Level Kriterie 1Buffere

Kriterie 1Buffere

RRRR JaJa

Kriterie 2Contention

Kriterie 2Contention

Kriterie 3Update

Kriterie 3Update

Kriterie 4Consistency

Kriterie 4Consistency

CSCS

RORO

RLRL

NeiNei

JaJa

JaJa

NeiNei

JaJa

JaJa

JaJa

JaJa

JaJa

NeiNei

JaJa

JaJa

NeiNei

JaJa

NeiNei

Page 89: DAT 2800 Databaser I

SQL HiA

Flerbruker-teknikk

1. Benytt Release Locks (RL) isolation level.

2. Benytt ROWID valideringsteknikk i tilknytning til UPDATE og DELETE.

3. Ikke endre DBP_NOPREBUILD fra default verdi (off).

Anbefaling ved SQLBase flerbrukerteknikk:

Page 90: DAT 2800 Databaser I

SQL HiA

Fetch / Update av resultatsett rader i SQLBase (1)

SqlFetchNext ( hSql, nFetch )SqlFetchPrevious ( hSql, nFetch )SqlFetchRow ( hSql, nRow, nFetch )

Row 1Row 2Row 3Row 4

Row 1Row 2Row 3Row 4

SlotSlot

RowSerialNr RowUpdateSerialNr

FetchrRowID

1

2

3

LesPage

Les nBit1 for DeleteTest

4

Les Row (med pRowID) fra Pagefor test på Delete/Insert (RowSerialNr)og Update (RowUpdateSerialNr)

Resultatet fra testene ovenfor returneres gjennom nFetch

nFetch = FETCH_Delete Slettet siden forrige hentingFETCH_EOF Slutten / Begynnelsen av resultatsettetFETCH_Ok Henting ok, raden er ‘korrekt’FETCH_Update Oppdatert siden forrige henting

Page

Row

ResultatSett

Page 91: DAT 2800 Databaser I

SQL HiA

Fetch av resultatsett rader i SQLBase (2)

Les rRowID i ResultatSett radLes Page ved å ved å benytte PageNumber i rRowIDLes nBit1 i SlotTable ved å benytte SlotKomponent i rRowIDIF nBit1 = 0

Row er slettet (av annen bruker)ELSE

Les Row fra Page ved å benytte offset i SlotTable. Les pRowID IF RowSerialNumber(pRowID) != RowSerialNumber(rRowID)

Raden er slettet og gjenbrukt av annen radELSE

IF RowUpdateSerialNumber(pRowID) != RowUpdateSerialNumber(rRowID)Raden er endret

ELSERaden i ResultatSett og Page er identiske

Page 92: DAT 2800 Databaser I

SQL HiA

RowID validitering

StartStart

OkOk

Prepare / Execute Select.Prepare / Execute Select.

RowIDOk

RowIDOk

Changed-rowprocessing

Changed-rowprocessing

EndEnd

FetchRowsFetchRows

User changes a rowUser changes a row

Prepare / Execute a DMLPrepare / Execute a DML

Errorprocessing

Errorprocessing

CommitCommit

No No

YesYes

Page 93: DAT 2800 Databaser I

SQL HiA

SQL Error

nError = SqlError (hSql) Returnerer siste gjeldende error kode for gitt sqlhandle.nError = 0 ved ingen sql-error.

bOk = SqlErrorText (nError, nType, strError, nLength, nRealLength)Henter feilmelding fra ERROR.SQL for gitt nError.nError : Gitt errornType : SQLERROR_Reason Error code reason

SQLERROR_Remedy Error messagestrError : Begrunnelse eller message tekstnLength : Maksimal lengde av strErrornRealLength: Aktuell lengde av strError

bOk = SqlGetErrorText ( nError, strText)Returnerer error fra ERROR.SQL for gitt nError.

bOk = SqlGetError (hSql, nError, strErrorString)Slår av backend error mapping og returnerer real backend error.Samme som SqlError og SqlGetErrorText ved SQLBase.

bOk = SqlGetErrorPosition (hSql, nPos)Returnerer offset error-posisjon i gitt SQL-statement.

Page 94: DAT 2800 Databaser I

SQL HiA

SQL Error

bOk = SqlExtractArgs (wParam, lParam, hSql, nError, nPos)

Ekstraherer error-informasjon fra SAM_SqlError argumentene wParam og lParam.

wParam : Verdien av wParam argument i SAM_SqlErrorlParam : Verdien av lparam argument i SAM-SqlErrorhSql : Receive Sql Handle.

Centura bestemmer denne fra wParam.nError : Receive Error Number.

Centura bestemmer denne verdien fra low-order word i lParam.nPos : Receive Error Position Number (offset innen SQL-statement).

Centura bestemmer denne verdien fra high-order word i lParam.

Page 95: DAT 2800 Databaser I

SQL HiA

SQL Error

Application Actions…On SAM_SqlError

Call SqlExtractArgs ( wParam, lParam, hSqlError, nErr, nPos )

……

When SqlError…

Page 96: DAT 2800 Databaser I

SQL HiA

SQL Error

StartStart

WhenSqlE.

WhenSqlE.

SqlE-WhenStatem.SqlE-WhenStatem.

ReturnReturn SAMSqlE.

SAMSqlE.

ReturnValueblir Sql*

function return

ReturnValueblir Sql*

function return

SqlE-WhenStatem.SqlE-WhenStatem.

SAMSqlE.

SAMSqlE.

ReturnValueblir Sql*

function return

ReturnValueblir Sql*

function return

DefaultError handling.

DefaultError handling.

EndEnd

Yes

No

Yes

No

Yes

No

Page 97: DAT 2800 Databaser I

SQL HiA

End