K10

97
SQL HiA DAT 2800 Databaser I Flerbrukerproblematikk

Transcript of K10

Page 1: K10

SQL HiA

DAT 2800Databaser I

Flerbrukerproblematikk

Page 2: K10

SQL HiA

Flerbrukersystem Client / Server

DatabaseDBMS

Application_2

SQL-Request

Data

Application_3

Application_1

Client Server

Page 3: K10

SQL HiA

Database-sider (Pages)

Physical Page No 1

1024 bytes total

Physical Page No 2

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: K10

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: K10

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: K10

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: K10

SQL HiA

Row Pages

Page HeaderRow Page Header

Freespace

Page Footer

Slot Table

Slot 5 Slot 4Slot 3 Slot 1Slot 2

Page 8: K10

SQL HiA

Row Pages

Page Header Row Page HeaderPhysicalPage No.

PageType Group No. Logical

Page No.PreviousPage No.

NextPage No.

LogPointer Slot Size Free

SpaceExtent

Page No.

Freespace

Slot TableEntry 1 Entry 2 Entry 3

Page Footer Log Pointer

Slot 5 Slot 4Slot 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: K10

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: K10

SQL HiA

RowID - Entydig rad-identifikator

RowID

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: K10

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 tabell

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

Page 12: K10

SQL HiA

Extent Pages

Page Header Row Page HeaderPhysicalPage No.

3

PageTypeROW

Group No.20

LogicalPage No.

PreviousPage No.

NextPage No.

LogPointer Slot Size Free

Space

ExtentPage No.

7Slot Table

Slot 2

Page Header Row Page HeaderPhysicalPage No.

7

PageType

EXTENT

Group No.20

LogicalPage No.

PreviousPage No.

NextPage No.

LogPointer Slot Size Free

Space

ExtentPage No.

15Slot Table

Slot 2

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

Page 13: K10

SQL HiA

Long VarChar Pages

Page Header Row Page HeaderPhysicalPage No.

3

PageTypeROW

Group No.20

LogicalPage No.

PreviousPage No.

NextPage No.

LogPointer Slot Size Free

Space

ExtentPage No.

1014Slot Table

Slot 2

Page Header Row Page HeaderPhysicalPage No.

7

PageType

LONG

Group No.20

LogicalPage No.

PreviousPage No.

NextPage No.

LogPointer Slot Size Free

Space

ExtentPage No.

1015Slot Table

Slot 2

Long VarChar kolonner plasseres i egne Long Pages

Page 14: K10

SQL HiA

Overflow Pages - Designed Overflow Pages

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

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

Page 15: K10

SQL HiA

Overflow Pages - Dynamically Created Overflow Pages

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

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

Page 16: K10

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: K10

SQL HiA

CREATE INDEX

Oppretter 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: K10

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: K10

SQL HiA

Clustered Index / Non-Clustered Index

Index

Data

Clustered Non-Clustered

Page 20: K10

SQL HiA

Indekser i form av trestruktur

…..

Page 21: K10

SQL HiA

Binært tre

42

817

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: K10

SQL HiA

Multiway tre

42 81

95 1077 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 61

Page 23: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

SQL HiA

Hashing / Nøkkel-transformering / Randomisering

HashingKey Transformed Key

Page 36: K10

SQL HiA

Nøkkel-transformering

123456789...

PNr

123456789...

ID

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

Page 37: K10

SQL HiA

Nøkkel-transformering

6 4 7 2 1KundeNr TverrSum

Distrikt

Page 38: K10

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: K10

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: K10

SQL HiA

Hash-tabeller

34

67

8

21

73

62

68

86

6

7

1

2

3

4

5

6

7

8

9

10

1

2

3

4

5

6

7

8

9

10

3

4

1

2

5

8

ID Trans

34 467 78 121 373 862 768 786 9

34

67

Page 41: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

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: K10

SQL HiA

Flerbrukersystem Client / Server

DatabaseDBMS

Application_2

SQL-Request

Data

Application_3

Application_1

Client Server

Page 49: K10

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: K10

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: K10

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: K10

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: K10

SQL HiA

Shared Lock / Exclusive Lock

Unlocked SharedLock

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: K10

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: K10

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: K10

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: K10

