ORACLE PL/SQL:按案例排序的性能

ORACLE PL/SQL:按案例排序的性能,oracle,plsql,oracle10g,Oracle,Plsql,Oracle10g,我目前有一个服务器端分页查询,如下所示: SELECT * FROM (SELECT a.*, rownum rnum FROM ( ( /* Insert Query Here */ ) ) a WHERE rownum <= ((page_number + 1) * page_size)) WHERE rnum >= (((page_number + 1) * page_size)) - (page_size - 1); 我在服务器端分

我目前有一个服务器端分页查询,如下所示:

SELECT * FROM (SELECT a.*, rownum rnum FROM (
        ( /* Insert Query Here */ ) ) a
      WHERE rownum <= ((page_number + 1) * page_size))
      WHERE rnum >= (((page_number  + 1) * page_size)) - (page_size - 1);

我在服务器端分页方案中的每个查询中都使用了它。问题是,当我有一个网格,有相当多的领域,性能大大降低。还有别的办法吗?我是否需要简单地设置更少的字段以允许分页?

我怀疑优化器无法解决这个问题,因此无法使用索引。检查解释计划的内容


显而易见的解决方案是让你的应用程序“评估”这个案例,并发送一个简单得多的查询。我想您会发现按主键ASC排序的
要快得多。

使用动态SQL并在运行时按生成排序。Oracle的SQL引擎将看到一个简单的ORDER BY。

如果主键和键是数字,则降序查询与升序乘以-1相同。
在上面的例子中,方向是一个整数。通过1或-1。这是一个简单得多的表达式,应该运行得更快。

是一个特定查询的占位符,还是多个查询的占位符?这就是我现在尝试的,但我在将结果放入参考光标时遇到了问题。什么类型的问题?错误消息?在编译时?运行时间?当我使用动态sql返回一个ref游标时,我发现它一定是一个弱ref游标。明白了。由于某种原因,我缺少排序值,因为它们没有传递。带有第一行提示的动态SQL使我的查询在十分之一秒内运行。谢谢
ORDER BY 
        CASE sort_direction
          WHEN 'ASC' THEN
            CASE sort_column
              WHEN 'PRIMARY_KEY' THEN
                primary_key
              ELSE key
            END
        END    
        ASC,
        CASE sort_direction
          WHEN 'DESC' THEN
            CASE sort_column
              WHEN 'PRIMARY_KEY' THEN
                primary_key
              ELSE key
            END
        END    
        DESC

order by direction * CASE sort_column
                       WHEN 'PRIMARY_KEY' THEN primary_key
                       ELSE key              END