<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=Rel%C3%A1ci%C3%B3s_lek%C3%A9rdez%C3%A9sek_optimaliz%C3%A1l%C3%A1sa</id>
	<title>Relációs lekérdezések optimalizálása - Laptörténet</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=Rel%C3%A1ci%C3%B3s_lek%C3%A9rdez%C3%A9sek_optimaliz%C3%A1l%C3%A1sa"/>
	<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Rel%C3%A1ci%C3%B3s_lek%C3%A9rdez%C3%A9sek_optimaliz%C3%A1l%C3%A1sa&amp;action=history"/>
	<updated>2026-04-28T10:41:22Z</updated>
	<subtitle>Az oldal laptörténete a wikiben</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://vik.wiki/index.php?title=Rel%C3%A1ci%C3%B3s_lek%C3%A9rdez%C3%A9sek_optimaliz%C3%A1l%C3%A1sa&amp;diff=139196&amp;oldid=prev</id>
		<title>Unknown user: Új oldal, tartalma: „{{GlobalTemplate|Infoszak|InfoMenRelacOptim}}   __TOC__ 	&lt;center&gt; {{InLineImageLink|Infoszak|InfoMenRelacOptim|lekredezes.PNG}}  &lt;/center&gt; ==Heurisztikus, szabály alap…”</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Rel%C3%A1ci%C3%B3s_lek%C3%A9rdez%C3%A9sek_optimaliz%C3%A1l%C3%A1sa&amp;diff=139196&amp;oldid=prev"/>
		<updated>2012-10-21T20:35:06Z</updated>

		<summary type="html">&lt;p&gt;Új oldal, tartalma: „{{GlobalTemplate|Infoszak|InfoMenRelacOptim}}   __TOC__ 	&amp;lt;center&amp;gt; {{InLineImageLink|Infoszak|InfoMenRelacOptim|lekredezes.PNG}}  &amp;lt;/center&amp;gt; ==Heurisztikus, szabály alap…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Új lap&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{GlobalTemplate|Infoszak|InfoMenRelacOptim}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
	&amp;lt;center&amp;gt; {{InLineImageLink|Infoszak|InfoMenRelacOptim|lekredezes.PNG}}  &amp;lt;/center&amp;gt;&lt;br /&gt;
