powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос до определенной строчки
23 сообщений из 48, страница 2 из 2
Запрос до определенной строчки
    #39601692
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirLeonid Kudryavtsev,

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

Спасибо. Слона то я и не заметил.
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39601853
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirLeonid Kudryavtsev,

Перебираются записи в таблице по индексу в обратном порядке и находится первый id, у которого дата отличается от текущей.
Если id заполняются в таблице строго по времени, то это будет первый id текущих суток.
И его можно использовать для выборки записей.
Это то, чего я и пытаюсь добиться
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39601905
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала ты утверждала что индекс тебе не нужен:
Lemkolegj2k,
Из-за того, что запрашиваються даные только за текущий день. Какой смысл хранить индекс по всей таблице

Теперь говоришь что нужен:
LemkolegSir Перебираются записи в таблице по индексу
Это то, чего я и пытаюсь добиться

На каком ты месяце?
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39601914
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLer, ну не совсем так
XMLerутверждала что индекс тебе не нужен:
в первом посте было уточнение
Lemkolegотсутствует индекс по полю SYSDATE

И если есть графеновая гарантия, что нарастание индексированного суррогатного PK и даты в поле sysdate эквивалентно и однонаправленно, то вариант с магией данных даже прокатит.
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39601924
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirЕсли повезет с планом, то будет работать по индексу.

Бред. Начнем с того что TRUNC(SYSDATE) > TRUNC(field_date) в принципе ничего не вернет. Так-что TRUNC(field_date) = TRUNC(SYSDATE) а лучше field_date >= TRUNC(SYSDATE). Едем дальше. Индекса по field_date нет. Допустим есть индекс по id,field_date. Тогда, посколько order by DESC , будет не INDEX FULL SCAN с STOPKEY а INDEX FULL SCAN и только затем сортировка результата INDEX FULL SCAN с STOPKEY. Но это не суть. Суть в том что WHERE field_date >= TRUNC(SYSDATE) AND ROWNUM = 1 вернет (исходя из id увеличивается при каждой последующей вставке) id последней строки на момент select'a. А посему, id > ... ничего не вернет a id >= ... вернет последнюю строку на момент select'a.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY HH24:MI:SS'
/
CREATE TABLE TBL
  AS
    SELECT  LEVEL ID,
            TRUNC(SYSDATE) + 1/24 * (LEVEL - 1) FIELD_DATE
      FROM  DUAL
      CONNECT BY LEVEL <= 9
/
ALTER TABLE TBL
  MODIFY(
         ID NOT NULL,
         FIELD_DATE NOT NULL
        )
/
CREATE UNIQUE INDEX TBL_IDX1
  ON TBL(ID,FIELD_DATE)
/
SELECT  ID,
        TO_CHAR(FIELD_DATE,'MM/DD/YYYY HH24:MI:SS') FIELD_DATE
  FROM  TBL
  WHERE FIELD_DATE >= TRUNC(SYSDATE)
/

        ID FIELD_DATE
---------- -------------------
         1 02/14/2018 00:00:00
         2 02/14/2018 01:00:00
         3 02/14/2018 02:00:00
         4 02/14/2018 03:00:00
         5 02/14/2018 04:00:00
         6 02/14/2018 05:00:00
         7 02/14/2018 06:00:00
         8 02/14/2018 07:00:00
         9 02/14/2018 08:00:00

9 rows selected.
SELECT  *
  FROM  TBL
  WHERE ID >= (
               SELECT  ID
                 FROM  (
                        SELECT  /*+ INDEX(TBL TBL_IDX1) */
                                ID,
                                FIELD_DATE
                          FROM  TBL
                          ORDER BY 1 DESC
                       )
                 WHERE FIELD_DATE >= TRUNC(SYSDATE)
                   AND ROWNUM = 1
              )
/

        ID FIELD_DATE
---------- -------------------
         9 02/14/2018 08:00:00

SQL> 



SY.
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39601935
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,
я не про вариант с магией данных а про смену настроения ТС, сначала она хотела без индекса а после благодарила за индекс.

И таки да, индекс д.б. на id и дату. И магия данных тоже обязательное условие.
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39601942
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соломон, ты фильтр не в ту сторону развернул.
trunc(field_date) < trunc(sysdate) при переборе сверху вниз как раз вернёт последнюю запись предыдущего дня.


