powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Oracle XE: a five years of no progress
25 сообщений из 200, страница 6 из 8
Oracle XE: a five years of no progress
    #36948798
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Флэшбек это оффтоп. Его нет ни в Oracle XE, ни даже в Std. Это EE.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36955157
Sgt.Pepper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а текстовая переменная так и не может быть '', только null?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36955574
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sgt.Pepperа текстовая переменная так и не может быть '', только null?
и это правильно, три раза уже тут пережевывали.

SiemarglФлэшбек это оффтоп. Его нет ни в Oracle XE, ни даже в Std. Это EE.
фрешбэк квери есть в любой редакции
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36956326
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo.!Sgt.Pepperа текстовая переменная так и не может быть '', только null?
и это правильно, три раза уже тут пережевывали.Ради интереса.
Я пропустил первые три серии (лень искать, простите) и у меня практический вопрос, типа "что делают оракловые разработчики, если...".
Дано: есть таблица со строковым полем, на него есть индекс, в поле могут быть пустые значения (или "значение отсутствует" - не важно, как назвать).
Я пишу запрос типа "выбрать всё из таблицы, где значение поля равно параметру".
В db2 я объявляю это поле not null и полагаю, что "отсутствие значения" это пустая строка.
db2create table tab (col varchar(10) not null, ...)Мой запрос с параметром par будет выглядеть так:
db2select * from tab where col=par
Мои варианты решения задачи на оракле:
1.
В оракле я не могу хранить пустое значение в not null поле.
Если я сделаю поле с возможностью хранения null, то мой запрос будет выглядеть так:
oracleselect * from tab where col=par or (col is null and par is null)Как оптимизатор отнесётся к такому запросу?
Индекс будет использоваться (а если будет, то не full index scan ли получится)?
2.
Объявить поле not null и завести своё "отсутствие значения" в виде, скажем, '*'.
Тогда мой запрос не будет отличаться от дб2-шного.

Вопрос: как всё-таки решают в оракле такую задачу?
Может, есть ещё варианты?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36956600
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinВ оракле я не могу хранить пустое значение в not null поле.
Если я сделаю поле с возможностью хранения null, то мой запрос будет выглядеть так:
Код: plaintext
select * from tab where col=par or (col is null and par is null)
неужели в оракле нет аналога тому же mysql-евому <=> ?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36956764
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
Вопрос: как всё-таки решают в оракле такую задачу?
Может, есть ещё варианты?

where NVL(col,'*null*') =:par
и соответственно индекс по NVL(col,'*null*')
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36957945
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!SiemarglФлэшбек это оффтоп. Его нет ни в Oracle XE, ни даже в Std. Это EE.
фрешбэк квери есть в любой редакции
> alter database flashback on;
Нету, а без него далеко не вернешься.

ЗЫ. Про пустые строки тут срач уже был. Может хватит.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36958275
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglYo.!
фрешбэк квери есть в любой редакции
> alter database flashback on;
Нету, а без него далеко не вернешься.

вернешся, флашбэк квери совершенно другая фича.

Код: plaintext
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.
SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-00439: feature not enabled: Flashback Database

SQL> delete from emp where rownum=1 ;

1 row deleted.

SQL> commit ;

Commit complete.

SQL> select count(*) from emp   ;

  COUNT(*)
----------
    999998

SQL> select count(*) from emp  AS OF TIMESTAMP  (SYSDATE-1/24) ;

  COUNT(*)
----------
    999999

...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36958743
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinЯ пропустил первые три серии (лень искать, простите)
Не только Вы. Забавно наблюдать, как даже Метелица, которого я уже скоро десять лет как помню как вдумчивого и грамотного db2-щика, отмечается забавными мыслями "про оракл".

Mark Barinsteinи у меня практический вопрос, типа "что делают оракловые разработчики, если...".
Чаще всего (следует читать как "я сходу даже не припомню, случается ли вообще другое") им ничего делать не требуется. Причин этому несколько. Во-первых, поиск "по пустой строке" - крайне редкая операция, вот честно, ни разу в жизни не сталкивался с отчётом вроде "люди с пустыми отчествами". Поиск по null в числовом поле, хоть и редок, но на порядки чаще. Во-вторых, null - практически всегда низкоселективное значение, и попытка искать его по индексу проигрывает если не фулскану, то сканированию по лучшему индексу.

