Nej, med så lite data (beroende på typ av databashanterare kanske upp till några tusen rader!) gör ett index ingen skillnad på söktiderna. Alla data får plats i samma diskblock eller "page" (några kilobyte), och det som tar tid i en normal, diskbaserad databas är att hitta rätt diskblock. Men om man räknar med att tabellen växer mycket i framtiden bör man skapa ett index på färgen:
CREATE INDEX Robotfärgsindex ON Robotar (Färg);b) Ja, med så mycket data hjälper förmodligen ett index på färgen, som skapas på samma sätt som ovan.
c) Nej, då har kolumnen väldigt dålig selektivitet. Det går förmodligen fortare att läsa igenom hela tabellen från början till slut för att hitta alla blå robotar. Undantag om vi söker på någon av färgerna som en mycket liten andel av robotarna har.
Följdfråga: Varför skapar databashanteraren automatiskt index på kandidatnycklar? (Två skäl!)
Följdfråga till följdfrågan: Varför skapar databashanteraren inte automatiskt index på alla kolumnerna?
Däremot har vi (normalt) ingen nytta av kolumner som bara är med i resultatet, (som Robotar.Vikt). Om kolumnen redan har ett index (som primärnyckeln Robotar.Nummer) hjälper det inte att skapa ett till likadant.
Alltså:
Följdfråga: Spelar det någon roll om det är få eller många olika datum på striderna, och om det är få eller många olika färger på robotarna?
Ibland förenklar man och säger att man ska skapa index på de kolumner som nämns i WHERE-villkoret, men då får man alltså se upp lite.
Men frågeoptimerare kan vara mycket komplexa, och de programmerare som skriver dem är människor, så det kan förstås hända att frågeoptimeraren inte är perfekt. Det kan alltså finnas databashanterare som kör frågorna olika snabbt. Och är vi verkligen säkra på att alla frågorna är exakt ekvivalenta?
Följdfråga: Kan man göra på något annat sätt för att frågan ska gå snabbare att köra?
C: Man kanske lägger till en strid med samma nummer som en som redan fanns i tabellen Strider. Då är primärnyckeln plötsligt inte unik längre. Eller så tar man bort en strid, men tar inte bort raderna i tabellen Deltagare som handlar om den striden. Då är referensintegriteten bruten, och det står i databasen att robotar har deltagit i en strid som inte finns.
I: Två strider har just avslutats, en mellan robot 1 och 2 och en mellan robot 3 och 4. Två olika forskare från forskningsgruppen AASS sitter vid varsin dator och lägger in de nya striderna i databasen. Båda forskarna ser att det högsta numret på en strid just nu är 3, så de försöker lägga in strid nummer 4. Redan där blir det en krock, men om vi antar att de nöjer sig med en enda, gemensam strid nummer 4, så lägger den första forskaren in att robot 1 och 2 deltog i strid 4, och den andra att robot 3 och 4 också deltog i strid 4. Då ser det ut som om det var en strid mellan fyra olika robotar, och inte två olika strider mellan två robotar vardera.
D: Robot 3 har bantat, och väger nu bara 900 kilo i stället för ett helt ton. Roboten lägger in sin nya vikt i databasen och avslutar transaktionen med COMMIT. Glad och stolt över sin lyckade bantning vill roboten visa sin nya vikt för sina robotkompisar, men då har ändringen inte sparats ordentligt, så i databasen står det fortfarande 1000 kilo. De andra robotarna skrattar, och robot 3 blir ledsen.
Vad som är "rätt" beror på vad man menar. Det finns en standard för frågespråket SQL, och enligt den heter det START TRANSACTION, men SQL-standarden skrevs långt efter att många av databashanterarna skapades. Standarden är en kompromiss där alla databashanterartillverkarna ville få med just sin databashanterares egenheter och finesser. Ska man använda en databashanterare måste man alltid lära sig hur man skriver i just den databashanteraren.
Jo, som programmerare behöver man bry sig om att det kan uppstå deadlock. Om mitt program skickar en transaktion till databashanteraren, och den transaktionen plötsligt kan avbrytas för att hindra deadlock, måste jag skriva mitt program så att det kan hantera det. Programmet kan försöka på nytt med samma transaktion, eller kanske bara ge ett felmeddelande till slutanvändaren. (Det måste man ändå göra, för det kan alltid uppstå fel: det kan bli strömavbrott på databasservern, nätverket mellan min dator och databasservern kan sluta fungera, och så vidare.)
nummer | färg |
---|---|
1 | gul |
2 | grön |
Fråga 2:
nummer | färg |
---|---|
1 | gul |
2 | grön |
Fråga 3:
nummer | färg |
---|---|
2 | grön |
Fråga 4:
nummer | färg |
---|---|
1 | gul |
2 | grön |
Fråga 5:
nummer | färg |
---|---|
1 | gul |
2 | grön |
Fråga 6:
nummer | färg |
---|---|
1 | gul |
2 | grön |
3 | brun |
Fråga 7:
nummer | färg |
---|---|
1 | gul |
2 | grön |
3 | brun |
Fråga 8:
nummer | färg |
---|---|
1 | gul |
2 | grön |
3 | brun |
Fråga 9:
nummer | färg |
---|---|
1 | gul |
2 | grön |
3 | brun |
4 | grön |
Fråga 10 blir olika beroende på vilken metod för isolering som databashanteraren använder, men kan bli så här. Alternativt kan klient 2 stå och vänta i insert-kommandot.
nummer | färg |
---|---|
1 | gul |
2 | grön |
3 | brun |
4 | brun |
Följdfråga: Vad kommer att hända sen, när det finns två olika banan nummer 4? Kan det bli olika beroende vilken metod för isolering som databashanteraren använder?