Queer European MD passionate about IT

piani_di_accesso.tex 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. % !TEX root = ../main.tex
  2. \subsection{Query a}
  3. \paragraph{Piano di accesso logico della query a}
  4. \begin{center}
  5. \begin{forest}
  6. [{$\pi^{b}$ e.Titolo, sw.Url}
  7. [{$\bowtie$ e.IdEdizione = sw.IdEdizione}
  8. [{$\sigma$e.Titolo $>=$'G' $\wedge$ e.Titolo $<$ 'H'}
  9. [Edizioni e]
  10. ]
  11. [SitiWeb sw]
  12. ]
  13. ]
  14. \end{forest}
  15. \end{center}
  16. \paragraph{Piano di accesso fisico della query a senza indici}
  17. \begin{center}
  18. \begin{forest}
  19. [{Project(\{e.Titolo, sw.Url\})}
  20. [{SortMerge(e.IdEdizione = sw.IdEdizione)}
  21. [{Sort(\{e.IdEdizione\})}
  22. [{Project(\{e.Titolo, e.IdEdizione\})}
  23. [{Filter(e.Titolo $>=$ 'G' AND e.Titolo $<$ H)}
  24. [{TableScan(Edizioni e)}]
  25. ]
  26. ]
  27. ]
  28. [{Sort(\{sw.IdEdizione\})}
  29. [{Project(\{sw.Url, sw.IdEdizione\})}
  30. [{TableScan(SitiWeb sw)}]
  31. ]
  32. ]
  33. ]
  34. ]
  35. \end{forest}
  36. \end{center}
  37. \paragraph{Piano di accesso fisico della query a con due indici}
  38. \begin{center}
  39. \begin{forest}, baseline, qtree
  40. [{Project(\{e.Titolo, sw.Url\})}
  41. [{IndexNestedLoop(e.IdEdizione = sw.IdEdizione)}
  42. [{IndexFilter(Edizioni e, IndETit,\\ e.Titolo $>=$ 'G' AND e.Titolo $<$ H)}]
  43. [{IndexFilter(SitiWeb sw, IndSWIdEd,\\ e.IdEdizione = sw.IdEdizione)}]
  44. ]
  45. ]
  46. \end{forest}
  47. \end{center}
  48. Indici necessari: \texttt{IndETit} (indice della tabella Edizioni sull’attributo Titolo) e \texttt{IndSWIdEd} (indice della tabella SitiWeb sulla chiave IdEdizione).
  49. \subsection{Query b}
  50. \paragraph{Piano di accesso logico della query b}
  51. \begin{center}
  52. \begin{forest}
  53. [{$\tau$(\{$-$TempoTotaleLettura\})}
  54. [{$\pi^{b}$ v.IdUtente, SUM(v.TempoLettura) TempoTotaleLettura}
  55. [{$\sigma$ SUM(v.TempoLettura) $>$ 10}
  56. [{\{v.IdUtente\} $\gamma$ \{SUM(v.TempoLettura)\}}
  57. [{$\sigma$ v.TempoLettura $<$ 60}
  58. [{Visite v}]
  59. ]
  60. ]
  61. ]
  62. ]
  63. ]
  64. \end{forest}
  65. \end{center}
  66. L’output dell’operatore $\gamma$ è già proiettato sulle sole dimensioni di analisi e risultati delle
  67. funzioni di aggregazione, non occorrerebbe proiettare su \texttt{\{v.IdUtente, SUM(v.TempoLettura)\}}; lo faccio per poter rinominare in TempoTotaleLettura il risultato della SUM.
  68. Nella $\tau$, l’ordinamento discendente è reso dal segno `$-$' per convenzione (in questo caso comunque il tipo è numerico).
  69. \paragraph{Piano di accesso fisico della query b senza indici}
  70. \begin{center}
  71. \begin{forest}
  72. [{Sort(\{$-$TempoTotaleLettura\})}
  73. [{Project(\{v.IdUtente, SUM(v.TempoLettura) TempoTotaleLettura\})}
  74. [{Filter(SUM(v.TempoLettura) $>$ 10)}
  75. [{GroupBy(\{v.IdUtente\}, \{SUM(v.TempoLettura)\})}
  76. [{Sort(\{v.IdUtente\})}
  77. [{Project(\{v.IdUtente, v.TempoLettura\})}
  78. [{Filter(v.TempoLettura $<$ 60)}
  79. [{TableScan(Visite v)}]
  80. ]
  81. ]
  82. ]
  83. ]
  84. ]
  85. ]
  86. ]
  87. \end{forest}
  88. \end{center}
  89. \clearpage
  90. \paragraph{Piano di accesso fisico della query b con indici}
  91. \begin{center}
  92. \begin{forest}, baseline, qtree
  93. [{Sort(\{$-$TempoTotaleLettura\})}
  94. [{Project(\{v.IdUtente, SUM(v.TempoLettura) TempoTotaleLettura\})}
  95. [{GroupBy(\{v.IdUtente\}, \{SUM(v.TempoLettura)\})}
  96. [{\sout{Project(\{v.IdUtente, v.TempoLettura\})}}
  97. [{IndexFilter(Visite v, IndVIdUt, v.TempoLettura $<$ 60)}
  98. ]
  99. ]
  100. ]
  101. ]
  102. ]
  103. ]
  104. ]
  105. \end{forest}
  106. \end{center}
  107. Indice necessario: \texttt{IndVIdUt} (indice della tabella Visite sull’attributo IdUtente).
  108. Non occorre ordinare prima di raggruppare: l’output di IndexFilter è già ordinato sull’insieme di attributi dell’indice (in questo caso \texttt{\{v.IdUtente\}}), che coincide nel nostro caso con l’insieme delle dimensioni di analisi.
  109. Non occorre nemmeno proiettare su \texttt{\{v.IdUtente, v.TempoLettura\}} prima del raggruppamento, in quanto la groupby può ricevere il record direttamente dalla IndexFilter e scartare gli attributi non rilevanti (cioè quelli che non sono dimensione di analisi né input delle funzioni di aggregazione).
  110. \vfill
  111. \subsection{Query c}
  112. \paragraph{Piano di accesso logico della query c}
  113. \begin{center}
  114. \begin{forest}, baseline, qtree
  115. [{$\pi$ a.IdArticolo, a.Titolo, COUNT(*) NumeroVisite,\\SUM(v.TempoLettura) TempoTotaleLettura}
  116. [{$\sigma$ COUNT(*) $>=$ 3}
  117. [{\{a.IdArticolo, a.Titolo\} $\gamma$ \{COUNT(*), SUM(v.TempoLettura)\}}
  118. [{$\bowtie$ a.IdArticolo = v.IdArticolo}
  119. [{$\sigma$ a.Premium = 'N'}
  120. [{Articoli a}]
  121. ]
  122. [{Visite v}]
  123. ]
  124. ]
  125. ]
  126. ]
  127. \end{forest}
  128. \end{center}
  129. \clearpage
  130. \paragraph{Piano di accesso fisico della query c senza indici}
  131. \begin{center}
  132. \begin{forest}, baseline, qtree
  133. [{Project(\{a.IdArticolo, a.Titolo, COUNT(*) NumeroVisite,\\SUM(v.TempoLettura) TempoTotaleLettura\})}
  134. [{Filter(COUNT(*) $>=$ 3)}
  135. [{GroupBy(\{a.IdArticolo, a.Titolo\}, \{COUNT(*), SUM(v.TempoLettura)\})}
  136. [{SortMerge(a.IdArticolo = v.IdArticolo)}
  137. [{Sort(a.IdArticolo)}
  138. [{Project(\{a.IdArticolo, a.Titolo\})}
  139. [{Filter(a.Premium = 'N')}
  140. [{TableScan(Articoli a)}]
  141. ]
  142. ]
  143. ]
  144. [{Sort(v.IdArticolo)}
  145. [{Project(\{v.IdArticolo, v.TempoLettura\})}
  146. [{TableScan(Visite v)}]
  147. ]
  148. ]
  149. ]
  150. ]
  151. ]
  152. ]
  153. \end{forest}
  154. \end{center}
  155. L’output di SortMerge è già ordinato per a.IdArticolo e, dato che \texttt{a.IdArticolo $\to$ a.Titolo},
  156. non occorre ordinare prima della groupby.
  157. \paragraph{Piano di accesso fisico della query c con due indici}
  158. \begin{center}
  159. \begin{forest}, baseline, qtree
  160. [{Project(\{a.IdArticolo, a.Titolo, COUNT(*) NumeroVisite,\\SUM(v.TempoLettura) TempoTotaleLettura\})}
  161. [{Filter(COUNT(*) $>=$ 3)}
  162. [{GroupBy(\{a.IdArticolo, a.Titolo\}, \{COUNT(*), SUM(v.TempoLettura)\})}
  163. [{IndexNestedLoop(a.IdArticolo = v.IdArticolo)}
  164. [{Project(\{a.IdArticolo, a.Titolo\})}
  165. [{IndexFilter(Articoli a,\\ IndAIdA, a.Premium = 'N')}
  166. ]
  167. ]
  168. [{Project(\{v.IdArticolo, v.TempoLettura\})}
  169. [{IndexFilter(Visite v,\\IndVIdA, v.IdArticolo = a.IdArticolo)}]
  170. ]
  171. ]
  172. ]
  173. ]
  174. ]
  175. \end{forest}
  176. \end{center}
  177. Indici necessari: IndAIdA (indice della tabella Articoli sull’attributo IdArticolo), IndVIdA (indice
  178. della tabella Visite sull’attributo IdArticolo).
  179. Non occorre fare un ordinamento sull’output della IndexNestedLoop: avendo ricevuto input
  180. ordinato su IdArticolo dalla IndexFilter, e sapendo che \texttt{a.IdArticolo $\to$ a.Titolo}, l’input
  181. della groupby è già raggruppato per le dimensioni di analisi.