|
|
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Флэшбек это оффтоп. Его нет ни в Oracle XE, ни даже в Std. Это EE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2010, 10:36 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
а текстовая переменная так и не может быть '', только null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2010, 07:10 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Sgt.Pepperа текстовая переменная так и не может быть '', только null? и это правильно, три раза уже тут пережевывали. SiemarglФлэшбек это оффтоп. Его нет ни в Oracle XE, ни даже в Std. Это EE. фрешбэк квери есть в любой редакции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2010, 17:56 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
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-шного. Вопрос: как всё-таки решают в оракле такую задачу? Может, есть ещё варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2010, 10:48 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinВ оракле я не могу хранить пустое значение в not null поле. Если я сделаю поле с возможностью хранения null, то мой запрос будет выглядеть так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2010, 12:10 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein Вопрос: как всё-таки решают в оракле такую задачу? Может, есть ещё варианты? where NVL(col,'*null*') =:par и соответственно индекс по NVL(col,'*null*') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2010, 12:53 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Yo.!SiemarglФлэшбек это оффтоп. Его нет ни в Oracle XE, ни даже в Std. Это EE. фрешбэк квери есть в любой редакции > alter database flashback on; Нету, а без него далеко не вернешься. ЗЫ. Про пустые строки тут срач уже был. Может хватит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2010, 18:00 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2010, 20:51 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinЯ пропустил первые три серии (лень искать, простите) Не только Вы. Забавно наблюдать, как даже Метелица, которого я уже скоро десять лет как помню как вдумчивого и грамотного db2-щика, отмечается забавными мыслями "про оракл". Mark Barinsteinи у меня практический вопрос, типа "что делают оракловые разработчики, если...". Чаще всего (следует читать как "я сходу даже не припомню, случается ли вообще другое") им ничего делать не требуется. Причин этому несколько. Во-первых, поиск "по пустой строке" - крайне редкая операция, вот честно, ни разу в жизни не сталкивался с отчётом вроде "люди с пустыми отчествами". Поиск по null в числовом поле, хоть и редок, но на порядки чаще. Во-вторых, null - практически всегда низкоселективное значение, и попытка искать его по индексу проигрывает если не фулскану, то сканированию по лучшему индексу. Если рассматривать сферическую задачу в вакууме, то неграмотный новичок, возможно, и попытается придумать "собственное пустое значение", как Вы предлагаете, но самый простой путь - использовать составной индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 10:05 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
softwarer...Во-первых, поиск "по пустой строке" - крайне редкая операция, вот честно, ни разу в жизни не сталкивался с отчётом вроде "люди с пустыми отчествами". Если рассматривать сферическую задачу в вакууме, то неграмотный новичок, возможно, и попытается придумать "собственное пустое значение", как Вы предлагаете, но самый простой путь - использовать составной индекс.Ну, задача найти людей с незаполненными паспортными данными, номерами телефона всё же встречается не так редко. Причём дело здесь не в индексе даже - по всей таблице только по этому пустому полю редко кто ищет. Вот сферическая задача: поиск по группе записей типа Код: plaintext Этот же самый запрос я использую для поиска тех, у кого нет паспортных данных. Если я правильно понял про самый простой способ (простите уж неграмотного новичка :)), это использовать для каждого такого поля дополнительное поле-флаг пустого значения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 10:49 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
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, '*'), но это уже больше к проктологам и вынужденным общаться с их продуктами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 11:47 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
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, '*') Я не буду больше спорить, чтобы не затевать четвёртую серию сериала. :) Если для ораклистов это удобно, или, действительно, встречается редко - тоже можно понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 12:27 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinЗдесь ведь вопрос удобства программирования. У меня в db2 для строк всегда 1 вариант предиката: ... and passport_no = :passport_no И как Вы поступаете, когда в этом запросе вообще не нужен фильтр по паспорту? Передаёте null и позволяете ему вернуть пустую выборку? ;-) Марк, Вы произнесли именно те ключевые слова - "фильтр" и "динамически" - которые я надеялся услышать, говоря "согласитесь". Чтобы потом отметить одну тонкость. Действительно, запрос вполне может быть один тогда (и в общем-то только тогда), когда к нему применяется некий глобальный фильтр. Но если этот фильтр динамический (что примерно в 100% случаев - единственно профессиональный метод, во всяком случае для Oracle) - разницы нет, один раз научить компонент вовремя подставлять is null не стоит и минуты обсуждения. Если же фильтр таки статический, то рассмотрев типичный QBE-интерфейс (а другой для статики не годится), мы увидим нечто вроде Код: plaintext 1. и соответственно sql: Код: plaintext 1. 2. И теперь, если мы попробуем добавить в фильтр строковое поле (два варианта - не нужен поиск по пустым значениям, нужен поиск по пустым значениям), как-то так окажется, что в оракловом случае sql и передача параметров кодируются не сложнее, а то и проще. Mark BarinsteinЕсли для ораклистов это удобно, или, действительно, встречается редко - тоже можно понять. В таком варианте это действительно встречается редко. А с отмиранием Oracle Forms с его жёсткой статикой, полагаю, окончательно потеряет актуальность. А без протокола.. я работал так и я работал эдак, и с Oracle, и с MSSQL. И положа руку на сердце, в случае неоракловых строк геморроя больше, особенно в варианте "в таблице три поля, одно допускает null и не допускает пустые строки, другое допускает пустые строки, но не null, третье допускает и то, и другое, а в форме надо ввести значения для этих трёх полей". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 13:18 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
softwarerMark BarinsteinЯ пропустил первые три серии (лень искать, простите) Не только Вы. Забавно наблюдать, как даже Метелица ... отмечается забавными мыслями "про оракл". Например? Я, на самом деле, не считаю себя большим спецом по DB2, хоть работаю с ней больше 10 лет, иногда перечитываю документацию и т.п. Пробелов много; правда, многие вещи на моём месте просто не нужны. (Вот Марк - другое дело, он действительно DB2-спец). Но приходится работать с Oracle, это оказывается намного сложнее, чем DB2, и это меня бесит. Приходится вникать в такие вещи, которые я вообще даже не хотел бы знать и без которых при работе с DB2 обходился и обхожусь. Понятно, для ораклиста они нормальны, а мне как-то не забавно совсем. Ну ладно, я уже смирился. Придётся становиться хотя бы OCP DBA... в следующем году. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 13:44 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
softwarerMark BarinsteinЗдесь ведь вопрос удобства программирования. У меня в db2 для строк всегда 1 вариант предиката: ... and passport_no = :passport_no И как Вы поступаете, когда в этом запросе вообще не нужен фильтр по паспорту? Передаёте null и позволяете ему вернуть пустую выборку? ;-) Код: plaintext Преимущества: в кэше запросов такой запрос всегда один, для последующих таких же запросов не тратится время на парсинг, компиляцию - план доступа и так всегда один. Сравните с кол-вом различных комбинаций для разных значений параметров при сколько нибудь значительном кол-ве разных атрибутов. Когда таких запросиков очень много, эти накладные расходы могут становиться заметными. Моя цель - не затеять флейм, а узнать мнение людей, которые практикой занимаются. Вашу точку зрения я понял, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 13:47 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
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 не сможет Функциональные индексы грязно выглядят для решения такой ситуации. Но тут остаётся только развести руками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 13:57 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Марк, вряд ли кто-либо будет спорить с преимуществом кэша запросов, равно как и с тем, что при всём богатстве выбора большинство фильтров таки идёт по типовым сценариям. То есть, имхо, накладные расходы на построение, скажем, 500 хороших планов (из которых штук 20-40 надёжно закрепятся в кэше) имхо просто несравнимы с затратами на выполнение 50'000 запросов по одному и тому же универсально-плохому плану. Возможно, я ошибаюсь, но мне смутно помнится, что "когда-то давно" у DB2 фактически отсутствовал кэш запросов, а планы просто жёстко прописывались при компиляции ХП либо всегда строились на ходу. Во всяком случае, именно на это я привык списывать повышенное (с моей точки зрения) внимание db2-шников к "статика vs динамика". Или это вызвано другими причинами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 14:06 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Victor Metelitsapassport_no is null не сможет Ну, если это действительно нужно, никто не мешает создать user-defined индекс, к нему оператор ISNULL() и навсегда решить эту проблему. Но скорее любопытно, какие задачи приходится решать так, что при этом это действительно беспокоит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 14:09 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Я привык мерять своей меркой. А у меня к базулькам не бывает больше 200 коннектов. Формами с фильтрами пользуются далеко не все, и не чаще, чем раз в несколько минут (на самом деле, много реже). Данные могут быть десятки миллионов строк. Так что мы могли бы себе позволить даже и литералы. А кеш запросов давно есть. Кажется, это появилось при мне, до 2000-го года, где-то около 5-й версии LUW (тогда это по другому называлось, и сразу после 2-й шла 5-я). (Понятно, что сделать prepare и помнить хендл до дисконнекта можно было и до этого). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 14:19 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
softwarer Ну, если это действительно нужно, никто не мешает создать user-defined индекс, к нему оператор ISNULL() и навсегда решить эту проблему. Но скорее любопытно, какие задачи приходится решать так, что при этом это действительно беспокоит? Ораклиные базы у нас чужой разработки, с сотнями и тысячами таблиц. Теоретически, вещи типа создания индексов я делать не могу. С другой стороны, это наши данные, и я могу делать любые запросы, какие нужно, никого не спрашивая. Какие именно запросы - заранее предположить не могу. Разработчики далеко, а ещё с ними (некоторыми) очень-очень непросто иметь дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 14:48 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
softwarerВозможно, я ошибаюсь, но мне смутно помнится, что "когда-то давно" у DB2 фактически отсутствовал кэш запросов, а планы просто жёстко прописывались при компиляции ХП либо всегда строились на ходу. Во всяком случае, именно на это я привык списывать повышенное (с моей точки зрения) внимание db2-шников к "статика vs динамика". Или это вызвано другими причинами?В v2.1 не было global dynamic statement cache, оно в v5 появилось. Но это не важно. И сейчас в db2 любят демонстрировать на туче мелких запросов преимущества static над dynamic sql - разница может достигать десятков процентов в производительности. Даже есть прикольный тул для static profiling : оно нападает на программу, использующую динамику, ловит динамические вызовы и преобразует их в статические, а потом эта же неизменённая программа начинает пользоваться статикой. И я не думаю, что всё это из-за того, что db2 не умеет нормально с кэшем динамических запросов работать. Но, конечно, чтобы эту разницу увидеть, надо нагрузку соответствующего характера иметь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 14:54 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Задача "я ничего не могу, но хочу всё-не-знаю-что" точно нерешаема, вне зависимости от null. Найдутся и другие фичи, которые Oracle возмутительно не поддерживает, хотя бы эффективный регистронезависимый поиск. Я не был в такой ситуации и определённо не хочу в ней бывать, но с практической точки зрения - если Вы создадите индексы в своей схеме и будете использовать их в своих запросах, имхо разработчики очень мало что смогут сказать Вам. Собственно, если мне не изменяет память, при соответствующе выстроенных правах они даже не получат шанса эти индексы обнаружить (если те не будут падать, конечно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 15:00 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Запрос может пойти по неправильному плану, начать тормозить, начнут пинать разработчиков, они увидят в плане этот индекс и спросят, откуда он взялся. Но дело пойти и хуже - ведь они найдут козла отпущения для своих собственных проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 15:09 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Victor MetelitsaЗапрос может пойти по неправильному плану, начать тормозить, начнут пинать разработчиков, они увидят в плане этот индекс и спросят, откуда он взялся. Но дело пойти и хуже - ведь они найдут козла отпущения для своих собственных проблем. "Запрос" - в данном контексте это какой-нибудь из запросов разработчиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 15:12 |
|
||
|
Oracle XE: a five years of no progress
|
|||
|---|---|---|---|
|
#18+
Прошу прощенья, что встреваю - но (если я правильно понял из предыдущих сообщений) почему, если DB2 не умеет создавать индексы по функциям - то это для DB2 очень плохо, а если Oracle не может создавать индексы по null полям - то это никому и не надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 15:32 |
|
||
|
|

start [/forum/topic.php?fid=35&msg=36958743&tid=1552703]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 373ms |

| 0 / 0 |
