滚动光标到使用INDEX的第一个搜索结果



问题: 我想为我的用户提供一个类似Excel网格的客户端应用程序。该客户端通过网络连接访问PostgreSQL Server。客户端提供"查找"功能。"Find"-函数没有过滤并只显示匹配的结果,而是跳到网格中的第一个匹配行。(类似于Excel中的"查找"功能(

为了减少带宽使用并防止蹩脚的LIMIT/OFFSET Selects,我使用带有服务器端游标的PostgreSQL来滚动排序后的表:

BEGIN WORK; 
DECLARE mCursor SCROLL CURSOR FOR 
    SELECT * 
    FROM table 
    ORDER BY xyz

每次客户端在网格内滚动时,通过调用Move/Fetch来处理结果数据的滚动和检索:

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

现在我想添加"查找"-功能开关使用索引来查找第一个匹配的结果偏移。我知道集成此功能的唯一方法是打开一个新连接并运行以下查询,然后将光标移动到返回的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

问题:此查询速度非常慢,因为它不能使用索引(2-3秒表示约300k行(。

有没有其他方法可以更有效地整合这项任务?

也许可以直接从索引数据中读取偏移量?或者通过在Cursor中启动查询?或者是否有允许此功能的数据库系统?

只有当模式以%开始时,才可能使用索引。

我想问题不在于它不能使用索引,而在于它必须扫描整个索引才能枚举所有表行。出示解释。

这将限制索引扫描到搜索到的模式

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%' 

最新更新