2014-01-21 3 views
0

Я использую раздел оракула. Я вижу лучше I/O и меньше времени выполнения. Но я вижу всплеск процессора. Есть ли передел для раздела в приведенном ниже сценарии? SQL-запрос:Есть ли альтернатива «row_number() over (partition by col1 order by col2)»?

SELECT C2, ROW_NUMBER() OVER(PARTITION BY C2 ORDER BY C3) AS DISPLAY_ORDER 
    FROM MYTABLE; 

Таблица данных:

C1, C2, C3 
1, 1000, 101 
2, 1000, 102 
3, 1000, 200 
4, 1000, 300 
5, 1001, 100 
6, 1001, 101 
7, 1001, 102 
8, 1001, 103 

Выход:

C1, C2, C3 
1, 1000, 1 
2, 1000, 2 
3, 1000, 3 
4, 1000, 4 
5, 1001, 1 
6, 1001, 2 
7, 1001, 3 
8, 1001, 4 
+0

Я предполагаю, что row_number() использовал наилучший возможный алгоритм для достижения этого требования. И аналитические функции должны потреблять больше CPU. –

+3

Я не понимаю вопроса. Почему вы не хотите использовать 'row_number()'? –

+0

Когда я использую PARTITION BY, я вижу всплеск процессора. Именно по этой причине я не хочу использовать «ROW_NUMBER() OVER PARTITION BY» – Dakshin

ответ

0

Вы можете использовать DENSE_RANK или RANK, если она возвращает тот же результат на данных (по образцу вы разместили его):

with t as 
(select 1 C1, 1000 C2, 101 C3 from dual 
union all 
select 2, 1000, 102 from dual 
union all 
select 3, 1000, 200 from dual 
union all 
select 4, 1000, 300 from dual 
union all 
select 5, 1001, 100 from dual 
union all 
select 6, 1001, 101 from dual 
union all 
select 7, 1001, 102 from dual 
union all 
select 8, 1001, 103 from dual) 
select C1, 
     C2, 
     ROW_NUMBER() OVER(PARTITION BY C2 ORDER BY C3) AS DISPLAY_ORDER1, 
     RANK() OVER(PARTITION BY C2 ORDER BY C3) AS DISPLAY_ORDER2, 
     DENSE_RANK() OVER(PARTITION BY C2 ORDER BY C3) AS DISPLAY_ORDER3 
    from t; 

    C1   C2  DISPLAY_ORDER1 DISPLAY_ORDER2 DISPLAY_ORDER3 
---------- ---------- -------------- -------------- -------------- 
    1  1000    1    1    1 
    2  1000    2    2    2 
    3  1000    3    3    3 
    4  1000    4    4    4 
    5  1001    1    1    1 
    6  1001    2    2    2 
    7  1001    3    3    3 
    8  1001    4    4    4 

Существует forum thread, где указано, что производительность выглядит следующим образом: dense_rank (fastest) > rank > row_number (slowest). Но вы бы лучше сравнить производительность всех из них на свои собственные данные, чтобы решить.

+1

Shabalin - Я не хочу использовать «PARTITION BY», так как я вижу всплеск процессора с большим объемом данных. Есть ли альтернативный подход? – Dakshin

+0

@ Yaroslav: ссылка на тему форума, которую вы предоставили, НЕ МОЖЕТ быть доверенным, так как результаты экспериментальных экспериментов не были показаны, но объявлен только последний отчет. Если бы был такой комментарий к документам Oracle, то это можно было бы сделать, но не эту ссылку. – nanosoft

+0

@nanosoft Производительность зависит от набора данных, обрабатываемого запросом. Я сомневаюсь, что в документах Oracle могут быть официальные подтверждения. Как я уже сказал, вам нужно сравнить производительность конкретного запроса с вашими собственными данными, чтобы решить, какой из них лучше. –

0

Использование аналитической функции оракула является наиболее эффективным подходом. Спасибо всем за ваш ввод

Смежные вопросы