XMLerиндекс д.б. на id и дату.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
create table dropme_t (id number not null, some_field varchar2(500), dt date)
/

create unique index dropme_i on dropme_t(id)
/

insert into dropme_t (id, some_field, dt)
select level, dbms_random.string('p',500), date '2017-12-01' + level/24 
from dual 
connect by level <= 2*1e5
/

commit
/

select * 
from dropme_t t
where t.id > (select t2.id 
              from (select /*+ index (tt)*/ tt.id, tt.dt 
                    from dropme_t tt 
                    order by tt.id desc
                    ) t2 
              where t2.dt < trunc(sysdate) and rownum = 1
              )
/

98201 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3847925245

---------------------------------------------------------------------------------------------
| Id  | Operation                        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |          | 10129 |  2710K|     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID     | DROPME_T | 10129 |  2710K|     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN               | DROPME_I |  1823 |       |     3   (0)| 00:00:01 |
|*  3 |    COUNT STOPKEY                 |          |       |       |            |          |
|   4 |     VIEW                         |          |    84 |  1260 |   248   (1)| 00:00:01 |
|*  5 |      SORT ORDER BY STOPKEY       |          |    84 |  1848 |   248   (1)| 00:00:01 |
|*  6 |       TABLE ACCESS BY INDEX ROWID| DROPME_T |    84 |  1848 |   247   (0)| 00:00:01 |
|   7 |        INDEX FULL SCAN           | DROPME_I |   202K|       |   247   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

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

   2 - access("T"."ID"> (SELECT "T2"."ID" FROM  (SELECT /*+ INDEX ("TT") */
              "TT"."ID" "ID","TT"."DT" "DT" FROM "DROPME_T" "TT" WHERE "TT"."DT"<TRUNC(SYSDATE@!)
              ORDER BY "TT"."ID" DESC) "T2" WHERE ROWNUM=1))
   3 - filter(ROWNUM=1)
   5 - filter(ROWNUM=1)
   6 - filter("TT"."DT"<TRUNC(SYSDATE@!))

Note
-----
   - dynamic sampling used for this statement (level=2)
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      24085  consistent gets
          0  physical reads
          0  redo size
   51443699  bytes sent via SQL*Net to client
      72477  bytes received via SQL*Net from client
       6548  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      98201  rows processed



Индекс на id, dt без магии данных не нужен. Достаточно id. Велосипед из костылей вполне способен ехать.

Но корректный результат будет только за счёт магии данных.
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39601989
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

чесно говоря не совсем понимаю смысл
Код: plsql
1.
2.
|*  6 |       TABLE ACCESS BY INDEX ROWID| DROPME_T |    84 |  1848 |   247   (0)| 00:00:01 |
|   7 |        INDEX FULL SCAN           | DROPME_I |   202K|       |   247   (0)| 00:00:01 |



просмотрит всю таблицу, да еще и через индекс? или я неправ?

чем метотод c id луче за select * from tt where DT>=TRUNC(SYSDATE)?

.....
stax
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39601993
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,
если
Код: plsql
1.
create index dropme_i  on dropme_t(id, dt)


то из твоего плана пропадет строка 6.
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602051
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirLeonid Kudryavtsev,

Перебираются записи в таблице по индексу в обратном порядке и находится первый id, у которого дата отличается от текущей.
Если id заполняются в таблице строго по времени, то это будет первый id текущих суток.
И его можно использовать для выборки записей.
Именно этого я и пытаюсь добиться. Но, приходиться, либо спорить с самоуверенными, либо обьяснять непонятливым
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602053
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lemkoleg,
Да тюв поле dateadding ровняеться значению sysdate- дате добавления. Обратная логика - всеоля, до определенного ИД - есть поля, добавленые заопределенный период. Чего тупим, господа?
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602054
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LemkolegLemkoleg,
Да тюв поле dateadding ровняеться значению sysdate- дате добавления. Обратная логика - всеоля, до определенного ИД - есть поля, добавленые заопределенный период. Чего тупим, господа?
Постараюсь написать без пропусков и замены букв ( не давая пищу для травли идиотам).
Даные в поле dateadding ровняеться значению sysdate - дате добавления. Обратная логика - все поля, до определенного ИД - есть поля, добавленые за определенный период. Чего тупим, господа?
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602056
LemkolegровняетьсяРусский язык в твоей стране не преподают? Тогда укажи в профиле.
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602064
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пища идиотаLemkolegровняетьсяРусский язык в твоей стране не преподают? Тогда укажи в профиле.
Заечем? Тебе от этого легче? Тогда, этот сайт - не твоя стихия...
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602070
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerСначала ты утверждала что индекс тебе не нужен:
Lemkolegj2k,
Из-за того, что запрашиваються даные только за текущий день. Какой смысл хранить индекс по всей таблице

