SQL ühendamisalgoritmid

Interaktiivne õppevahend andmebaasisüsteemide sisemise töö mõistmiseks.

Tabelite loomine:
CREATE TABLE Tellimus (
    tellimus_id INTEGER GENERATED ALWAYS AS IDENTITY,
    klient_kood INTEGER NOT NULL,
    CONSTRAINT pk_tellimus PRIMARY KEY (tellimus_id)
);

CREATE TABLE Tellimuse_rida (
    tellimus_id INTEGER NOT NULL,
    kaup_kood VARCHAR(10) NOT NULL,
    kogus SMALLINT NOT NULL,
    CONSTRAINT pk_tellimuse_rida PRIMARY KEY (tellimus_id, kaup_kood),
    CONSTRAINT fk_tellimuse_rida_tellimus 
      FOREIGN KEY (tellimus_id) 
      REFERENCES Tellimus (tellimus_id) ON DELETE CASCADE
);
Selgitus ja Indeksid:

Tabelitel on defineeritud primaarvõtmed, mis loovad automaatselt B+ puu indeksid (Clustered Index).

  • Tellimus: Andmed on ketastele salvestatud järjestatult tellimus_id järgi.
  • Tellimuse_rida: Andmed on salvestatud järjestatult tellimus_id (ja seejärel kaup_kood) järgi.

See tähendab, et andmebaas saab andmeid lugeda otse B+ puu lehtedelt (Leaf Nodes) juba sorteeritud kujul.

Pesastatud tsükkel

Võtab välisest tabelist rea ja otsib sisemisest vastet.

SELECT ... FROM Tellimus AS T INNER JOIN Tellimuse_rida AS TR ON T.tellimus_id = TR.tellimus_id WHERE T.klient_kood = 101;
Indeksi kasutamine: Väline tabel filtreeritakse. Iga leitud rea kohta tehakse sisemisse tabelisse Index Seek (B+ puu otsing), mis on väga kiire, sest ei pea tervet tabelit läbi lugema.
Visualiseerimine Samm 0 / 0
Väline: Tellimus (Filter: 101)
tellimus_idklient_kood
Sisemine: Tellimuse_rida (B+ Indeksi lehed)
tellimus_idkaup_koodkogus
Päringu tulemus:
tellimus_idklient_koodkaup_koodkogus

Ühildamisühendamine

Liigub mööda kahte sorteeritud nimekirja paralleelselt.

SELECT ... FROM Tellimus AS T INNER JOIN Tellimuse_rida AS TR ON T.tellimus_id = TR.tellimus_id ORDER BY T.tellimus_id;
Indeksi kasutamine: Kuna mõlemal tabelil on tellimus_id peal B+ puu indeks (primaarvõti), on andmed juba ketastel sorteeritud. Andmebaas teeb Index Scan (loeb B+ puu lehti järjest), seega eraldi sorteerimist pole vaja.
Visualiseerimine Samm 0 / 0
Tabel A: Indeksi skaneerimine (Tellimus)
tellimus_idklient_kood
Tabel B: Indeksi skaneerimine (Tellimuse_rida)
tellimus_idkaup_koodkogus
Päringu tulemus:
tellimus_idklient_koodkaup_koodkogus

Räsiühendamine

Loob mälus räsitabeli ja skaneerib teist tabelit.

SELECT T.tellimus_id, T.klient_kood FROM Tellimus AS T INNER JOIN Tellimuse_rida AS TR ON T.tellimus_id = TR.tellimus_id WHERE TR.kaup_kood = 'K002';
Indeksi kasutamine: Kuna filter on kaup_kood (mitte primaarvõti), ei saa B+ puu otsingut tõhusalt kasutada. Andmebaas teeb tõenäoliselt Full Scan (loeb kõik indeksi lehed läbi), et leida 'K002' ja ehitada räsitabel.
Visualiseerimine Samm 0 / 0
Mälus olev Räsitabel (Hash Table)
Tühi...
1. Ehitus (Tellimuse_rida - Scan)
tellimus_idkaup_koodkogus
2. Otsing (Tellimus - Scan)
tellimus_idklient_kood
Päringu tulemus:
tellimus_idklient_kood