現在,查詢需要大約2分鐘,然後我做了一些更改,花費了3:48m。優化慢速查詢xquery
這些xml文檔是從網頁中獲取的,因爲它每改變5m並實時提供關於總線的信息。
你能幫我優化這個查詢嗎?
xquery version "3.0";
declare namespace bus="http://docs.gijon.es/sw/busgijon.asmx";
declare function local:getNombreParada($numero)
{
for $parada in doc("http://datos.gijon.es/doc/transporte/busgijoninfo.xml")//paradas/bus:parada
where $numero=$parada/bus:idparada
return $parada/bus:descripcion
};
declare function local:getBusesPorLinea($linea)
{
let $numero:=$linea
let $nBuses:=count(doc("http://datos.gijon.es/doc/transporte/busgijontr.xml")//bus:llegada[bus:idlinea=$numero])
return
if($nBuses=0)
then(<p>No hay ningun bus en esta linea</p>)
else(
<div>
<h2>Numero de buses funcionando en la linea {$numero} : {$nBuses}</h2>
<table class="table table-hover">
<thead>
<tr>
<th>Parada</th>
<th>Minutos hasta la llegada</th>
</tr>
</thead>
<tbody>
{
for $l in doc("http://datos.gijon.es/doc/transporte/busgijontr.xml")//bus:llegada[bus:idlinea=$numero]
for $parada in doc("http://datos.gijon.es/doc/transporte/busgijoninfo.xml")//paradas/bus:parada[bus:idparada=$l/bus:idparada]
return <tr>
<td>{$parada/bus:descripcion}</td>
<td>{$l/bus:minutos}</td></tr>
}
</tbody>
</table>
</div>
)
};
local:getBusesPorLinea(1)
PD:我運行這存在Db的
只是一個側面說明,邁克爾·凱說還是最相關:儘量避免''//如果遇到性能問題。這將始終觸發對所有後代的完整掃描,並且具體查找(即完整路徑)肯定會更快。 – dirkk
@dirkk其實這對於eXist來說並不正確。相反,反過來是正確的,即由於索引的工作方式,「//」比使用完整路徑要快得多;這是假設當然你已經創建了索引第一;-) – adamretter
@adamretter有趣的是,我不知道這一點。我也很驚訝,因爲具體路徑總是比簡單的後代或自我操作符更多的信息,也就是說,優化器可以(理論上)重寫「//」的具體路徑,反過來這是不可能的。但是,將來對於一般的XQuery處理器我會避免這種說法,看起來這隻適用於BaseX。 – dirkk