Performance 使用索引将光标滚动到第一个搜索结果

Performance 使用索引将光标滚动到第一个搜索结果,performance,postgresql,indexing,cursor,Performance,Postgresql,Indexing,Cursor,问题: 我想为我的用户提供一个类似Excel网格的客户端应用程序。该客户端通过网络连接访问PostgreSQL Server。 客户端提供了查找功能。Find函数不是过滤并仅显示匹配结果,而是跳转到网格中的第一个匹配行。就像Excel中的Find函数一样 为了减少带宽使用并防止lame LIMIT/OFFSET选择,我使用带有服务器端游标的PostgreSQL来允许滚动已排序的表: BEGIN WORK; DECLARE mCursor SCROLL CURSOR FOR SELEC

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

为了减少带宽使用并防止lame LIMIT/OFFSET选择,我使用带有服务器端游标的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;
问题:此查询速度非常慢,因为它无法在2-3秒钟内对~300k行使用索引

是否有其他方法可以更有效地集成此任务


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

仅当模式以%开头时,才可能使用索引

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

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

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

仅当模式以%开头时,才可能使用索引

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

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

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

这是一个服务器端游标。它对查询客户机没有任何帮助。你能更好地解释一下你要解决的问题吗?客户是什么?如果它是一个胖游标,那么您可以在客户端保留状态,并使用客户端游标而不是服务器端游标。如果它是一个HTML客户机,那么就不用光标,它是一个胖的Java应用程序。但光标不是问题所在。问题是如何在不计算所有行的情况下找到偏移位置。您是否已经确定使用“限制”和“偏移”不能提供所需的性能,如果是,原因可能是什么?我的测量结果表明,大于300k的偏移需要超过4秒,这太长了。请参阅:这是一个服务器端游标。它对查询客户机没有任何帮助。你能更好地解释一下你要解决的问题吗?客户是什么?如果它是一个胖游标,那么您可以在客户端保留状态,并使用客户端游标而不是服务器端游标。如果它是一个HTML客户机,那么就不用光标,它是一个胖的Java应用程序。但光标不是问题所在。问题是如何在不计算所有行的情况下找到偏移位置。您是否已经确定使用“限制”和“偏移”不能提供所需的性能,如果是,原因可能是什么?我的测量结果表明,大于300k的偏移需要超过4秒,这太长了。见: