2013-07-16 40 views
3

我有一個50,000,000的文檔數據庫,我想寫入每個文檔的base-uri文件。運行整個50,000,000的時間太長(查詢超時)。所以,我認爲我會使用謂詞將數據庫分解爲更易於管理的批處理。所以,我試圖通過以下方式來掌握它的性能:在大型數據庫上使用謂詞?

for $i in (49999000 to 50000000) 
return fn:base-uri(/mainDoc[position()=$i]) 

但是,這1000個基礎uris的性能非常慢。事實上,查詢超時。我嘗試過類似的查詢,並得到了類似的結果(或缺乏的結果):

for $i in (/mainDoc) [ 49999000 to 50000000 ] 
return fn:base-uri($i) 

有沒有通過一個龐大的數據庫,在此,該數據庫的結尾文件同樣作爲快速獲取循環的更高性能的方法那些在數據庫的開始?

+2

你可以使用URI詞典嗎?能夠訪問'cts:uris'會大大提高性能。 – wst

+0

我試過cts:uris((/ mainDoc)[49999000到50000000]),沒有更好的成功。這是你的意思嗎? – Todd

+0

不,這不是正確的方式來使用'cts:uris' – mblakele

回答

7

如果你只是想要文檔的URI,那很容易。確保您已啓用文檔詞典並運行cts:uris()調用。

按照你的方法在文檔列表做每個文檔的東西向前跳,你所能做的工作未過濾,使之快:

for $item in cts:search(/mainDoc, cts:and-query(()), "unfiltered")[49999000 to 5000000] 
return base-uri($item) 

cts:and-query(())是始終傳遞一個快捷方式查詢。

+0

謝謝!我嘗試了第二種方法,它比我原來的問題中的查詢要快得多。 – Todd

1

使用cts:uris會是這個樣子的最有效方法:

subsequence(cts:uris((), 'limit=50000000'), 49999000) 

這將是更有效的,如果你能在一開始值傳遞,但是這需要你知道第四千九百九十九萬九千值向上面前。

cts:uris($start-value, 'limit=1000') 

有關該功能的更多信息,請參閱http://docs.marklogic.com/cts:uris

+0

謝謝mblakele。你的後續解決方案是最高性能的。 – Todd