<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Optimalizace_dotazu_nad_STAR_sch%C3%A9matem</id>
	<title>Optimalizace dotazu nad STAR schématem - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Optimalizace_dotazu_nad_STAR_sch%C3%A9matem"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Optimalizace_dotazu_nad_STAR_sch%C3%A9matem&amp;action=history"/>
	<updated>2026-06-02T19:09:59Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Optimalizace_dotazu_nad_STAR_sch%C3%A9matem&amp;diff=457&amp;oldid=prev</id>
		<title>imported&gt;Pavel v 18. 6. 2009, 14:26</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Optimalizace_dotazu_nad_STAR_sch%C3%A9matem&amp;diff=457&amp;oldid=prev"/>
		<updated>2009-06-18T14:26:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;PostgreSQL nepodporuje optimalizaci &amp;quot;star&amp;quot; schéma. Star schéma je určené pro analytické dotazy - v případě relačních databází pro takzvané ROLAP dotazy. V tomto schématu máme tabulku faktů - která obsahuje pouze cizí klíče a tzv. dimenze.&lt;br /&gt;
&lt;br /&gt;
Dotaz na podmnožinu tabulky faktů by mohl vypadat následovně:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * &lt;br /&gt;
  from f &lt;br /&gt;
       join t1 &lt;br /&gt;
       on t1.a = r1 &lt;br /&gt;
       join t2 &lt;br /&gt;
       on t2.a = r2 &lt;br /&gt;
       join t3 &lt;br /&gt;
       on t3.a = r3 &lt;br /&gt;
       join t4 &lt;br /&gt;
       on t4.a = r4 &lt;br /&gt;
       join t5 &lt;br /&gt;
       on t5.a = r5 &lt;br /&gt;
       join t6 &lt;br /&gt;
       on t6.a = r6 &lt;br /&gt;
       join t7 &lt;br /&gt;
       on t7.a = r7 &lt;br /&gt;
       join t8 &lt;br /&gt;
       on t8.a = r8 &lt;br /&gt;
       join t9 &lt;br /&gt;
       on t9.a = r9 &lt;br /&gt;
       join t10 &lt;br /&gt;
       on t10.a = r10 &lt;br /&gt;
  where t2.v = &amp;#039;uajecanehfsiqfjrallqnybkehswupufxnkjpjztyiyznprkeykorpszcgwychqxiktnstrkdpaszhrvccumylzwixirsoblqek&amp;#039;     &lt;br /&gt;
    and t8.v = &amp;#039;eldnkuxotjcjmihdsxcsglejsxwvppydelsxmirtnmcbisazuiyxossrgofngqwidcixmdzmokuxeqqaucahobxvuocvpvtbzdl&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
PostgreSQL zvolí plán, kdy se postupně filtrují hodnoty a připojují dimensionální tabulky. V tomto případě by ovšem bylo výhodnější co nejdříve omezit tabulku faktů - což bohužel za nás optimalizátor neprovede, a je nutná ruční optimalizace. První možností je kartézský součin dimenzionálních tabulek se známými hodnotami. Tato optimalizace zrychlila dotaz z cca 370 ms na 80 ms.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select *                                                                                                                                                         from f                                                                                                                                                                      join t1                                                                                                                                                                on t1.a = r1                                                                                                                                                &lt;br /&gt;
       join (select t2.a as t2a, t8.a as t8a, t2.v, t8.v &lt;br /&gt;
                from t2,t8 &lt;br /&gt;
               where t2.v = &amp;#039;uajecanehfsiqfjrallqnybkehswupufxnkjpjztyiyznprkeykorpszcgwychqxiktnstrkdpaszhrvccumylzwixirsoblqek&amp;#039; &lt;br /&gt;
                 and t8.v = &amp;#039;eldnkuxotjcjmihdsxcsglejsxwvppydelsxmirtnmcbisazuiyxossrgofngqwidcixmdzmokuxeqqaucahobxvuocvpvtbzdl&amp;#039; offset 0) dim &lt;br /&gt;
       on dim.t2a = r2 and dim.t8a = r8 &lt;br /&gt;
       join t3 &lt;br /&gt;
       on t3.a = r3 &lt;br /&gt;
       join t4 &lt;br /&gt;
       on t4.a = r4 &lt;br /&gt;
       join t5 &lt;br /&gt;
       on t5.a = r5 &lt;br /&gt;
       join t6 &lt;br /&gt;
       on t6.a = r6 &lt;br /&gt;
       join t7 &lt;br /&gt;
       on t7.a = r7  &lt;br /&gt;
       join t9 on t9.a = r9 &lt;br /&gt;
       join t10 &lt;br /&gt;
       on t10.a = r10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Další možností je použití korelovaných poddotazů. Pozor - po transformovaný dotaz není 100% ekvivalentní původnímu dotazů - může zobrazit některé řádky, které by díky INNER JOINu nebyly zobrazeny. Optimalizace je efektivní pouze tehdy, je-li výsledek řádově menší než tabulka faktů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select (select v from t1 where a = r1), &lt;br /&gt;
       (select v from t2 where a = r2), &lt;br /&gt;
       (select v from t3 where a = r3), &lt;br /&gt;
       (select v from t4 where a = r4), &lt;br /&gt;
       (select v from t5 where a = r5), &lt;br /&gt;
       (select v from t6 where a = r6), &lt;br /&gt;
       (select v from t7 where a = r7),&lt;br /&gt;
       (select v from t8 where a = r8),&lt;br /&gt;
       (select v from t9 where a = r9), &lt;br /&gt;
       (select v from t10 where a = r10)  &lt;br /&gt;
   from f &lt;br /&gt;
  where f.r2 in (select a from t2 where t2.v = &amp;#039;uajecanehfsiqfjrallqnybkehswupufxnkjpjztyiyznprkeykorpszcgwychqxiktnstrkdpaszhrvccumylzwixirsoblqek&amp;#039; offset 0) &lt;br /&gt;
    and f.r8 in (select a from t8 where t8.v = &amp;#039;eldnkuxotjcjmihdsxcsglejsxwvppydelsxmirtnmcbisazuiyxossrgofngqwidcixmdzmokuxeqqaucahobxvuocvpvtbzdl&amp;#039; offset 0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tato optimalizace urychlila dotaz z původních 370 ms na 20 ms.&lt;br /&gt;
&lt;br /&gt;
Poslední varianta je nejrychlejší - nicméně v případě, že pravděpodobně bude nejcitlivější na počet vrácených řádků - po dosažení určitého prahu se může jednat o nejpomalejší metodu.&lt;br /&gt;
&lt;br /&gt;
Vstupem byla náhodně vygenerovaná tabulka faktů o 10 sloupcích a 800 tis. řádcích. V praxi bývá tabulka faktů několikanásobně širší a větší.&lt;br /&gt;
==Odkazy==&lt;br /&gt;
* http://www.dwoptimize.com/2007/06/cartesian-product-of-dimensions.html&lt;br /&gt;
* http://en.wikipedia.org/wiki/Star_schema&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>