Если рассматривать сферическую задачу в вакууме, то неграмотный новичок, возможно, и попытается придумать "собственное пустое значение", как Вы предлагаете, но самый простой путь - использовать составной индекс.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36958855
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer...Во-первых, поиск "по пустой строке" - крайне редкая операция, вот честно, ни разу в жизни не сталкивался с отчётом вроде "люди с пустыми отчествами".
Если рассматривать сферическую задачу в вакууме, то неграмотный новичок, возможно, и попытается придумать "собственное пустое значение", как Вы предлагаете, но самый простой путь - использовать составной индекс.Ну, задача найти людей с незаполненными паспортными данными, номерами телефона всё же встречается не так редко.
Причём дело здесь не в индексе даже - по всей таблице только по этому пустому полю редко кто ищет.
Вот сферическая задача: поиск по группе записей типа
Код: plaintext
select * from customer where gid=:par_gid and passport_ no=:par_passport_no
т.е. я имею индекс по этому(им) полю <gid> и ищу всех в этой группе по номеру паспорта.
Этот же самый запрос я использую для поиска тех, у кого нет паспортных данных.
Если я правильно понял про самый простой способ (простите уж неграмотного новичка :)), это использовать для каждого такого поля дополнительное поле-флаг пустого значения?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959001
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinНу, задача найти людей с незаполненными паспортными данными, номерами телефона всё же встречается не так редко
Ну, поскольку ни та, ни другая не являются задачей поиска в таблице пустой строки, о её частоте вряд ли стоит говорить :)

Mark BarinsteinПричём дело здесь не в индексе даже - по всей таблице только по этому пустому полю редко кто ищет.
Именно что. Поэтому вопрос про индекс и отношение оптимизатора в общем малоактуален.

Mark BarinsteinЭтот же самый запрос я использую для поиска тех, у кого нет паспортных данных.
Вот в этом месте сферическая задача становится.. антиреальной. Смотрите сами: Вы написали запрос, который ищет в группе человека с некоторым номером паспорта. Допустим, он действительно такой нужен. И теперь хотите этим же запросом найти "людей без паспортов". Согласитесь, это совершенно разные задачи, которые скорее всего будут решаться даже в разных формах. Соответственно, "этим же" становится неконструктивным, риторическим условием "для достижения нужного результата" - как, знаете, в конкурсах пишут такие условия, которым заведомо соответствует заранее назначенный победитель и только он.

Ну а на практике самый простой способ - использовать запрос where gid = :gid and passport_no is null. И этот запрос будет использовать индекс по (gid, passport_no), в том числе для поиска null-ов. Если очень хочется извращаться, конечно, можно писать что-нибудь типа where gid = :gid and coalesce (passport_no, '*') = coalesce (:passport_no, '*'), но это уже больше к проктологам и вынужденным общаться с их продуктами.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959113
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerВот в этом месте сферическая задача становится.. антиреальной. Смотрите сами: Вы написали запрос, который ищет в группе человека с некоторым номером паспорта. Допустим, он действительно такой нужен. И теперь хотите этим же запросом найти "людей без паспортов". Согласитесь, это совершенно разные задачи, которые скорее всего будут решаться даже в разных формах.Ну, это от системы зависит.
Одной формой с вариантом использования:
1. получить список по заданным фильтрам
2. отредактировать / удалить / просмотреть нужный объект или создать новый
я решаю все задачи по ведению таких объектов.
softwarerНу а на практике самый простой способ - использовать запрос where gid = :gid and passport_no is null. И этот запрос будет использовать индекс по (gid, passport_no), в том числе для поиска null-ов. Если очень хочется извращаться, конечно, можно писать что-нибудь типа where gid = :gid and coalesce (passport_no, '*') = coalesce (:passport_no, '*'), но это уже больше к проктологам и вынужденным общаться с их продуктами.Здесь ведь вопрос удобства программирования.
У меня в db2 для строк всегда 1 вариант предиката: ... and passport_no = :passport_no

В оракле же, насколько я понял, надо либо:
* динамику использовать - в зависимости от значения параметра, вбитого в форму, писАть:
... and passport_no = :passport_no
либо:
... and passport_no is null
* зашивать дефолтовое значение в программу (и не ошибиться с выбором дефолтового значения, чтоб потом программу не переписывать) и:
... and coalesce (passport_no, '*') = coalesce (:passport_no, '*')

Я не буду больше спорить, чтобы не затевать четвёртую серию сериала. :)
Если для ораклистов это удобно, или, действительно, встречается редко - тоже можно понять.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959261
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinЗдесь ведь вопрос удобства программирования. У меня в db2 для строк всегда 1 вариант предиката: ... and passport_no = :passport_no
И как Вы поступаете, когда в этом запросе вообще не нужен фильтр по паспорту? Передаёте null и позволяете ему вернуть пустую выборку? ;-)