Теперь говоришь что нужен:
Lemkolegпропущено...

Это то, чего я и пытаюсь добиться

На каком ты месяце?
Тебе кто "утверждала"?. Ты на..... чем?....вобще?
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602077
JoeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LemkolegКак сделать запрос, чтоб не сканировать всю таблицу? Если есть возможность добавить столбец или есть подходящий по смыслу, посмотрите на решение описаное Кайтом в Expert Oracle Database Architecture chapter 1 или воттутавот . Идея в создании функционального индекса в котором все "ненужные" записи будут представлены наллами. Индекс в таком случае получается близким к минимально возможному - исчезает ограничение "Из-за этого [отсутствует]".
Новые записи добавляются с "нужным" значением, по мере обработки или устаревания значение должно быть установлено в "ненужное" либо самим приложением, либо джобом, соответственно.
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602081
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select * 
from dropme_t t
where t.id > (select t2.id 
              from (select /*+ index_desc (tt)*/ tt.id, tt.dt 
                    from dropme_t tt 
                    order by tt.id desc
                    ) t2 
              where t2.dt < trunc(sysdate) and rownum = 1
              )
/

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL_ID  aw2hbr8ym8n3j, child number 0
-------------------------------------
select * from dropme_t t where t.id > (select t2.id               from
(select /*+ index_desc (tt)*/ tt.id, tt.dt                     from
dropme_t tt                     order by tt.id desc
) t2               where t2.dt < trunc(sysdate) and rownum = 1
     )

Plan hash value: 2083051503

------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |          |       |       |     1 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| DROPME_T |     1 |   274 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | DROPME_I |     1 |       |     1   (0)| 00:00:01 |
|*  3 |    COUNT STOPKEY                    |          |       |       |            |          |
|   4 |     VIEW                            |          |     1 |    13 |     1   (0)| 00:00:01 |
|*  5 |      TABLE ACCESS BY INDEX ROWID    | DROPME_T |     1 |    22 |     1   (0)| 00:00:01 |
|   6 |       INDEX FULL SCAN DESCENDING    | DROPME_I |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

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

   2 - access("T"."ID">)
   3 - filter(ROWNUM=1)
   5 - filter("TT"."DT"<TRUNC(SYSDATE@!))
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602084
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
just4fun, как дополнительный вариант
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create or replace package p_dropme as
  type dropme_type is table of dropme_t%rowtype;
  function dropme_func return dropme_type pipelined;
end;
/
create or replace package body p_dropme as
   function dropme_func return dropme_type pipelined as
   begin
      for r in (select--+ index_desc(tt (id))
                  tt.*
                from dropme_t tt
                order by tt.id desc
      )
      loop
         exit when r.dt < trunc(sysdate);
         pipe row(r);
      end loop;
   end;
end;
/

...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602087
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен, что
WHERE id >
будет работать быстрее, чем
WHERE SYSDATE =
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602162
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LemkolegLemkoleg,
Да тюв поле dateadding ровняеться значению sysdate- дате добавления. Обратная логика - всеоля, до определенного ИД - есть поля, добавленые заопределенный период. Чего тупим, господа?

для Вашего случая ключевым есть index_desc для ід

21192612

в плане не должно быть SORT

.....
stax
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39602166
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Не уверен, что
WHERE id >
будет работать быстрее, чем
WHERE SYSDATE =
если записей за текущую дату относительно мало, и пойдет по индексу c обратной стороны (DESCENDING) то будет

.....
stax
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39604100
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
В этом и есть задумка. Идея оказалась нетакая уж и бредовая
...
Рейтинг: 0 / 0
Запрос до определенной строчки
    #39604172
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LemkolegStax,
В этом и есть задумка. Идея оказалась нетакая уж и бредовая

імхо, совсем не бредовая, но надо акуратно выверить план

если данные напр за 10лет, то выиграш будет в сотни раз


странно токо что нет индекса по дате (без времени) или "архивных" таблиц

.....
stax
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос до определенной строчки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]