2. SQL HiA
Flerbrukersystem Client / Server
DatabaseDBMSDBMS
Application_2Application_2
SQL-Request
Data
Application_3Application_3
Application_1Application_1
Client Server
3. 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
4. SQL HiA
Lister av ulike typer database-sider
1 Page Group Log Prior Next
Type No Ptr Page Page
Data 3 1 0 7
1st page in product table
7 Page Group Log Prior Next
Type No Ptr Page Page
Data 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: Data
Index
Control
Logisk nummerering (1, 2, …) av sider innen samme gruppe
5. SQL HiA
Grupper av database-sider
Data pages Selve dataene i databasen
Row pages Tabell-rader
Extent Pages Kolonner som ikke får plass i Row pages
Long VarChar pages Long VarChar kolonner
Overflow pages Plassmangel ved clustered hashing
Designed overflow pages Preallokering ved clustered hashing
Dynamically created overflow pages Designed overflow page full
Index pages Inneholder B+
-tre indekser
Control pages Generelle kontroll-opplysninger
Database control block Versjonsnr, log-info, ...
Free extent list Liste av ikke-allokerte pages
Group free page list Gruppe-allokerings info (B+
-tre)
Group extent map Log pages --> Physical pages info
Bitmap pages Freespace info for hver tabell
Row count page Antall rader pr tabell
Table data page Siste rad serial nr, page nr for siste rad,
tabell størrelse, antall overflow pages.
6. SQL HiA
Row Pages
1 Page Group Log Prior Next
Type No Ptr Page Page
Data 3 1 0 7
Row Page
1st page in product table
7 Page Group Log Prior Next
Type No Ptr Page Page
Data 3 2 1 19
Row 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
8. SQL HiA
Row Pages
Page HeaderPage Header Row Page HeaderRow Page Header
Physical
Page No.
Physical
Page No.
Page
Type
Page
Type Group No.
Group No. Logical
Page No.
Logical
Page No.
Previous
Page No.
Previous
Page No.
Next
Page No.
Next
Page No.
Log
Pointer
Log
Pointer Slot Size
Slot Size Free
Space
Free
Space
Extent
Page No.
Extent
Page 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 inneholder
info om før/etter-situasjon
ved evnt endringer.
Sikkerhet ved 512 byte lagring
9. 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 tabell
i en felles UPDATE / INSERT.
Tilordnes sekvensielt (1,2,…).
Benyttes til UPDATE-tap ved
Cursor Stabilitet (CS) og
Release Lock (RL) isolasjonsnivå,
samt uendelig UPDATE / INSERT loop.
Eks: UPDATE TABLE Y
Set x = x + 1
WHERE x > 10
10. SQL HiA
RowID - Entydig rad-identifikator
RowIDRowID
Page No.
Fysisk
sidenummer
hvor raden
befinner seg.
Slot No.
Slot nummer
innen siden
hvor 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 å gjenfinne
en tabell-rad fra databasen
Verifiserer hvorvidt
raden fortsatt
okkuperer
denne lokasjonen
eller er slettet
og eventuelt
erstattet av en annen rad
Verifiserer
eventuell oppdatering
av raden
11. SQL HiA
RowID
RowID SNr Navn PNr
CAAD 5 Nilsen 5002
BACV 2 Olsen 6400
ERCB 1 Hansen 9000
EADD 4 Berg 6400
Selger (ID = SNr)
SNr Navn PNr
5 Nilsen 5002
2 Olsen 6400
1 Hansen 9000
4 Berg 6400
Selger (ID = SNr)
Et eksempel på en 3NF-tabell Selger
med tre kolonner
SNr, Navn og PNr
RowID er en ekstra kolonne i hver tabell
som alltid kommer i tillegg til de kolonnene
vi eksplisitt definerer.
RowID er entydig for hver rad
og fungerer som en slags identifikator.
12. SQL HiA
Extent Pages
Page HeaderPage Header Row Page HeaderRow Page Header
Physical
Page No.
3
Physical
Page No.
3
Page
Type
ROW
Page
Type
ROW
Group No.
20
Group No.
20
Logical
Page No.
Logical
Page No.
Previous
Page No.
Previous
Page No.
Next
Page No.
Next
Page No.
Log
Pointer
Log
Pointer Slot Size
Slot Size Free
Space
Free
Space
Extent
Page No.
7
Extent
Page No.
7
Slot Table
Slot 2
Page HeaderPage Header Row Page HeaderRow Page Header
Physical
Page No.
7
Physical
Page No.
7
Page
Type
EXTENT
Page
Type
EXTENT
Group No.
20
Group No.
20
Logical
Page No.
Logical
Page No.
Previous
Page No.
Previous
Page No.
Next
Page No.
Next
Page No.
Log
Pointer
Log
Pointer Slot Size
Slot Size Free
Space
Free
Space
Extent
Page No.
15
Extent
Page No.
15
Slot Table
Slot 2
Inneholder kolonner som ikke får plass i opprinnelig Row Page
13. SQL HiA
Long VarChar Pages
Page HeaderPage Header Row Page HeaderRow Page Header
Physical
Page No.
3
Physical
Page No.
3
Page
Type
ROW
Page
Type
ROW
Group No.
20
Group No.
20
Logical
Page No.
Logical
Page No.
Previous
Page No.
Previous
Page No.
Next
Page No.
Next
Page No.
Log
Pointer
Log
Pointer Slot Size
Slot Size Free
Space
Free
Space
Extent
Page No.
1014
Extent
Page No.
1014
Slot Table
Slot 2
Page HeaderPage Header Row Page HeaderRow Page Header
Physical
Page No.
7
Physical
Page No.
7
Page
Type
LONG
Page
Type
LONG
Group No.
20
Group No.
20
Logical
Page No.
Logical
Page No.
Previous
Page No.
Previous
Page No.
Next
Page No.
Next
Page No.
Log
Pointer
Log
Pointer Slot Size
Slot Size Free
Space
Free
Space
Extent
Page No.
1015
Extent
Page No.
1015
Slot Table
Slot 2
Long VarChar kolonner plasseres i egne Long Pages
14. SQL HiA
Overflow Pages - Designed Overflow Pages
Page 1
Page 1
Page 2
Page 2
Page 3
Page 3
Page N
Page N... Page 1
Page 1
Page 2
Page 2
Page 3
Page 3
Page N
Page N...
Avsettes plass til eventuelle overløps-rader for hver N page
15. SQL HiA
Overflow Pages - Dynamically Created Overflow Pages
Page 1
Page 1
Page 2
Page 2
Page 3
Page 3
Page N
Page N... Page 1
Page 1
Page 2
Page 2
Page 3
Page 3
Page N
Page N...
Hvis et ikke er plass til overløps-poster i Designed Overflow Pages,
opprettes dynamiske overløps-sider.
16. 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å data
i 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.
17. SQL HiA
CREATE INDEX
Oppretter en indeksOppretter en indeks
EATE INDEX index name
UNIQUE CLUSTERED HASHED
,
table name ( column name )
ASC
DESC
CTFREE integer constant SIZE integer value ROWS
BUCKET
Max size = 6 + number of + sum of <= 255
columns in length of all
index columns in
index
18. SQL HiA
CREATE INDEX - Eksempel
CREATE UNIQUE CLUSTERED HASHED INDEX hSNdx
ON Selger (SNrID)
SIZE 100 ROWS
CREATE UNIQUE INDEX Bidndx
ON Bedrift (BedriftsID)
CREATE INDEX BnNdx
ON Bedrift (BedriftsNavn)
CREATE INDEX SNavnNdx
ON BEDRIFT (@UPPER(Navn))
21. 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.
22. 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
23. 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.
24. 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
25. 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
26. 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:-
27. 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
28. 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
29. 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:-
33. 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:
34. SQL HiA
Prefix B+
-tre
Prefix B+-tre er et B+-tre
hvor kun den delen av Key som er nødvendig mht entydighet
lages i index-nodene.
Avkortede Key-verdier
SQLBase benytter Prefix B+
-tre
43. SQL HiA
Nøkkel-tranformering - Uheldig tranformering
HSize = 10000
KeySize = 8
HValueMax = 8 * 127 = 1016
1016
10000
Tranformering av hvert tegn i Key
til tilhørende ordinal-verdi:
44. SQL HiA
Ulike nøkkel-transformeringer
int Hash1(char* Key, int HSize)
{
return ((int)Key[0] + (int)Key[1] + (int)Key[2]) % HSize;
}
Transformed
Key Data
Key
int Hash2(char* Key, int HSize)
{
return ((int)Key[0] + 27 * (int)Key[1] + 729 * (int)Key[2]) % HSize;
}
45. SQL HiA
Ulike nøkkel-transformeringer
[ ]Key KeySize i i
i
KeySize
−
=
−
∑ *32
0
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;
}
Transformed
Key Data
Key
46. 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-intervallet
ved å ta divisjonsresten med minste primtall som er større enn eller lik antall sider.
3. Transformer output fra 2 til en fysisk side adresse
ved å legge til start side-nummer for for første rad i tabellen.
48. SQL HiA
Flerbrukersystem Client / Server
DatabaseDBMSDBMS
Application_2Application_2
SQL-Request
Data
Application_3Application_3
Application_1Application_1
Client Server
49. 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
50. 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
51. SQL HiA
Inkonistens problem i et flerbrukersystem uten lås
DELETE FROM Orders
WHERE ...
SELECT *
FROM Orders
OrderNr Amount
112961 $31.500
113012 $03.745
UPDATE Program Orders Table Report Program
OrderNr Amount
112961 $31.500
113012 $03.745
OrderNr Amount
112961 $31.500
113012 $03.745
113102 $05.000
Answer:
112961 $31.000
Answer:
113012 $03.745
INSERT INTO Orders
VALUES
(113102, $05.000)
COMMIT Answer:
113102 $05.000
52. SQL HiA
Låse-mekanismer
UPDATE Orders
SELECT
FROM Offices
UPDATE Orders
UPDATE Offices
COMMIT
UPDATE Products
SELECT ...
FROM Offices
COMMIT
Orders Offices Products
U U U
Ok L A
L B Ok
Ok L A
Wait
Ok
Ok
Ok U U Ok
L B
U U Ok
n A DBMS Transaction
53. SQL HiA
Shared Lock / Exclusive Lock
Unlocked
Shared
Lock
Exclusive
Lock
Unlocked
Shared
Lock
Exclusive
Lock
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 bruker
leser (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 av
database-sider (pages)
som hver er på 1 K.
En database-side kan kun
inneholde rader fra en tabell.
54. SQL HiA
Shared Lock / Exclusive Lock
UPDATE Orders
SELECT
FROM Offices
UPDATE Orders
UPDATE Offices
COMMIT
UPDATE Products
SELECT ...
FROM Offices
COMMIT
Orders Offices Products
U 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
n A DBMS Transaction
SL = Shared Lock
EL = Exclusive Lock
55. SQL HiA
Dead Lock
UPDATE Orders
UPDATE Products
Orders Products
U U
Ok EL A
EL B Ok
W
Ok
W
n A DBMS Transaction
SL = Shared Lock
EL = Exclusive Lock
UPDATE Products
UPDATE Orders
56. 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
59. SQL HiA
Connect / Disconnect Eksempel
Global Declarations
…
Variables
Sql Handle: hSql
Boolean: bConnect
...
On SAM_AppStartup
Set SqlDatabase = ‘Handel’
Set SqlDatabase = ‘BrukerA’
Set SqlPassword = ‘PBrA’
Set bConnect = SqlConnect ( hSql )
On SAM_AppExit
If bConnect
Call SqlDisconnect ( hSql )
60. 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 Space
in Memory
61. SQL HiA
Compiling and Exexuting SQL statements
SqlPrepare : Kompilerer et SQL statement
SqlExecute : Eksekverer et SQL statement
SqlPrepareAndExecute : Kompilerer og eksekverer et SQL statement
62. SQL HiA
SELECT
1. Prepare (compile) SELECT statement
2. Execute SELECT statement
3. Benytt SqlFetch…
for å hente en rad inn i INTO variable
SqlFetchNext Henter neste rad i et resultatsett
SqlFetchPrevious Henter forrige rad i et resultatsett
SqlFetchRow Henter en gitt rad i et resultatsett
SqlGetResultSetCount Returnerer antall rader i et resultatsett
SqlSetResultSet 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
65. 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)
66. 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
67. SQL HiA
DBP_BRAND
DBV_BRAND_ALLBASE Hewlett-Packard ALLBASE
DBV_BRAND_AS400 IBM AS/400
DBV_BRAND_CINCOM-SUPRA Cincom Supra
DBV_BRAND_DB2 IBM DB2
DBV_BRAND_INFORMIX Informix
DBV_BRAND_INFORMIX-ONLINE Informix Online
DBV_BRAND_ORACLE Oracle
DBV_BRAND_ORACLE7 Oracle v.7
DBV_BRAND_OS2EE IBM OS/2 EE
DBV_BRAND_SQL SQLBase
DBV_BRAND_SYBASE SQL Server
71. 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-statement
ved spesielle komplekse spørringer.
Innholdet i resultatsettets løvsider er pekere (ROWIDs)
til rader i tabeller som tilfredsstiller SELECT-statementet.
…..
RowID
73. SQL HiA
Resultatsett - RowID - Single tabell
Resultat-sett
av
løv-pekere
Resultat-sett
av
løv-pekere
AABC
AABE
AABC
AABE
ROWID SNr Navn PNr
AABB 5 Nilsen 5002
AABC 2 Olsen 6400
AABD 1 Hansen 9000
AABE 4 Berg 6400
Selger (ID = SNr)
SELECT SNr, Navn
FROM Selger
WHERE PNr = 6400
74. SQL HiA
Resultatsett - RowID - Join
Resultat-sett
av
løv-pekere
Resultat-sett
av
løv-pekere
ROWID SNr Navn PNr
AABB 5 Nilsen 5002
AABC 2 Olsen 6400
AABD 1 Hansen 9000
AABE 4 Berg 6400
Selger (ID = SNr)
SELECT Selger.SNr, Selger.Navn, Selger.PNr, Adr.Sted
FROM Selger, Adr
WHERE Selger.PNr = Adr.PNrID AND
Selger.PNr = 6400
ROWID PNrID Sted
GGHA 5002 Bergen
GGHB 6400 Molde
GGHC 9000 Tromsø
Adr (ID = PNr)
Selger-RowID Adr-RowID
--------------------------------------
AABC GGHB
AABE GGHB
75. SQL HiA
Resultatsett - RowID - Beregnede verdier
Resultat-sett
av
RowID til tmpTbl
Resultat-sett
av
RowID til tmpTbl
ROWID SNr Navn PNr
AABB 5 Nilsen 5002
AABC 2 Olsen 6400
AABD 1 Hansen 9000
AABE 4 Berg 6400
Selger (ID = SNr)
SELECT Selger.SNr, Selger.Navn, SUM(Mg)
FROM Selger, Salg
WHERE Selger.SNrID = Salg.SNrID
GROUP BY Selger.SNr, Selger.Navn
XXAA
XXAB
XXAC
XXAD
ROWID SNr VNr Mg
YYAA 5 8 30
YYAB 2 1 20
YYAC 2 3 10
YYAD 1 5 50
YYAE 1 8 40
YYAF 4 1 70
YYAG 4 3 50
YYAH 4 5 20
Salg (ID = SNr + VNr)
RowIDSNrID Navn Sum(Mg)
--------------------------------------------
XXAA 1 Hansen 90
XXAB 2 Olsen 30
XXAC 4 Berg 140
XXAD 5 Nilsen 30
Temporær tabell med resultat-rader
76. 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, ‘‘ )
77. 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 databasen
og tidsgyldigheten av resultatsettet.
Låser implementeres i SQLBase vha en intern HashTabell.
78. SQL HiA
Isolation Level - Consistency / Concurrency
RR (Read Repeatability) Alle sider som brukeren aksesserer (Fethed) er låst for andre
inntil 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 buffer
på 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 update
fra en annen transaksjon), men slippes straks etter fetch.
4 isolasjons-nivåer:
Gjelder for alle cursors i en transaksjon
79. SQL HiA
Isolation Level
bok = SqlSetIsolationLevel ( hSql, sIsolationLevel )
sIsolationLevel = RR
CS
RO
RL
RR (Read Repeatability er default).
Isolation Level som settes gjelder for alle cursors
i transaksjonen for denne brukeren.
Endring av Isolation Level medfører en implisitt Commit.
80. SQL HiA
RR - Read Repeatability
RR (Read Repeatability) Alle sider som brukeren aksesserer er låst for andre
inntil commit på transaksjonen.
Garanterer lese-konsistens, men forårsaker mye venting.
Row 1
Row 2
Row 3
Row 4
Row 1
Row 2
Row 3
Row 4
S-lås
S-lås
Resultatsett
Database sider (pages)
S-lås
81. 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 buffer
på serveren og over nettverket til klienten.
Forårsaker større nettverkstrafikk.
Rader i resultatsettet kan bli endret av andre.
Row 1
Row 2
Row 3
Row 4
Row 1
Row 2
Row 3
Row 4
S-lås
Resultatsett
Database sider (pages)
Fetch
82. 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 1
Row 2
Row 3
Row 4
Row 1
Row 2
Row 3
Row 4
Lås fra annen bruker
Resultatsett
Database sider (pages)
83. 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 update
fra en annen transaksjon), men slippes straks etter fetch.
Row 1
Row 2
Row 3
Row 4
Row 1
Row 2
Row 3
Row 4
S-lås som slippes
straks resultatsettet
er ferdig generert
Resultatsett
Database sider (pages)
Fetch
S-lås settes
ved Fetch-operasjon
(pga evnt uncommited update),
men slippes straks etter.
85. SQL HiA
Isolation Level
Isolation LevelIsolation Level Locks (S-Locks)Locks (S-Locks) Data ConsistencyData Consistency
RRRR
Lås holdes gjennom
hele transaksjonen.
Mer enn en side
kan være låst.
CSCS
Lås holdes kun
på den siden
som inneholder
gjeldende rad.
RORO
RLRL
Ingen lås.
Ingen INSERT,
UPDATE, DELETE.
Lås slippes
straks ved
end-of-fetch
(når resultatsettet
er ferdig generert).
User ConcurrencyUser Concurrency
Høy Lav
Middels Middels
Høy Høyest
Lav Høy
87. 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å server
fylles 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 data
inntil 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 transaksjonen
avsluttes, velg et isolasjonsnivå som holder S-lås inntil commit eller avslutt.
89. 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:
90. SQL HiA
Fetch / Update av resultatsett rader i SQLBase (1)
SqlFetchNext ( hSql, nFetch )
SqlFetchPrevious ( hSql, nFetch )
SqlFetchRow ( hSql, nRow, nFetch )
Row 1
Row 2
Row 3
Row 4
Row 1
Row 2
Row 3
Row 4
Slot
Slot
RowSerialNr RowUpdateSerialNr
Fetch
rRowID
1
2
3
Les
Page
Les nBit1 for DeleteTest
4
Les Row (med pRowID) fra Page
for test på Delete/Insert (RowSerialNr)
og Update (RowUpdateSerialNr)
Resultatet fra testene ovenfor returneres gjennom nFetch
nFetch = FETCH_Delete Slettet siden forrige henting
FETCH_EOF Slutten / Begynnelsen av resultatsettet
FETCH_Ok Henting ok, raden er ‘korrekt’
FETCH_Update Oppdatert siden forrige henting
Page
Row
ResultatSett
91. SQL HiA
Fetch av resultatsett rader i SQLBase (2)
Les rRowID i ResultatSett rad
Les Page ved å ved å benytte PageNumber i rRowID
Les nBit1 i SlotTable ved å benytte SlotKomponent i rRowID
IF 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 rad
ELSE
IF RowUpdateSerialNumber(pRowID) != RowUpdateSerialNumber(rRowID)
Raden er endret
ELSE
Raden i ResultatSett og Page er identiske
92. SQL HiA
RowID validitering
StartStart
OkOk
Prepare / Execute Select.Prepare / Execute Select.
RowID
Ok
RowID
Ok
Changed-row
processing
Changed-row
processing
EndEnd
FetchRowsFetchRows
User changes a rowUser changes a row
Prepare / Execute a DMLPrepare / Execute a DML
Error
processing
Error
processing
CommitCommit
No No
YesYes
93. 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 error
nType : SQLERROR_Reason Error code reason
SQLERROR_Remedy Error message
strError : Begrunnelse eller message tekst
nLength : Maksimal lengde av strError
nRealLength: 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.
94. 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_SqlError
lParam : Verdien av lparam argument i SAM-SqlError
hSql : 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.
96. SQL HiA
SQL Error
StartStart
When
SqlE.
When
SqlE.
SqlE-WhenStatem.SqlE-WhenStatem.
ReturnReturn SAM
SqlE.
SAM
SqlE.
ReturnValue
blir Sql*
function return
ReturnValue
blir Sql*
function return
SqlE-WhenStatem.SqlE-WhenStatem.
SAM
SqlE.
SAM
SqlE.
ReturnValue
blir Sql*
function return
ReturnValue
blir Sql*
function return
Default
Error handling.
Default
Error handling.
EndEnd
Yes
No
Yes
No
Yes
No
SQL er standard databasespråk for relasjons-databaser.
Indekser er hjelpeinformasjon for raskere å kunne gjenfinne poster (records)
i en database.
Ofte benyttes såkalte B-trær som indekser (typisk på fremmednøkler).
På ID benyttes av og til såkalte Hashtabeller.
Hashtabellene inneholder transformerte ID (tranformert til en post-adresse).
Hash1 gir dårlig spredning.
Bl.a. vil ID_1 = abc og ID_2 = cba gi samme adresse.
Has2 gir en noe bedre spredning idet nøkkelen nå utgjør et posisjons-system
ved at endret rekkefølge av elementene i ID gir ulik adresse.