Как найти последние 100 тысяч строк из таблицы 10000 тысяч в Oracle? - PullRequest
0 голосов
/ 05 ноября 2018

Когда я использую этот запрос, это занимает более 5 минут, пожалуйста, дайте мне другое предложение

 SELECT * FROM 
( SELECT  id,name,rownum AS RN$$_RowNumber FROM MILLION_1) INNER_TABLE where
 RN$$_RowNumber  > (V_total_count - V_no_of_rows)
 ORDER BY RN$$_RowNumber DESC;

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Попробуйте предложение смещения.

У меня есть таблица с примерно 16M записями, если я просто хочу последние 100 000 строк, я ЗАКАЗЫВАЮ их с помощью предложения ORDER BY, а затем использую предложение OFFSET, которое в основном говорит: сначала прочитайте много строк, прежде чем вернуть какие-либо данные.

enter image description here

select *
  from SHERI; -- 15,691,544  Rows

select *
  from SHERI
 order by COLUMN4 asc
offset 15591444 rows; -- my math was bad, should have offset 15591544 rows to get just the last 100,000 

Предложения FETCH FIRST и OFFSET являются новыми для 12c ( docs )

Если мы посмотрим на план по этому запросу, мы увидим, как база данных обеспечивает его работу:

PLAN_TABLE_OUTPUT                                                                   
SQL_ID  7wd4ra8pfu1vb, child number 0                                               
-------------------------------------                                               
select *   from SHERI  order by COLUMN4 asc offset 15591444 rows                    

Plan hash value: 3535161482                                                         

----------------------------------------------                                      
| Id  | Operation           | Name  | E-Rows |                                      
----------------------------------------------                                      
|   0 | SELECT STATEMENT    |       |        |                                      
|*  1 |  VIEW               |       |     15M|                                      
|   2 |   WINDOW SORT       |       |     15M|                                      
|   3 |    TABLE ACCESS FULL| SHERI |     15M|                                      
----------------------------------------------                                      

Predicate Information (identified by operation id):                                 
---------------------------------------------------                                 

   1 - filter("from$_subquery$_002"."rowlimit_$$_rownumber">15591444)               

Note                                                                                
-----                                                                               
   - Warning: basic plan statistics not available. These are only collected when:   
       * hint 'gather_plan_statistics' is used for the statement or                 
       * parameter 'statistics_level' is set to 'ALL', at session or system level   

«сортировка окон» в основном переводится как аналитическая функция

0 голосов
/ 05 ноября 2018

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

Во-первых, когда вы говорите "последние 100 тыс. Строк", что вы имеете в виду? Похоже, вы просто хотите извлечь последние 100 тыс. Строк из несортированного запроса, но это не имеет большого смысла. Если вам нужны самые последние 100k строк , Oracle не гарантирует, что они будут в конце вашего несортированного запроса. Итак, вы хотите заказать по что-то , которое будет иметь самые последние из них в конце.

Кроме того, отчасти ваш запрос медленный, потому что вы сортируете / фильтруете псевдостолбец rownum , который не может быть проиндексирован. Сортировка по столбцу с индексом значительно ускорит это. Поэтому я думаю, вы хотите упорядочить по столбцу id , который, вероятно, является уникальным / первичным ключом.

Так что это старый (11g и более ранние) способ сделать это.

select id, name
from (select id, name
      from MILLION_1
      order by id desc)
where rownum < 100000;

Если вы используете 12с или позже, есть более новый способ сделать это.

select id, name
from MILLION_1
order by id desc
fetch first 100000 rows only;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...