==Heurisztikus, szabály alapú optimalizálás==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Módszer&amp;#039;&amp;#039;&amp;#039; : Reláció algebrai alakból felrajzolt fa optimalizálása. Lekérdezési fa elkészítése során célunk a lehető leggyorsabb alak kiválasztása:&lt;br /&gt;
* induljunk ki a kanonikus alakból (Descartes-szorzat, szűrés, projekció). &lt;br /&gt;
* lesüllyesztjük a szelekciókat&lt;br /&gt;
* átrendezzük a leveleket (először a kisebbeket descartes szorozzuk)&lt;br /&gt;
* join-ná alakítjuk a descatres-szorzat+szelekció-kat&lt;br /&gt;
* lesüllyesztjük a projekciókat&lt;br /&gt;
&lt;br /&gt;
===Műveletek===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Felmerül a kérdés, hogy két fa mikor ekvivalens?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;lásd slideok&amp;#039;&amp;#039; Használjuk ki a halmazműveletek(unió, metszet) kommutativitását és a join Descartes-szorzat és a halmazműveletek asszociativitását.&lt;br /&gt;
Összefoglalva a szabályokat:&lt;br /&gt;
* konjunktív szelekciós feltételeket szelekciós feltételek sorozatává bontjuk.&lt;br /&gt;
* szelekciós műveleteket felcseréljük a többi művelettel&lt;br /&gt;
* átrendezzük a leveleket&lt;br /&gt;
* a Descartes szorzatokat és a fölüttök lévő szelekciós kapcsolási feltételt egy join műveletté vonjuk össze.&lt;br /&gt;
* projekciós műveleteket lecseréljük a többi művelettel.&lt;br /&gt;
&lt;br /&gt;
==Költség alapú optimalizálás==&lt;br /&gt;
&lt;br /&gt;
A relációkról a rendelkezésre álló információk alapján kiszámolunk több végrehajtási tervre egy költséget, és az optimálisat kiválasztjuk. &lt;br /&gt;
&lt;br /&gt;
===Katalógusadatok===&lt;br /&gt;
&lt;br /&gt;
Ehhez katalógusadatokat tárolunk az egyes relációkról:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;n_r&amp;#039;&amp;#039;&amp;#039; az r rel-ben található rekordok száma (number)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;b_r&amp;#039;&amp;#039;&amp;#039; az r rel-et tartalmazó blokkok száma (block)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;s_r&amp;#039;&amp;#039;&amp;#039; egy rekord mérete (size)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;f_r&amp;#039;&amp;#039;&amp;#039; mennyi rekord fér egy blokkba (blocking factor) pl.: ha a rel rekordjai fizikailag együtt vannak tárolva, akkor b_r = [n_r/f_r]	(felső egész)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;V(A, r)&amp;#039;&amp;#039;&amp;#039; hány különböző értéke fordul elő az r rel-ben az A attr-nak&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SC(A, r)&amp;#039;&amp;#039;&amp;#039; selection cardinality, azon rekordok átlagos száma, amelyek egy kiválasztási feltételt kielégítenek. Pl.: ha A kulcs: SC(A, r)=1 illetve általánosan: SC(A, r) = n_k / V(A, r)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;f_i&amp;#039;&amp;#039;&amp;#039; fa struktúrájú index esetén (pl B*), pointer kimenetek átlagos száma (elágazási tényező)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;HT_i&amp;#039;&amp;#039;&amp;#039; az index szintjeinek a száma, Pl.: HT_i = [log f_i (V(A,r))]  (alsó egész), illetve hash esetén HT_i = 1&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;LB_i&amp;#039;&amp;#039;&amp;#039; a levélszintű indexblokkok száma (lowest level index block).&lt;br /&gt;
&lt;br /&gt;
===Hátrányok ===&lt;br /&gt;
&lt;br /&gt;
* a relációk elemszámának nyilvántartása nem triviális&lt;br /&gt;
* lekérdezni hosszú idő (~100 milliós rekordszámnál pl.)&lt;br /&gt;
* folyamatos frissítés is nagy overhead&lt;br /&gt;
* ezért pl. az ORACLE-nél külön, explicit módon kell frissíteni a katalógust (ANALYZE) itt még azt is meg lehet adni, hogy hány százaléka alapján analizálja az adatbázist&lt;br /&gt;
&lt;br /&gt;
===Költségszámítás===&lt;br /&gt;
&lt;br /&gt;
Felmerül a kérdés: hogyan határozzuk meg egy reláció költségét:&lt;br /&gt;
* igényelt és felhasznált erőforrások alapján?&lt;br /&gt;
* válaszidő alapján? (az összes rekord vagy az első válasz rekord válaszideje alapján?)&lt;br /&gt;
* kommunikációra fordított idő alapján? (elosztott rendszereknél fontos)&lt;br /&gt;
&lt;br /&gt;
A definicó szerint legyen egy reláció költsége a háttértár blokkolvasások és írások száma a válasz kiíratásának költsége nélkül (ugyanis a diszkolvasás ms nagyságrendű, a blokk feldolgozása pedig ennek pl. 100-ada). &lt;br /&gt;
Ez az érv kezdi érvényét veszteni, amikor ~100GB-os memóriák is vannak, és lehet az egész db-t memóriában tárolni. &lt;br /&gt;
&lt;br /&gt;
===Operációk, műveletek költsége===&lt;br /&gt;
&lt;br /&gt;
Ha a feltétel a kulcson van, akkor csak egy eredmény-sor van, és így csak egy eredmény-blokkot kell olvasni, ha nem a kulcson van, lehet, h többet is (SC(A, r)/f_r-t).&lt;br /&gt;
&lt;br /&gt;
====SELECT attribútum = alapján====&lt;br /&gt;
&lt;br /&gt;
E jelentése itt: Estimate &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A1&amp;#039;&amp;#039;&amp;#039; - lineáris keresés ktg: E_A1=b_r&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A2&amp;#039;&amp;#039;&amp;#039; - bináris keresés&lt;br /&gt;
** feltételezi, hogy a blokkok folyamatosan az A attribútum szerint rendezettek legyenek a diszkeken, illetve, hogy a szelekció feltétele az A attribútumon legyen.&lt;br /&gt;
** ktg &amp;#039;&amp;#039;&amp;#039;E_A2&amp;#039;&amp;#039;&amp;#039; = [log2(b_r)] + [SC(A,r)/f_r] -1 ,  ahol  az első tag: binárisan megkerünk 1 blokkot, a második tag: több rekord is egyezhet, ezek ennyi rekordban vannak, illetve a harmadik tag: az első blokk megtalálását kétszer számolnánk egyébként.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A3&amp;#039;&amp;#039;&amp;#039; - elsődleges indexszel, kulcsot vizsgálva&lt;br /&gt;
** ktg: &amp;#039;&amp;#039;&amp;#039;E_A3&amp;#039;&amp;#039;&amp;#039; = HT_i + 1 , ahol az első tag: indexfa végigjárása illetve a második tag: adatblokk beolvasása.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A4&amp;#039;&amp;#039;&amp;#039; - elsődleges indexszel, de ez nem kulcs&lt;br /&gt;
** ktg &amp;#039;&amp;#039;&amp;#039;E_A4&amp;#039;&amp;#039;&amp;#039; = HT_i + [SC(A, r)/f_r] , ahol első tag: indexfa végigjárása második tag: adatblokkok beolvasása&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A5&amp;#039;&amp;#039;&amp;#039; - másodlagos index használatával&lt;br /&gt;
** ktg: &amp;#039;&amp;#039;&amp;#039;E_A5&amp;#039;&amp;#039;&amp;#039; = HT_i + SC(A, r), ahol az első tag: indexfa végigjárása illetve a második tag: adatblokkok beolvasása (ui a blokkok nem sorban vannak egymás utáni blokkokban) &amp;#039;&amp;#039;&amp;#039;E_A5&amp;#039;&amp;#039;&amp;#039; = HT_i + 1 (ha A kulcs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SELECT összehasonlítás alapú szelekció: A&amp;lt;v====&lt;br /&gt;
&lt;br /&gt;
* ha v-t nem ismerjük: n_r/2-t kapunk vissza&lt;br /&gt;
* ha v-t ismerjük, egyenletes eloszlás esetén n_ált = n_r((v-min(A,r))/(max(A,r)-min(A,r)))&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A6&amp;#039;&amp;#039;&amp;#039; - elsődleges index használatával&lt;br /&gt;
** ha a v-t nem ismerjük &amp;#039;&amp;#039;&amp;#039;E_A6&amp;#039;&amp;#039;&amp;#039; = HT_i + b_r/2&lt;br /&gt;
** ha v-t ismerjük &amp;#039;&amp;#039;&amp;#039;E_A6&amp;#039;&amp;#039;&amp;#039; = HT_i + [c/f_r], ahol c a találati halmaz várható nagysága&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A7&amp;#039;&amp;#039;&amp;#039; -  másodlagos index &amp;#039;&amp;#039;&amp;#039;E_A7&amp;#039;&amp;#039;&amp;#039; = HT_i + LB_i/2 + n_r/2 , ahol az első tag: végigmegyünk az indexfán, a  második tag: az indexfa leveleit olvassuk illetve a harmadik tag: az adatblokkok olvasás. Ez igencsak nem gazdaságos, ugyanis, ha bután, kimerítően keresek, akkor b_r-nyit kell csak olvasni&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SELECT komplex szelekció====&lt;br /&gt;
&lt;br /&gt;
Mind a konjunkció és diszjunkció esetén nem bonyolultabb, mint egy szimpla szelekció becslése.&lt;br /&gt;
&lt;br /&gt;
====JOIN====&lt;br /&gt;
&lt;br /&gt;
* nested loop join&lt;br /&gt;
** worst case ktg: n_r*b_s + b_r (ha legalább az egyik belefér a memóriába, akkor a ktg b_r+b_s)&lt;br /&gt;
* block nested loop join&lt;br /&gt;
** 4 ciklus egymásban (2: 1-1 blokkok mindig felolvasok mind2 relációból + 2: blokkon belül illesztek&lt;br /&gt;
** worst-case ktg: b_r*b_s+b_r (sok memory: b_r+b_s)&lt;br /&gt;
* indexed nested-loop join&lt;br /&gt;
** az egyik rel-hez van indexünk&lt;br /&gt;
** az első alg-ot nézzük, a belső ciklusban az indexelt reláció legyen&lt;br /&gt;
** ktg: b_r+n_r*c , ahol a c a szelekció ktg-e s-en&lt;br /&gt;
* sorted merge-join&lt;br /&gt;
** a rel-kat a join feltételben meghatározott attr-ok mentén rendezzük, majd fésüljük&lt;br /&gt;
* hash-join&lt;br /&gt;
** az egyik rel-t hash-táblán keresztül érjük el, miközben a másik rel-t egy adott rekordjához illeszkedő rekordok keressük &lt;br /&gt;
* egyéb&lt;br /&gt;
** pl bitmap indexszel, bitmap join&lt;br /&gt;
&lt;br /&gt;
====Egyéb operációk====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;CSONK&amp;#039;&amp;#039;&amp;#039;  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workflow: Egy kifejezés kiértékelésnek módjai===&lt;br /&gt;
&lt;br /&gt;
* Materializáció: &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt; def &amp;lt;/span&amp;gt; A különböző részeredmény-táblákat a diszkre írjuk. Egyszerűen implementálható viszont sok háttértár műveletet igényel.&lt;br /&gt;
* Pipelineing: Szimultán kiértékelés, a részegységek az előttük álló elemből kapott eredményekből a sorban következő számára állítanak elő részeredményeket. Nincs szükség a teljes reláció előre kiszámolására. Ezáltal az ideiglenes tárolási igényeket minimalizálja, kicsi a memóriaigénye, viszont leszűkíti az alkalmazható algoritmusok körét.&lt;br /&gt;
&lt;br /&gt;
===A kiértékelési terv kiválasztása===&lt;br /&gt;
&lt;br /&gt;
A terv során válaszolnunk kell a következő kérdésekre:&lt;br /&gt;
* milyen műveleteket kívánunk elvégezni&lt;br /&gt;
* milyen sorrendben&lt;br /&gt;
* milyen algoritmus használatával&lt;br /&gt;
* milyen workflow szerint.&lt;br /&gt;
&lt;br /&gt;
Ha minden ekvivalens kifejezést (költség alapú optimalizáció) megvizsgálnának és minden formát kiértékelnénk (azzal a céllal, hogy a végén az optimálisat válasszuk ki), túl nagy terhelést jelentene a rendszer számára. Ezért Heurisztikus költség alapú optimalizálást érdemes használni. Mindezt &amp;#039;&amp;#039;&amp;#039;automatikusan&amp;#039;&amp;#039;&amp;#039; vagy *manuálisan*?&lt;br /&gt;
&lt;br /&gt;
Az &amp;#039;&amp;#039;&amp;#039;automata&amp;#039;&amp;#039;&amp;#039; szélesebb ismerettel rendelkezik a letárolt adatelemekről, gyorsabb a numerikus kiértékelési mechanizmusa, szisztematikusan értékel, algoritmusa több szakember együttes tudását hordozza, dinamikusan minden művelet előtt az aktuális feltételeket figyelembe véve értékel. Ezzel szemben az &amp;#039;&amp;#039;&amp;#039;ember&amp;#039;&amp;#039;&amp;#039; szélesebb általános ismerettel rendelkezik, a probléma szemantikai tartalmát megérti, nagyobb szabadsággal rendelkezik a felhasználható módszerek, eszközök tekintetében, illetve jobban fel van készítve a váratlan helyzetek kezelésére.&lt;br /&gt;
&lt;br /&gt;
==Lekérdezés optimalizálás csillagsémákon==&lt;br /&gt;
&lt;br /&gt;
Az Oracle 7-es verziójától érhető el, különbözik a korábbi filozófiától, nagyságrendekkel hatékonyabb: lényegében egy illesztés a ténytábla és a dimenziós táblák között. A dimenziós táblák join-jának kiküszöbölése, lehetőség az automatikus felismerésre. &lt;br /&gt;
Két ismert séma  ([http://en.wikipedia.org/wiki/Snowflake_schema hópihe],[http://en.wikipedia.org/wiki/Star_schema csillag] közül a csillagsémákon vizsgáltuk részletesen a lekérdezésoptimalizálást.&lt;br /&gt;
&lt;br /&gt;
===Hópihe séma===&lt;br /&gt;
&lt;br /&gt;
 A &amp;#039;&amp;#039;&amp;#039;hópihe sémáról&amp;#039;&amp;#039;&amp;#039; megemlítettük, hogy gyenge browsing teljesítménnyel rendelkezik ha növeljük a relációk számát. Itt a dimenziós táblák nem önmagukban állnak, hanem több tábla írja le a különböző hierarchia-szinteket. A gyakorlati tapasztalat azt mutatja, hogy az adattárház hozzáférések 80-90%-a dimenziók megfelelő kezelésével, a hatalmas lekérdezés előkészítésével foglalkozik. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;	&lt;br /&gt;
[http://learndatamodeling.com/snow_flake.htm {{InLineImageLink|Infoszak|InfoMenRelacOptim|snow_flake.gif}}]&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
===Csillag séma===&lt;br /&gt;
&lt;br /&gt;
A &amp;#039;&amp;#039;&amp;#039;csillag séma&amp;#039;&amp;#039;&amp;#039; kialakításának feltételi (Oracle):&lt;br /&gt;
* egyattribútumos bitmap index definiálása a tény valamennyi idegen kulcsára&lt;br /&gt;
* inicializáló paraméter beállítása (STAR_TRANSFORMATION_ENABLED should be set to TRUE)&lt;br /&gt;
* költségalapú optimalizálás használata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;	&lt;br /&gt;
[http://learndatamodeling.com/star.htm {{InLineImageLink|Infoszak|InfoMenRelacOptim|star_schema.gif}}]&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
===Bitmap (bittérkép) index===&lt;br /&gt;
&lt;br /&gt;
* lehetőleg alacsony kardinalitású attribútumot válasszunk (azaz kevés különböző érték forduljon elő)&lt;br /&gt;
* Pl.: Az alkalmazott nemének (férfi-nő) tárolására: definiálunk egy kétoszlopos indexet, az értékeknek megfelelően (annyi oszlop, ahány érték). A táblázat sorai a sorszámnak megfelelően be van indexelve külső kulccsal a relációhoz. &lt;br /&gt;
* mivel alacsony kitöltésű a táblázat, ezért tömöríteni szokták: a töredékére összenyomható&lt;br /&gt;
* bizonyos szelekciók kiértékelését nagyon meg tudja könnyíteni (a bitmap indexek jóval kisebbek, könnyebb vele bánni)&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Bitmap_index bővebben lásd wikipédia].&lt;br /&gt;
&lt;br /&gt;
===Csillag transzformáció===&lt;br /&gt;
&lt;br /&gt;
Az Oracle query optimalizáló modulja végzi el az SQL utasítás átírását, ahol ez hasznos lehet. A művelet két lépésből áll, elsőnek a szükséges  sorokat választja ki a tény táblából, ez a bitmap indexelés használata miatt igen hatékony. A második lépésben az így kapott eredményhalmazt ==JOIN== -oljuk a dimenziós táblákkal. &lt;br /&gt;
&lt;br /&gt;
[http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14223/schemas.htm Lássunk egy csillag queryt:]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ch.channel_class, c.cust_city, t.calendar_quarter_desc,&lt;br /&gt;
	SUM(s.amount_sold) sales_amount&lt;br /&gt;
FROM sales s, times t, customers c, channels ch&lt;br /&gt;
WHERE s.time_id = t.time_id&lt;br /&gt;
AND	s.cust_id = c.cust_id&lt;br /&gt;
AND	s.channel_id = ch.channel_id&lt;br /&gt;
AND	c.cust_state_province = &amp;#039;CA&amp;#039;&lt;br /&gt;
AND	ch.channel_desc in (&amp;#039;Internet&amp;#039;,&amp;#039;Catalog&amp;#039;)&lt;br /&gt;
AND	t.calendar_quarter_desc IN (&amp;#039;1999-Q1&amp;#039;,&amp;#039;1999-Q2&amp;#039;)&lt;br /&gt;
GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az első transzformációs lépés után a három &amp;#039;&amp;#039;&amp;#039;bitmap&amp;#039;&amp;#039;&amp;#039; (time_id, cust_id, channel_id) index felismerése után ==AND== operátorral kötjük össze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ... FROM sales&lt;br /&gt;
WHERE time_id IN&lt;br /&gt;
  (SELECT time_id FROM times &lt;br /&gt;
	WHERE calendar_quarter_desc IN(&amp;#039;1999-Q1&amp;#039;,&amp;#039;1999-Q2&amp;#039;))&lt;br /&gt;
	AND cust_id IN&lt;br /&gt;
  (SELECT cust_id FROM customers WHERE cust_state_province=&amp;#039;CA&amp;#039;)&lt;br /&gt;
	AND channel_id IN&lt;br /&gt;
  (SELECT channel_id FROM channels WHERE channel_desc IN(&amp;#039;Internet&amp;#039;,&amp;#039;Catalog&amp;#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az így kapott eredményhalmazon végül a dimenziók mentén ==JOIN== művelet következik. Ennek hatékonyságát növeli, hogy a bitmapnak köszönhetően effektíve egyetlen ==JOIN== művelet elegendő a dimenziónkénti ==JOIN== -ok helyett.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Megállapíthatjuk, hogy a csillagtranszformáció elég jól működik, ha a ==WHERE== predikátum kellően szelektív a tényrekordra, viszont ha sok tényrekord értintett az eredmény előállításában, akkor &amp;quot;full table scan&amp;quot; jobb lehet...&lt;br /&gt;
&lt;br /&gt;
-- [[AdamO|adamo]] - 2007.11.25.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Infoszak]]&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>