Ugrás a fő tartalomra

PL-SQLDeveloper használat alapok 2

 PL-SQLDeveloper használat alapok 2


1. Tábla- és mezőnevek ellenőrzése SQL írás közben (Autocomplete, Intellisense)

🔧 Beállítás (ha még nem aktív):

  1. Menüsorban:
    Tools > Preferences

  2. Menüpont: Editor > Code Assistant

  3. Győződj meg róla, hogy a következő be van pipálva:

    • ✅ "Auto invocation"

    • ✅ "Include Tables/Views/Columns"

  4. (Opcióként): állítsd be az aktiválási karaktereket, pl. "." vagy "SPACE"


✍️ Használat közben:

  • Amikor írsz:

---sql
SELECT * FROM EMP
  • Írj egy . karaktert:

---sql
SELECT EMP. FROM EMP
  • Ekkor megjelenik az oszloplista a EMP tábla oszlopaival.

  • VAGY: gépeld a tábla nevét, majd nyomd meg:
    🔹 Ctrl + Space → előjön az automatikus kiegészítő

💡 Ez működik sémanévvel együtt is, pl. HR.EMPLOYEES. → kilistázza az oszlopokat.


🧭 2. Egy konkrét tábla, mező megkeresése és vizsgálata

🔍 A. Object Browser használata:

  1. Bal oldali panel: "Object Browser" (ha nem látszik: View > Object Browser)

  2. A lenyílóban válaszd ki a sémát (pl. HR, SCOTT, stb.)

  3. Kattints a "Tables" szekcióra

  4. Válaszd ki a kívánt táblát (pl. EMPLOYEES)

  5. Jobbra megjelenik:

    • Oszlopok nevei

    • Típus (NUMBER, VARCHAR2, DATE, stb.)

    • Méret (pl. VARCHAR2(50))

    • Kötelező-e (nullable)

    • Indexek: külön fülön (Indexes tab)


🔍 B. Jobb klikk → Describe (F4)

  1. Írj be egy tábla nevet az SQL ablakban, pl.:

---sql
EMPLOYEES
  1. Jelöld ki és nyomd meg:

    • F4 vagy

    • Jobb klikk → Describe

  2. Megnyílik egy ablak a következő adatokkal:

    • Oszlopnevek

    • Típus és méret

    • Indexek (külön fül)

    • Constraint-ek (pl. PK, FK)


🔎 3. SQL-lekérdezéssel: hol van a mező, milyen a típusa, hossza, indexelve van-e

Ha inkább SQL lekérdezéssel szeretnéd:

A. Egy oszlop tulajdonságai:

---sql
SELECT owner, table_name, column_name, data_type, data_length, nullable FROM all_tab_columns WHERE column_name = 'EMAIL'; -- csupa nagybetűvel!

Csak USER_TAB_COLUMNS-t használj, ha csak a saját sémád érdekel.


B. Hol van indexelve egy oszlop?

---sql
SELECT ic.table_name,
ic.column_name, ic.index_name, i.uniqueness, i.index_type FROM all_ind_columns ic JOIN all_indexes i ON ic.index_name = i.index_name WHERE ic.column_name = 'EMAIL';

Ez kilistázza az összes indexet, amely tartalmazza az adott mezőt, akár összetett indexben is.


🎯 Összefoglalva – hogyan ellenőrizz tábla/mező létezést, típust, indexet:

MódszerMire jóHogyan
🔄 Autocomplete (Ctrl+Space)Írás közbeni gyors ellenőrzésEditorban
📂 Object BrowserBöngészés, vizuális lekérdezésBal oldalon
🔍 F4 vagy DescribeTábla szerkezet, indexekSQL-ben kijelölve
🧾 SQL lekérdezésekMély adatmodell-vizsgálatALL_TAB_COLUMNS, ALL_INDEXES stb.




.


🎯 Cél: Információk az UGYFEL.UGYFEL_NEV mezőről

Amit meg akarunk tudni:

  1. Adattípus + hossz

  2. Kötelező-e (nullable?)

  3. Indexelve van-e (és ha igen, milyen index része)

  4. Constraint-ek (pl. UNIQUE, PRIMARY KEY, CHECK)


🔍 1. Adattípus, hossz, nullable

---sql
SELECT owner, table_name, column_name, data_type, data_length, data_precision, data_scale, nullable FROM all_tab_columns WHERE table_name = 'UGYFEL' AND column_name = 'UGYFEL_NEV';

