ORACLE PL / SQL: производительность по заказу - PullRequest
0 голосов
/ 06 января 2011

У меня в настоящее время есть запрос на пейджинг на стороне сервера как таковой:

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);

Проблема, однако, заключается в попытке определить, что пользователь сортирует, так как он связан с сеткой.В настоящее время я использую:

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

Я использую это при каждом запросе, который я придерживаюсь схемы подкачки на стороне сервера.Проблема в том, что когда у меня есть сетка с несколькими полями, производительность существенно снижается.Есть ли другой способ сделать это?Нужно ли просто устанавливать меньше полей для пейджинга?

Ответы [ 3 ]

1 голос
/ 06 января 2011

Используйте динамический SQL и создайте ORDER BY во время выполнения.SQL-движок Oracle увидит простой ORDER BY.

0 голосов
/ 06 января 2011

Если primary_key и key являются числами, то нисходящий запрос совпадает с восходящим, умноженным на -1.


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

Выше направление является целым числом. Введите 1 или -1. Это гораздо более простое выражение и должно выполняться быстрее.

0 голосов
/ 06 января 2011

Я подозреваю, что оптимизатор не может понять это и поэтому не может использовать индексы.Проверьте, что говорит EXPLAIN PLAN.

Очевидное решение состоит в том, чтобы ваше приложение "оценило" этот случай и отправило намного более простой запрос.Я думаю, вы найдете ORDER BY primary_key ASC намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...