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

Код: plsql
1.
2.
3.
1. trunc (dt) = trunc (sysdate)
2. dt >= trunc (sysdate) and dt < trunc (sysdate+1)
3. dt >= trunc (sysdate) and dt <= trunc (sysdate+1) - 1/86400



весьма трудно назвать хоть какой-либо плюс третьего.
Один плюсик таки есть: его можно переписать как
Код: plsql
1.
dt between trunc (sysdate) and trunc (sysdate+1) - 1/86400


что временами слегка повышает читабельность.

В то же время вариант 1 в запросе сразу выдает "нуба", который вскоре придет с просьбой "ускорить запрос". Не на 100%, но на 98 - точно :)

А будьте любезны, объясните, пожалуйста, почему? Ибо я из этих нубов.
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39608087
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почемуА будьте любезны, объясните, пожалуйста, почему? Ибо я из этих нубов.
Думаю, Андрей имел в виду, что первый вариант, в отличие от второго и третьего, не сможет воспользоваться индексом по полю dt.
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39608102
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
softwarerА почемуА будьте любезны, объясните, пожалуйста, почему? Ибо я из этих нубов.
Думаю, Андрей имел в виду, что первый вариант, в отличие от второго и третьего, не сможет воспользоваться индексом по полю dt.стоит еще учитывать, что иногда имеет смысл создавать индекс на trunc даты до часа или суток, т.к. это позволяет искать по обоим вариантам, как по trunc(поле_даты) between ..., так и по "поле_даты between :1 and :2", ну и иногда уменьшить размер индекса
Код: 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.
SQL> create table dates as
  2    select date'2000-01-01' +level-1 dt
  3         , to_char(level,'00000000000000000') padding
  4    from dual connect by level<=1e4;

Table created.

SQL> create index ix_dates on dates(trunc(dt,'hh24'));

Index created.

SQL> call dbms_stats.gather_table_stats('','dates');

Call completed.

SQL>
SQL> explain plan for select * from dates where dt between :1 and :2;

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
Plan hash value: 2394932240

-------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |          |    25 |   875 |     3   (0)| 00:00:01 |
|*  1 |  FILTER                              |          |       |       |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID BATCHED| DATES    |    25 |   875 |     3   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN                  | IX_DATES |    45 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

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

   1 - filter(TO_DATE(:2)>=TO_DATE(:1))
   2 - filter("DT">=:1 AND "DT"<=:2)
   3 - access(TRUNC(INTERNAL_FUNCTION("DT"),'fmhh24')>=TRUNC(:1,'fmhh24') AND
              TRUNC(INTERNAL_FUNCTION("DT"),'fmhh24')<=TRUNC(:2,'fmhh24'))

...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39608269
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxя 7+ лет не могу понять тайный смысл cnt not between 1 and 4Просто чтобы убрать непоказательный шум именно на том "случайном" наборе данных.
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39608307
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

ясно, спасибо

.....
stax
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39608987
А почему
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerА почемуА будьте любезны, объясните, пожалуйста, почему? Ибо я из этих нубов.
Думаю, Андрей имел в виду, что первый вариант, в отличие от второго и третьего, не сможет воспользоваться индексом по полю dt.

То есть если индекса нет, то все 3 варианта будут выполняться одно время?
Спасибо.
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39609613
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicVintесли звонки начинаются или заканчиваются в один момент времениtimestamp-ы не на винде одинаковыми не бывают.Спорное утверждение. Просто на практике встречались дубли, база под Linux. Возможно, из за RAC.
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39609631
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почемуТо есть если индекса нет, то все 3 варианта будут выполняться одно время?
Спасибо.
Быстрее будет, если union all заменить на join. Экономится один скан таблицы.
Код: plsql
1.
2.
3.
4.
select decode(weight, 1, b, -1, e) as time, weight from tmp
cross join (select 1 weight from dual
union all
select -1 weight from dual)
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39609640
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_TtlElicпропущено...
timestamp-ы не на винде одинаковыми не бывают.Спорное утверждение. Просто на практике встречались дубли, база под Linux. Возможно, из за RAC.

надо еще понять (не всем дано) что Elic имел ввиду


в контексте
авторесли звонки начинаются или заканчиваются в один момент времени

два звонка могут начатся и закончится в один момент времени, зависит от оборудования
напр две независимые стойки, почему б им (завонкам) не начатся в один момент времени, тем более закочится

да и банальный systimestamp (не помню скоко там точнось, допустим 6 знаков)
если процессор намного быстрее 1000000 то почему б и не получить одинаковые значения

если в ф-ции (ос) стоит задержка 0.000001 то откуда уверенность что в винде ее нет

опять же
в могопроцессорных системах, неужели на разных процессорах нельзя получить одинаковые timestamp

.....
stax
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39609875
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
про таймстемпы на винде просто лень искать тему. на юниксах каждый вызов таймстемпа точно занимает какое то время, там кажется 8 символов после секунд. у винды точно 6 символов после секунд не всегда хватает чтобы отловить разницу.
насчет того что пересекаются или нет уже не важно. главное сама идея...) я ее пол дня вспоминал. точно видел не единожды.... но всегда когда надо нет под рукой)
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39609907
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintу винды точно 6 символов после секунд не всегда хватает чтобы отловить разницу.На винде у TS всего 3 знака.
Код: plsql
1.
2.
3.
4.
5.
Elic@elic122>; select systimestamp from dual;

SYSTIMESTAMP
--------------------------------------------
03-MAR-18 08.55.49.471000 AM +03:00

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

Спасибо, нашел
https://books.google.com.ua/books?id=NkulDQAAQBAJ&pg=PA251&lpg=PA251&dq=linux timestamp точность&source=bl&ots=QHR35OdLoP&sig=X2k_m9U-VRbvXlNYMSLfMZOlzgg&hl=uk&sa=X&ved=0ahUKEwiEtounys_ZAhUQZlAKHbLyDykQ6AEIhQEwCQ#v=onepage&q=linux timestamp точность&f=false

в оракле сколько знаков?
вроде 6, хотя в маске 9 (мож на будущее)

1) если процессоры сильно быстрые, то могут получить время с разницей в 7-м знаке,
оракля обрежет до 6-ти получим одинаковые

2) два быстрые процессоры одновременно обратились за временем к ос, они ж получат одинаковое время?

3) в телефонии (с чего все и началось) запросто можно получить одинаковое время
начала/окончания звонка хоть там и 20 знаков после

зы
для меня ето не принципиально, так для общего развития

.....
stax
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39609944
винапи.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicНа винде у TS всего 3 знака.Не знаю, что именно пользует оракл, но на винде стандартный системный таймер имеет точность от 10 до 16 миллисекунд. Точный таймер 20 микросекунд.
Если первое, то честных и 3х знаков нет.
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39609968
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
винапи.Не знаю, что именно пользует оракл, но на винде стандартный системный таймер имеет точность от 10 до 16 миллисекунд. Точный таймер 20 микросекунд.
Если первое, то честных и 3х знаков нет. TIMESTAMP Precision (Doc ID 2299085.1)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare
  t1 timestamp with time zone;
  t2 timestamp with time zone;
begin
  t1 := systimestamp;
  loop
    t2 := systimestamp;
    exit when t2 <> t1;
  end loop;
  dbms_output.put_line('systimestamp accuracy = ' || (t2-t1));
end;
/

Код: plsql
1.
systimestamp accuracy = +000000000 00:00:00.001000000
...
Рейтинг: 0 / 0
Задача с пересекающимися диапазонами
    #39609971
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Задача с пересекающимися диапазонами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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