✅ Ez megmondja:

  • VARCHAR2 vagy más típus

  • Hossza (pl. VARCHAR2(100))

  • Enged-e NULL értéket


🔐 2. Constraint-ek (PK, UK, CHECK, FK)

---sql
SELECT acc.constraint_name, acc.constraint_type, acc.table_name, acc.column_name, ac.status, ac.search_condition FROM all_cons_columns acc JOIN all_constraints ac ON acc.constraint_name = ac.constraint_name WHERE acc.table_name = 'UGYFEL' AND acc.column_name = 'UGYFEL_NEV';

Itt látszik:

  • C – Check constraint

  • P – Primary key

  • U – Unique

  • R – Foreign key (referencia más táblára)


📈 3. Index-információk az UGYFEL_NEV mezőről

---sql
SELECT i.index_name, i.index_type, i.uniqueness, ic.column_position, ic.column_name FROM all_indexes i JOIN all_ind_columns ic ON i.index_name = ic.index_name WHERE i.table_name = 'UGYFEL' AND ic.column_name = 'UGYFEL_NEV';

Megtudhatod:

  • Van-e index rajta

  • Az index egyedi-e (UNIQUE)

  • Egyéni vagy összetett indexben szerepel-e

  • Mi a pozíciója az indexen belül


🧭 Alternatíva: PL/SQL Developer-ben GUI-val

  1. Bal oldalon nyisd meg az Object Browser-t

  2. Válaszd a UGYFEL táblát (kereshetsz is rá fent)

  3. Kattints jobb gombbal → Describe (F4)

  4. Menj az alábbi fülekre:

    • Columns → típus, hossz, nullable

    • Constraints → PK, UK, CHECK

    • Indexes → melyik mező része


🧪 Példa eredmény (elképzelt)

TulajdonságÉrték
TípusVARCHAR2(100)
NullableNO (kötelező mező)
IndexelveIGEN (IX_UGYFEL_NEV)
Index típusaNormál, nem UNIQUE
ConstraintCHECK (pl. length > 2)

💡 TIPP – gyors keresés mező szerint:

Ha nem tudod, melyik táblában van a UGYFEL_NEV, de szeretnéd megtalálni:

---sql
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name = 'UGYFEL_NEV';

További szempontok

🧵 1. Lekérdezés: adott mezőnév keresése több táblában

🎯 Cél: Melyik tábla tartalmazza pl. az UGYFEL_NEV mezőt?

---sql
SELECT owner, table_name, column_name, data_type, data_length FROM all_tab_columns WHERE column_name = 'UGYFEL_NEV' ORDER BY owner, table_name;

✅ Ez megmondja, hol szerepel ez a mező (bármely sémában), milyen típusú és milyen hosszú.

💡 Tipp:

Ha részleges mezőnevekre keresnél, pl. minden *_NEV mezőre:

---sql
WHERE column_name LIKE '%_NEV'

⚙️ 2. Index optimalizálás javaslata adott mezőre

🔍 Kérdés: van-e rajta index, ha nincs, érdemes-e?

A. Megnézed, van-e index:

---sql
SELECT table_name, index_name, column_name
FROM all_ind_columns WHERE column_name = 'UGYFEL_NEV' AND table_name = 'UGYFEL';

B. Ha nincs, de gyakran van WHERE-ben, akkor érdemes:

---sql
-- Például, ha sok lekérdezésben használod így: SELECT * FROM ugyfel WHERE ugyfel_nev = 'Teszt';

És nincs index? Akkor:

---sql
CREATE INDEX ix_ugyfel_ugyfel_nev ON ugyfel(ugyfel_nev);

🧠 TIPP:

Ha a mező gyakran szerepel szűrési feltételben, vagy JOIN/ORDER BY műveletben, szinte biztosan megéri indexelni – kivéve, ha:

  • A mező nagyon alacsony kardinalitású (pl. csak 3 féle érték van benne)

  • A tábla kicsi (pár száz sor)


🐌 3. Elemzés: miért lassú egy mezőre futó lekérdezés

Tegyük fel, hogy ez a lekérdezés lassú:

---sql
SELECT * FROM ugyfel WHERE ugyfel_nev = 'Teszt';

📊 A. EXPLAIN PLAN használata:

---sql
EXPLAIN PLAN FOR SELECT * FROM ugyfel WHERE ugyfel_nev = 'Teszt'; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Ez megmutatja, hogy:

  • Full Table Scan történik-e (lassú)

  • Vagy használ-e indexet (gyors)