SQL HiA

Database access cycle

Connect

Databaseoperations

Disconnect

Prepare (Compile)

Execute

Fetch (for a SELECT)

Select, Insert,Update, Delete, ...

Page 58: K10

SQL HiA

Connect / Disconnect

SqlDatabase DEMOSqlUser SYSADMSqlPassword SYSADM

SqlConnectSqlDisconnect

Predefinerte variable Default-verdier

Centura-funksjoner

Page 59: K10

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: K10

SQL HiA

SqlHandle

Name of DbConnection

Sql Handle: hSql

Row Position in Result Set

Input message buffer

Output message buffer

Work Spacein Memory

Page 61: K10

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: K10

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: K10

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: K10

SQL HiA

SqlImmediate

SqlImmediate

SqlConnectSqlPrepareSqlExecuteSqlFetchNext (SELECT)

SqlClearImmediate

Connect en intern SqlHandle,Prepare and Executea SQL Statement.

Disconnect SqlHandle fra SqlImmediate

Page 65: K10

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: K10

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: K10

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: K10

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: K10

SQL HiA

Input / Output Message Buffer (as seen from Client)

DatabaseDBMS

Application

SQL-Request

Data

Input Message Buffer

Input Message Buffer

Output Message Buffer

hSql1

hSql2

Input Message Buffer

Output Message Buffer

Input Message Buffer

Output Message Buffer

hSql1 Input Message Buffer

Output Message Buffer

Application 1

Application 2

Output Message Buffer

Page 70: K10

SQL HiA

Resultatsett

DatabaseDBMS

Application

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: K10

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: K10

SQL HiA

RowID

SELECT …..

Resultat-settav

løv-pekere

RowID 1RowID 2RowID 3

...

Resultat-settav

temporær tabell-data

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

Page 73: K10

SQL HiA

Resultatsett - RowID - Single tabell

Resultat-settav

løv-pekere

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: K10

SQL HiA

Resultatsett - RowID - Join

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: K10

SQL HiA

Resultatsett - RowID - Beregnede verdier

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: K10

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: K10

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: K10

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: K10

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: K10

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

S-lås

S-lås

Resultatsett

Database sider (pages)

S-lås

Page 81: K10

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 S-lås

Resultatsett

Database sider (pages)

Fetch

Page 82: K10

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).

x

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

Resultatsett

Database sider (pages)

Page 83: K10

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

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: K10

SQL HiA

FetchThrough

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

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

Row 1Row 2Row 3Row 4

Resultatsett

Database sider (pages)

Fetch

DBP_FETCHTHROUGH

Page 85: K10

SQL HiA

Isolation Level

Isolation Level Locks (S-Locks) Data Consistency

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

CS

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

RO

RL

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

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

User Concurrency

Høy Lav

Middels Middels

Høy Høyest

Lav Høy

Page 86: K10

SQL HiA

Data Consistency - User Concurrency

DataConsistency

UserConcurrency

RO RR CS RL RO

Page 87: K10

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: K10

SQL HiA

Isolation Level - Kriterier

Isolation Level Kriterie 1Buffere

RR Ja

Kriterie 2Contention

Kriterie 3Update

Kriterie 4Consistency

CS

RO

RL

Nei

Ja

Ja

Nei

Ja

Ja

Ja

Ja

Ja

Nei

Ja

Ja

Nei

Ja

Nei

Page 89: K10

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: K10

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

Slot

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: K10

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: K10

SQL HiA

RowID validitering

Start

Ok

Prepare / Execute Select.

RowIDOk

Changed-rowprocessing

End

FetchRows

User changes a row

Prepare / Execute a DML

Errorprocessing

Commit

No No

YesYes

Page 93: K10

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: K10

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: K10

SQL HiA

SQL Error

Application Actions…On SAM_SqlError

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

……

When SqlError…

Page 96: K10

SQL HiA

SQL Error

Start

WhenSqlE.

SqlE-WhenStatem.

Return SAMSqlE.

ReturnValueblir Sql*

function return

SqlE-WhenStatem.

SAMSqlE.

ReturnValueblir Sql*

function return

DefaultError handling.

End

Yes

No

Yes

No

Yes

No

Page 97: K10

SQL HiA

End