Марк, Вы произнесли именно те ключевые слова - "фильтр" и "динамически" - которые я надеялся услышать, говоря "согласитесь". Чтобы потом отметить одну тонкость. Действительно, запрос вполне может быть один тогда (и в общем-то только тогда), когда к нему применяется некий глобальный фильтр. Но если этот фильтр динамический (что примерно в 100% случаев - единственно профессиональный метод, во всяком случае для Oracle) - разницы нет, один раз научить компонент вовремя подставлять is null не стоит и минуты обсуждения. Если же фильтр таки статический, то рассмотрев типичный QBE-интерфейс (а другой для статики не годится), мы увидим нечто вроде

Код: plaintext
1.
Дата выдачи с:  [__.__.____]
Дата выдачи по: [__.__.____]

и соответственно sql:

Код: plaintext
1.
2.
where 
  issue_date >= coalesce (:issue_date_from, issue_date) and
  issue_date <= coalesce (:issue_date_to, issue_date) 

И теперь, если мы попробуем добавить в фильтр строковое поле (два варианта - не нужен поиск по пустым значениям, нужен поиск по пустым значениям), как-то так окажется, что в оракловом случае sql и передача параметров кодируются не сложнее, а то и проще.

Mark BarinsteinЕсли для ораклистов это удобно, или, действительно, встречается редко - тоже можно понять.
В таком варианте это действительно встречается редко. А с отмиранием Oracle Forms с его жёсткой статикой, полагаю, окончательно потеряет актуальность.

А без протокола.. я работал так и я работал эдак, и с Oracle, и с MSSQL. И положа руку на сердце, в случае неоракловых строк геморроя больше, особенно в варианте "в таблице три поля, одно допускает null и не допускает пустые строки, другое допускает пустые строки, но не null, третье допускает и то, и другое, а в форме надо ввести значения для этих трёх полей".
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959332
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerMark BarinsteinЯ пропустил первые три серии (лень искать, простите)
Не только Вы. Забавно наблюдать, как даже Метелица ... отмечается забавными мыслями "про оракл".

Например?

Я, на самом деле, не считаю себя большим спецом по DB2, хоть работаю с ней больше 10 лет, иногда перечитываю документацию и т.п. Пробелов много; правда, многие вещи на моём месте просто не нужны. (Вот Марк - другое дело, он действительно DB2-спец). Но приходится работать с Oracle, это оказывается намного сложнее, чем DB2, и это меня бесит. Приходится вникать в такие вещи, которые я вообще даже не хотел бы знать и без которых при работе с DB2 обходился и обхожусь. Понятно, для ораклиста они нормальны, а мне как-то не забавно совсем. Ну ладно, я уже смирился. Придётся становиться хотя бы OCP DBA... в следующем году.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959344
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerMark BarinsteinЗдесь ведь вопрос удобства программирования. У меня в db2 для строк всегда 1 вариант предиката: ... and passport_no = :passport_no
И как Вы поступаете, когда в этом запросе вообще не нужен фильтр по паспорту? Передаёте null и позволяете ему вернуть пустую выборку? ;-)
Код: plaintext
... and (passport_no = :passport_no or :passport_no_Not_used_flag =  1 )
Удобно использовать, есс-но, когда не нужен индекс по искомому атрибуту (есть индекс по gid, например).
Преимущества: в кэше запросов такой запрос всегда один, для последующих таких же запросов не тратится время на парсинг, компиляцию - план доступа и так всегда один.
Сравните с кол-вом различных комбинаций для разных значений параметров при сколько нибудь значительном кол-ве разных атрибутов.
Когда таких запросиков очень много, эти накладные расходы могут становиться заметными.

Моя цель - не затеять флейм, а узнать мнение людей, которые практикой занимаются.
Вашу точку зрения я понял, спасибо.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959378
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
В оракле же, насколько я понял, надо либо:
* динамику использовать - в зависимости от значения параметра, вбитого в форму, писАть:
... and passport_no = :passport_no
либо:
... and passport_no is null
* зашивать дефолтовое значение в программу (и не ошибиться с выбором дефолтового значения, чтоб потом программу не переписывать) и:
... and coalesce (passport_no, '*') = coalesce (:passport_no, '*')

Форма, вызывается не очень часто (в масштабах запросов в секунду), количество условий заранее неизвестно. Тут я проголосовал бы за динамику, вплоть до подстановки литералов вместо использования переменных. Меня в Oracle то, что пустая строка - это NULL, уже не особо беспокоит. А вот то, что NULL-ы не индексируются, это настоящая проблема.

passport_no = :passport_no может использовать индекс
passport_no is null не сможет

Функциональные индексы грязно выглядят для решения такой ситуации. Но тут остаётся только развести руками.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959411
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, вряд ли кто-либо будет спорить с преимуществом кэша запросов, равно как и с тем, что при всём богатстве выбора большинство фильтров таки идёт по типовым сценариям. То есть, имхо, накладные расходы на построение, скажем, 500 хороших планов (из которых штук 20-40 надёжно закрепятся в кэше) имхо просто несравнимы с затратами на выполнение 50'000 запросов по одному и тому же универсально-плохому плану.