Ha FULL TABLE SCAN szerepel benne → nincs használható index.


🔍 B. Statikus lekérdezés optimalizálása – példák:

❌ Lassú változat:

---sql
SELECT * FROM ugyfel WHERE TRIM(ugyfel_nev) = 'Teszt';

Nem használ indexet, mert a TRIM függvény “elrontja” az optimalizálást

✅ Gyors változat:

---sql
SELECT * FROM ugyfel WHERE ugyfel_nev = 'Teszt';

Fontos elv: "Ahol lehet, ne alkalmazz függvényt az indexelt mezőre".


🔬 4. Teljesítmény-elemzés példa egy konkrét lekérdezéshez

Mondjuk ez a lekérdezés lassú:

---sql
SELECT u.ugyfel_id, u.ugyfel_nev, r.rendeles_id FROM ugyfel u JOIN rendeles r ON r.ugyfel_id = u.ugyfel_id WHERE u.ugyfel_nev = 'Teszt';

📌 Vizsgálat lépésenként:

  1. EXPLAIN PLAN

    --- sql
    EXPLAIN PLAN FOR SELECT ... SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
  2. Tábla statisztikák frissítése, ha hiányoznak:

    ---sql
    EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SAJATSHEMA', tabname => 'UGYFEL');
  3. Hiányzó indexek pótolása:

    ---sql
    CREATE INDEX ix_ugyfel_nev ON ugyfel(ugyfel_nev); CREATE INDEX ix_rendeles_ugyfel ON rendeles(ugyfel_id);
  4. SQL Trace vagy AWR Report (haladó):

    • ALTER SESSION SET sql_trace = TRUE;

    • Futtasd a lekérdezést

    • Nézd meg a .trc fájlt a USER_DUMP_DEST mappában



Nézzük meg a részleteket 


✅ 1. Lekérdezés: Mely mezők nincsenek indexelve, de gyakran szerepelnek WHERE-ben

🎯 Forrás: V$SQL és DBA_TAB_COLUMNS, DBA_IND_COLUMNS

sql
SELECT col.owner, col.table_name, col.column_name, COUNT(*) AS appearances_in_where FROM v$sql s JOIN dba_tab_columns col ON UPPER(s.sql_fulltext) LIKE '%' || col.column_name || '%' LEFT JOIN dba_ind_columns indcol ON col.owner = indcol.table_owner AND col.table_name = indcol.table_name AND col.column_name = indcol.column_name WHERE s.sql_fulltext LIKE '%WHERE%' AND indcol.column_name IS NULL -- nincs indexelve AND col.owner NOT IN ('SYS', 'SYSTEM') -- rendszer táblák kizárása GROUP BY col.owner, col.table_name, col.column_name HAVING COUNT(*) > 5 -- csak ha legalább 5x előfordul ORDER BY appearances_in_where DESC;

🧠 Mit csinál ez?

  • Átnézi a v$sql nézetben tárolt SQL-eket

  • Kikeresi, hogy milyen oszlopok szerepelnek WHERE-ben

  • Ellenőrzi, hogy ezek indexelve vannak-e

  • Kiszűri a nem indexelteket

  • Rangsorolja, melyik hányszor szerepel


✅ 2. Lekérdezés: Mező kardinalitása (szűrési erő)

🎯 Forrás: DBA_TAB_COL_STATISTICS

---sql
SELECT owner, table_name, column_name, num_distinct, density, num_nulls, sample_size, last_analyzed FROM dba_tab_col_statistics WHERE column_name = 'UGYFEL_NEV' AND table_name = 'UGYFEL';

🧠 Mit jelent?

  • NUM_DISTINCT: hány különböző érték szerepel a mezőben → magas érték = jól szűr

  • DENSITY: minél kisebb, annál jobb szűrő a mező

  • NUM_NULLS: hány sorban nincs érték

  • SAMPLE_SIZE: hány sor alapján becsültek


💡 Tipp: ha nincs friss statisztika

----sql
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SAJATSHEMA', tabname => 'UGYFEL');

🧩 Példák értelmezésére:

Columnnum_distinctdensityMegjegyzés
UGYFEL_ID1,000,0000.000001Tökéletes index jelölt (jó szűrő)
UGYFEL_NEV10,0000.0001Jó szűrő (név alapú keresés)
STATUSZ30.3Rossz szűrő (alacsony kardinalitás)





Megjegyzések