2012-12-20 39 views
1

問題: 我想爲我的用戶提供類似Excel的網格的客戶端應用程序。該客戶端通過網絡連接訪問PostgreSQL服務器。 客戶端提供「查找」功能。 「查找」功能只是跳轉到網格中的第一個匹配的行,而不是篩選並僅顯示匹配的結果。 (像「查找」,在Excel中 - 功能)將滾動遊標移至使用索引的第一個搜索結果

爲了降低帶寬使用率,防止跛腳LIMIT/OFFSET-選擇,我把PostgreSQL服務器端遊標,允許滾動在排序表:

結果數據的
BEGIN WORK; 
DECLARE mCursor SCROLL CURSOR FOR 
    SELECT * 
    FROM table 
    ORDER BY xyz 

滾動和檢索通過調用移動處理/每次網格內的客戶端卷軸取:

MOVE FORWARD/BACKWARD <offset> IN mCursor; FETCH 40 FROM mCursor; 

現在我想添加的「查找」 -Functionality女巫使用的找到第一個匹配結果關鍵字的索引等。我知道這種功能整合的唯一方法是打開一個新的連接和運行下面的查詢,然後將光標移動到返回rowNo:

SELECT t.rowNo 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY ColumnName ASC) AS rowNo 
    FROM table 
) t 
WHERE t.ColumnName LIKE 'xyz%' 
LIMIT 1 

問題:該查詢是非常緩慢的,因爲它不能使用一個指數(約300k行2-3秒)。

有沒有其他方法可以更有效地整合此任務?

也許通過直接從索引數據中讀取偏移?或者通過在Cursor中啓動一個查詢?還是有一個數據庫系統允許這個功能?

+0

這是一個服務器端遊標。它對查詢客戶端毫無幫助。你能否更好地解釋你正試圖解決的問題? –

+0

客戶端是什麼?如果它是胖的,那麼你可以在客戶端保持狀態,並使用客戶端遊標而不是服務器端遊標。如果它是一個HTML客戶端,那麼不用光標就可以。 –

+0

它是一個胖子(Java應用程序)。但光標不是問題。問題是如何在不計算所有行之前找到偏移位置。 –

回答

1

僅當模式以%開頭時,纔可能使用索引。

我想問題不是它不能使用索引,而是它必須掃描整個索引來枚舉所有的錶行。顯示解釋。

這將限制索引掃描多達所搜索的圖案

SELECT min(t.rowNo) 
FROM (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY ColumnName ASC) AS rowNo, 
     ColumnName 
    FROM table 
    where ColumnName <= 'xyz' || repeat('z', 100) -- Get all possible like 'xyz%' 
) t 
WHERE t.ColumnName LIKE 'xyz%'