Возможно, я ошибаюсь, но мне смутно помнится, что "когда-то давно" у DB2 фактически отсутствовал кэш запросов, а планы просто жёстко прописывались при компиляции ХП либо всегда строились на ходу. Во всяком случае, именно на это я привык списывать повышенное (с моей точки зрения) внимание db2-шников к "статика vs динамика". Или это вызвано другими причинами?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959417
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Metelitsapassport_no is null не сможет
Ну, если это действительно нужно, никто не мешает создать user-defined индекс, к нему оператор ISNULL() и навсегда решить эту проблему. Но скорее любопытно, какие задачи приходится решать так, что при этом это действительно беспокоит?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959444
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я привык мерять своей меркой. А у меня к базулькам не бывает больше 200 коннектов. Формами с фильтрами пользуются далеко не все, и не чаще, чем раз в несколько минут (на самом деле, много реже). Данные могут быть десятки миллионов строк. Так что мы могли бы себе позволить даже и литералы. А кеш запросов давно есть. Кажется, это появилось при мне, до 2000-го года, где-то около 5-й версии LUW (тогда это по другому называлось, и сразу после 2-й шла 5-я). (Понятно, что сделать prepare и помнить хендл до дисконнекта можно было и до этого).
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959551
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Ну, если это действительно нужно, никто не мешает создать user-defined индекс, к нему оператор ISNULL() и навсегда решить эту проблему. Но скорее любопытно, какие задачи приходится решать так, что при этом это действительно беспокоит?

Ораклиные базы у нас чужой разработки, с сотнями и тысячами таблиц. Теоретически, вещи типа создания индексов я делать не могу. С другой стороны, это наши данные, и я могу делать любые запросы, какие нужно, никого не спрашивая. Какие именно запросы - заранее предположить не могу. Разработчики далеко, а ещё с ними (некоторыми) очень-очень непросто иметь дело.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959567
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerВозможно, я ошибаюсь, но мне смутно помнится, что "когда-то давно" у DB2 фактически отсутствовал кэш запросов, а планы просто жёстко прописывались при компиляции ХП либо всегда строились на ходу. Во всяком случае, именно на это я привык списывать повышенное (с моей точки зрения) внимание db2-шников к "статика vs динамика". Или это вызвано другими причинами?В v2.1 не было global dynamic statement cache, оно в v5 появилось.
Но это не важно.
И сейчас в db2 любят демонстрировать на туче мелких запросов преимущества static над dynamic sql - разница может достигать десятков процентов в производительности.
Даже есть прикольный тул для static profiling : оно нападает на программу, использующую динамику, ловит динамические вызовы и преобразует их в статические, а потом эта же неизменённая программа начинает пользоваться статикой.
И я не думаю, что всё это из-за того, что db2 не умеет нормально с кэшем динамических запросов работать.
Но, конечно, чтобы эту разницу увидеть, надо нагрузку соответствующего характера иметь.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959583
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача "я ничего не могу, но хочу всё-не-знаю-что" точно нерешаема, вне зависимости от null. Найдутся и другие фичи, которые Oracle возмутительно не поддерживает, хотя бы эффективный регистронезависимый поиск.

Я не был в такой ситуации и определённо не хочу в ней бывать, но с практической точки зрения - если Вы создадите индексы в своей схеме и будете использовать их в своих запросах, имхо разработчики очень мало что смогут сказать Вам. Собственно, если мне не изменяет память, при соответствующе выстроенных правах они даже не получат шанса эти индексы обнаружить (если те не будут падать, конечно).
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959622
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос может пойти по неправильному плану, начать тормозить, начнут пинать разработчиков, они увидят в плане этот индекс и спросят, откуда он взялся. Но дело пойти и хуже - ведь они найдут козла отпущения для своих собственных проблем.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959632
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaЗапрос может пойти по неправильному плану, начать тормозить, начнут пинать разработчиков, они увидят в плане этот индекс и спросят, откуда он взялся. Но дело пойти и хуже - ведь они найдут козла отпущения для своих собственных проблем.
"Запрос" - в данном контексте это какой-нибудь из запросов разработчиков.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36959688
const64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощенья, что встреваю - но (если я правильно понял из предыдущих сообщений) почему, если DB2 не умеет создавать индексы по функциям - то это для DB2 очень плохо, а если Oracle не может создавать индексы по null полям - то это никому и не надо?
...
Рейтинг: 0 / 0
25 сообщений из 200, страница 6 из 8
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Oracle XE: a five years of no progress
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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