CTE - wyjasnienie

K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 24
0

Cześć,
Czy możecie w jakiś przystępny sposób wyjaśnić mi zasadę i potrzebę stosowania CTE (z select) na bazie danych?
Najlepiej jakiś prosty praktyczny przykład.
Z góry dzieki

pozdrawiam

BlackBad
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 454
MY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1107
0

Prosto to możesz sobie tłumaczyć jako tabelę tymczasową która jest tworzona na czas wykonywania zapytania. Możesz jej używać w całym zapytaniu, łączyć z innymi fizycznymi tabelami bądź innymi CTE, agregować i co tylko sobie zażyczysz. Analogicznie jak tzw. derived tables które się zapisuje w stylu:

Kopiuj
select * from (select sum(a.fld_a), sum(b.fld_b), a.fld_c from table_a a join table_b b on a.id = b.id group by a.fld_c)

Zamiast używać takiej formuły dla mnie osobiście wygodniej użyć CTE i zapisać to jako:

Kopiuj
witch CTE_TEMP as(
  select sum(a.fld_a), sum(b.fld_b) from table_a a join table_b b on a.id = b.id group by a.fld_c
)
select * from CTE_TEMP
MY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1107
0

@hauleth jakimś tam mega specem od zapytań nie jestem. Nie mniej jednak z moich doświadczeń wynika, że w 99% plan zapytania w Firebirdzie w przypadku CTE oraz zapytania skorelowanego był taki sam. Nie mniej jednak ja jakichś tam bardzo skomplikowanych zapytań nie robię. Nie mniej jednak faktycznie może być tak jak piszesz. Dlatego pisząc ręcznie zapytania zawsze przeglądam plany i od razu widać, że coś nie tak.

Nie mniej jednak z ciekawości sprawdziłem zapytanie oraz plan takie zapytanie jak pokazałeś i Firebird wybrał mi rekord korzystając z indeksu za pomocą jednego odczytu.:

Kopiuj
Query
------------------------------------------------
WITH tmp AS (SELECT * FROM TABLE) SELECT id FROM tmp WHERE id = 89446

Plan
------------------------------------------------
PLAN (TMP TABLEINDEX (PK_TABLE))

Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 0,00 ms
Avg fetch time: 0,00 ms

Memory
------------------------------------------------
Current: 9 181 296
Max    : 9 467 296
Buffers: 2 048

Operations
------------------------------------------------
Read   : 2
Writes : 0
Fetches: 9
Marks  : 0


Enchanced Info:
+--------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|  Table Name        |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                    |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+--------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|TABLE               |    953923 |         1 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
+--------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+

Zaś plan zapytania był taki sam jak w przypadku zwykłego selecta bez CTE

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.