2012-06-07 51 views
0

我正在訪問UniVerse數據庫並讀出其中的所有記錄,以便將其同步到MySQL數據庫,該數據庫用於與其他使用數據的應用程序的兼容性。有些表格長度大於250,000條,長度大於100列,服務器相當老舊,仍然被許多同時使用的用戶使用,因此有時需要很長時間才能讀取記錄。使用UniObjects加速UniVerse訪問時間

示例:我執行SSELECT <文件> TO 0並開始閱讀選擇列表,將每個記錄解析爲我們的數據抽象類型並將其放入.NET列表中。取決於具體時間,根據數據庫使用情況,提取每條記錄可能需要250ms到3/4秒。刪除提取的方法只能加快速度,因爲我認爲即使我不使用UniFile.read,我仍然會下載所有記錄信息。

以這個速度讀取250,000條記錄的速度非常慢,所以有人知道我可以加快速度的方式嗎?有什麼選擇我應該設置在某個地方?

回答

1

你真的需要使用SSELECT(排序選擇)嗎?記錄密鑰的排序會產生額外的性能開銷。如果你不需要以一種排序的方式進行同步,只需使用普通的SELECT,這應該會提高性能。

如果這樣做沒有幫助,那麼嘗試在系統使用率較低的時候自動執行同步,當幾乎沒有用戶登錄到UniVerse系統時(如果可能的話)。

除此之外,它可能是您正在導出的某些表需要調整大小。如果它們不是動態文件(自動調整大小 - 類型30),它們可能已經進入磁盤溢出空間。 要找出最大表的大小並查看它們是否已經溢出,可以在命令行中使用諸如FILE.STAT和HASH.HELP之類的命令來檢索更多信息。使用HELP FILE.STAT或HELP HASH.HELP查看這些命令的文檔,以便提取所需的信息。

如果這些命令顯示您的文件類型爲30,那麼它們將自動由數據庫引擎調整大小。但是,如果文件類型是從2到18的任何類型,HASH.HELP命令可能會建議您對錶大小進行更改以提高其性能。

如果這些都沒有幫助,那麼您可以使用LIST.INDEX TABLENAME ALL檢查表上有用的索引,這可以用來加速選擇。

+0

原來我訪問服務器的方式(通過防火牆的ssh隧道)實際上是瓶頸。所以,我們將在防火牆內部運行這個服務來解決這個問題。 –

0

使用ANALYZE-FILE fileName確保您的文件大小正確。如果不是動態確保沒有太多的溢出。

使用SELECT而不是SSELECT將意味着您正在從數據庫中順序讀取數據,而不是隨機讀取數據,並且速度明顯加快。

您還應該研究如何從每條記錄中提取數據並將其放入列表中。通常,挑選數據分隔符字符254,253和252將不兼容外部數據庫並需要轉換。如何做到這一點可以對性能產生巨大的影響。

從最初的文章可以看出,WRITESEQ可能是最有效的輸出文件數據的方式。