|
|
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Необходимы мудрые мысли со стороны. Ибо... на перепутье. :( Используется PB9 + Oracle7.3 Есть необходимость реализовать в приложении фильтрацию значений. Соответственно надо накладывать какие-то условия на выборку. dw.sefFilter( {тра-ля-ля} ) не подходит, т.к. он подразумевает предварительное выкачивание всей выборки. Альтернатива - каждый раз получать только то, что нужно, т.е. условия фильтрации в запросе. Существует три (по крайней мере я больше не вижу) возможных решения: 1. dw.getSqlSelect() => правим раздел Where ручками => dw.setSqlSelect( {новый select} ). 2. dw.retrieve( {дофига параметров} ). 3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ). У всех трех я вижу минусы: 1. Придет DBA и со словами "какого ... у тебя каждый запрос имеет собственный план..." в общем будут проблемы. 2. поскольку пользователь не обязан указывать ВСЕ параметры для фильтра, то в запросе должно быть что-то похожее на "( age = @age or @age is null )". Но при этом насколько я понимаю шерстится вся таблица а индексы как бы не причем... т.е. производительность этого безобразия тоже несколько не высока (т.к. предполагается, что параметров в retrieve будет... много). 3. Предыдущих минусов тут нет, т.к. мы просто убираем из where те условия которые не важны пользователю. Соответственно, план запроса (естественно, что для одинакового набора указанных пользователем полей в фильтре) будет один. Но.... черт побери! Со стороны это смотрится порядочным извращением. Навыки формирования синтаксиса DW ручками у меня есть, но извращения на то и извращения, что бы быть редкими, а не являться естественным способом работы! Очень интересуют мнения о разрешении ситуации и особенно собственный выбор/опыт (желательно с объяснением "почему так"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 16:07 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Можно QueryByExample попробовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 16:18 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 urvas urvasМожно QueryByExample попробовать В смысле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 17:08 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
dw_control.Object.DataWindow.QueryMode Whether the DataWindow is in query mode. In query mode, the user can specify the desired data by entering WHERE criteria in one or more columns. DataWindow presentation styles You cannot use QueryMode with DataWindow objects that use any of the following presentation styles: N-Up, Label, Crosstab, RichText, and Graph. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 17:11 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Где-то здесь я уже пытался описать, как это работает у нас, но как всегда, лень все подробно писать. Буду краток: 1. При открытии окна, если надо сделать настройку выборки, вылезает окно настройки, где пользователь может задать параметры выборки, как-то: Интервал дат (обычно везде это есть). Задать условия выборки, которые добавляются к тому селекту, на котором построено DW в основном окне. 2. В окно настройки передается object.datawindow.table.select основного DW 3. Пользователь в окне настройки может выбирать разные таблицы и параметры для изменения селекта основного DW 4. Таблицы и наименование их полей показываются пользователю, используя pbcatcol и pbcattbl 5. Интерфейс достаточно прост и даже рядовой ламер легко справляется с написанием условий запросов. 6. Запросы можно сохранять, чтобы в следующий раз их не набирать. 7. После обработки данных, в основное окно возвращается подправленный object.datawindow.table.select 8. Запускаеться ретрив Примерно так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 17:16 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 urvas Я к концу недели видимо совсем не соображаю уже. :( 1. Меня сбило с толку Query ByExample . 2. Я не улавливаю как мне это может помочь. :( 2 Black Savage Насколько я понимаю это "расширенный" вариант 3 в моем списке. Только у меня идет речь исключительно о фильтре, а здесь, по большому счету, пользователю позволятся полностью конструировать результирующий список (в том числе и по составу полей). Я правильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 17:36 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Способ, конечно, примитивный и применим, на мой взгляд, больше к DW-grid. А смысл в следующем - надо открыть датавиндов в режиме запроса, ввести нужные для отбора данные и выполнить запрос. Это - вкратце. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 19:22 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ДремучийСуществует три (по крайней мере я больше не вижу) возможных решения: 1. dw.getSqlSelect() => правим раздел Where ручками => dw.setSqlSelect( {новый select} ). 2. dw.retrieve( {дофига параметров} ). 3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ). У всех трех я вижу минусы: 1. Придет DBA и со словами "какого ... у тебя каждый запрос имеет собственный план..." в общем будут проблемы. 2. поскольку пользователь не обязан указывать ВСЕ параметры для фильтра, то в запросе должно быть что-то похожее на "( age = @age or @age is null )". Но при этом насколько я понимаю шерстится вся таблица а индексы как бы не причем... т.е. производительность этого безобразия тоже несколько не высока (т.к. предполагается, что параметров в retrieve будет... много). 3. Предыдущих минусов тут нет, т.к. мы просто убираем из where те условия которые не важны пользователю. Соответственно, план запроса (естественно, что для одинакового набора указанных пользователем полей в фильтре) будет один. Решения 1 и 3 друг от друга, на мой взгляд, ничем не отличаются. Все зависит от конкретного случая. Если запрос (отчет) запускается достаточно часто или с малым числом параметров и выполняется быстро, то надо использовать способ 2. В случае же, когда возможных параметров, как Вы говорили "до фига", или время выполнения запроса существенно зависит от фразы where, можно перерисовать where в DataWindow (способ 1) Злоупотреблять способом 1 не надо. Регламентированные отчеты, как правило, выполняются способом 2. А вот всякие реестры (документов, операций, инвентарных номеров, ...), где трудно определить, по каким показателям пользователь будет их искать, и объем выборки может достигать тысяч - сотен тысяч записей, можно выполнять способом 1. В своей практике использую вызов окна, в котором прописаны возможные параметры, при задании которых они подставляются во фразу where. Оперировать пользователю с наименованиями полей или таблиц не даю. Хотя, возможно, где-то это и надо (см. чуть выше Black Savage). Главное, не впадать в моразм. Мне известен случай, когда положив в основу тезис "какого ... у тебя каждый запрос имеет собственный план...", ребятки использовали способ "дофига параметров" + универсальная функция поиска на PL-SQL. На реальных объемах базы (связка 5-7 таблиц, в некоторых по паре миллионов записей) такие запросы отрабатывали 5-15-30 минут (это те, которые хватило терпения дождаться). Мне это объяснили тем, что при этом запрос повторно не парсится на ORACLE. Пришлось переписывать всю эту мутотень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 21:04 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Не знаю как в Oracle, но в ASE запрос можно пустить по интексу или написать план на него, так вот на DW вешаем процедуру с количеством параметров и пишем процедуру так, чтобы все работало по индексам при любых значениях параметров (анализ в процедуре можно сделать как угодно), причем передача значения как null дает то что этот параметр не усаствет в поиске (это тоже обрабатывается там же в процедуре) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2006, 15:56 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
СотниковНе знаю как в Oracle, но в ASE запрос можно пустить по интексу или написать план на него, так вот на DW вешаем процедуру с количеством параметров и пишем процедуру так, чтобы все работало по индексам при любых значениях параметров (анализ в процедуре можно сделать как угодно), причем передача значения как null дает то что этот параметр не усаствет в поиске (это тоже обрабатывается там же в процедуре) Товарищ намекает на ороклячьи хинты, только я не знаю работают они в семёрке или нет, но в любом случае злоупотреблять хинтами не рекомендую. А вот по поводу процедурки - это правильно. Передать в процедурку кучу аргументов, она посмотрит какие Null или не Null и через динамический SQL вернёт в REF курсор то что надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2006, 07:35 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 urvas urvasСпособ, конечно, примитивный и применим, на мой взгляд, больше к DW-grid. А смысл в следующем - надо открыть датавиндов в режиме запроса, ввести нужные для отбора данные и выполнить запрос. Это - вкратце. Да я, в общем то понял... проблема в том, что такой способ в принципе не вписывается (интерфейсно-идеологически) в проект. Да и (честно говоря) мне он совсем не нравится. 2 ytrewq ytrewqРешения 1 и 3 друг от друга, на мой взгляд, ничем не отличаются... И да и нет. В третьем варианте присутствуют параметры в dw.retrieve(...), что лучше воспринимается сервером. Хотя надо признать, что в аспекте правки раздела where это действительно близнецы братья (вся разница, что в одном случае подставляется "age = 32", а в другом "age = :age"). ytrewqГлавное, не впадать в моразм. Мне известен случай, когда положив в основу тезис "какого ... у тебя каждый запрос имеет собственный план...", ребятки использовали способ "дофига параметров" + универсальная функция поиска на PL-SQL. На реальных объемах базы (связка 5-7 таблиц, в некоторых по паре миллионов записей) такие запросы отрабатывали 5-15-30 минут (это те, которые хватило терпения дождаться). Мне это объяснили тем, что при этом запрос повторно не парсится на ORACLE. Пришлось переписывать всю эту мутотень. Вот именно это меня и смущает в варианте 2... там индексы игнорируются (по крайней мере на Оракле 7.3), что при больших объемах таблиц может удручающе влиять на скорость. В общем... честно говоря я не получил того, что ожидал. Я почему-то думал, что мое сообщение спровоцирует спор между сторонниками разных вариантов. А в результате я внимательно послушав смогу оценить минусы разных вариантов. Ведь кто лучше оппонента укажет на все недостатки? А может и еще какие интересные (для меня) мысли мелькнут. ;) Но увы... :( В целом я склоняюсь к третьему варианту. Т.е. в retrieve() перечисляется тьма параметров, а потом по необходимости ручками правится раздел where, что бы избежать условий типа "( age = :age or :age is null )" (точнее использование конструкций: "... or :age is null"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2006, 18:34 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 Геннадич ГеннадичТоварищ намекает на ороклячьи хинты, только я не знаю работают они в семёрке или нет, но в любом случае злоупотреблять хинтами не рекомендую. А вот по поводу процедурки - это правильно. Передать в процедурку кучу аргументов, она посмотрит какие Null или не Null и через динамический SQL вернёт в REF курсор то что надо. К сожалению не пойдет. Я бы сам может так и сделал, но у нас четкое разделение на тех, кто пишет на клиенте и на тех, кто пишет на сервере... с понятными последствиями. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2006, 18:37 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ДремучийВот именно это меня и смущает в варианте 2... там индексы игнорируются (по крайней мере на Оракле 7.3), что при больших объемах таблиц может удручающе влиять на скорость. Oracle может игнорировать индексы, но может и не игнорировать - тут "неправда Ваша". ДремучийВ общем... честно говоря я не получил того, что ожидал. Я почему-то думал, что мое сообщение спровоцирует спор между сторонниками разных вариантов. А в результате я внимательно послушав смогу оценить минусы разных вариантов. Ведь кто лучше оппонента укажет на все недостатки? А может и еще какие интересные (для меня) мысли мелькнут. ;) Но увы... :( Единого рецепта здесь, к сожалению, нет, посему, наверное, и нет предмета спора. Практически во всех разработках (по крайней мере, у меня) присутствуют все варианты. ДремучийВ целом я склоняюсь к третьему варианту. Т.е. в retrieve() перечисляется тьма параметров, а потом по необходимости ручками правится раздел where, что бы избежать условий типа "( age = :age or :age is null )" (точнее использование конструкций: "... or :age is null"). Категоричные высказывания грозят в дальнейшем всеми теми неприятностями, про которые Вы и так знаете. Да, вдогонку, изменение фразы where в третьем варианте автоматически ведет к повторному разбору на сервере всего запроса. Вам бы лучше перенестись с этим топиком в форум по Oracle, там получите гораздо больше информации по этому вопросу ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2006, 19:44 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
В свое время был использован механизм получения выборок при разных входных ограничениях - сначала во временную таблицу на основе входных параметров складывались значения PK, а потом они использовались в запросе единственного DW для отображения пользователю. Для формирования выборок был создан объект, в котором на этапе открытия окна определялись наиболее вероятные варианты выборок. Количество выборок - сколько угодно, количество полей для ввода было разным для разных выборок, и ,если поле оставалось пустым, то оно не участвовало в запросе. Объект в интерфейсе пользователя занимал очень мало места, что всех устраивало. Выглядело это примерно так (приведены 2 выборки) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 09:33 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 ytrewq ytrewq ДремучийВот именно это меня и смущает в варианте 2... там индексы игнорируются (по крайней мере на Оракле 7.3), что при больших объемах таблиц может удручающе влиять на скорость. Oracle может игнорировать индексы, но может и не игнорировать - тут "неправда Ваша". Мне на примерах (по принципу "age = :age or :age = 0") было продемонстрировано, что игнорирует... Может быть в других версиях (у нас 7.3) по другому, но мы имеем то что имеем. ytrewq ДремучийВ общем... честно говоря я не получил того, что ожидал. Я почему-то думал, что мое сообщение спровоцирует спор между сторонниками разных вариантов. А в результате я внимательно послушав смогу оценить минусы разных вариантов. Ведь кто лучше оппонента укажет на все недостатки? А может и еще какие интересные (для меня) мысли мелькнут. ;) Но увы... :( Единого рецепта здесь, к сожалению, нет, посему, наверное, и нет предмета спора. Практически во всех разработках (по крайней мере, у меня) присутствуют все варианты. Я как раз и рассчитывал, что единого варианта нет, а значит апологеты разных вариантов могут и схлестнуться чей канон веры каноничнее. ;) Я ошибся. ;) ytrewq ДремучийВ целом я склоняюсь к третьему варианту. Т.е. в retrieve() перечисляется тьма параметров, а потом по необходимости ручками правится раздел where, что бы избежать условий типа "( age = :age or :age is null )" (точнее использование конструкций: "... or :age is null"). Категоричные высказывания грозят в дальнейшем всеми теми неприятностями, про которые Вы и так знаете. Да, вдогонку, изменение фразы where в третьем варианте автоматически ведет к повторному разбору на сервере всего запроса. А где Вы здесь увидели "категоричность"? ;) А по поводу "изменение фразы where". Угу. Но (насколько я понимаю) при повторном использовании фразы одного типа повторного разбора не будет. Т.е., если в реальной работе в 90-95% случаев используется 2-3 варианта задания условий для фильтра (например, "фамилия", "фамилия и год рождения" и "фамилия и имя" ), то в большинстве случаев новых планов создаваться не будет. А вот если указывать "в лоб" (по типу "family = 'Иванов'"), то практически каждое обращение к БД будет инициировать составление нового плана. ytrewqВам бы лучше перенестись с этим топиком в форум по Oracle, там получите гораздо больше информации по этому вопросу ... Мне кажется нет. Это скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика. 2 gal20 gal20В свое время был использован механизм получения выборок при разных входных ограничениях - сначала во временную таблицу на основе входных параметров складывались значения PK, а потом они использовались в запросе единственного DW для отображения пользователю. Это немного другой случай. У нас тонкое место не в изначальном построении выборки, а в постоянном изменении условий одной выборки (результат постоянного использования пользователем фильтра). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 10:19 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ДремучийМне на примерах (по принципу "age = :age or :age = 0") было продемонстрировано, что игнорирует... Может быть в других версиях (у нас 7.3) по другому, но мы имеем то что имеем. Вообще в зависимости от режима оптимизации и наличия статистики такой запрос может быть преобразован оптимизатором в конкатенацию запросов: Код: plaintext Код: plaintext 1. 2. При этом скорее всего будет использован индекс по a. Для принудительного включения такой трансляции можно использовать хинты use_concat, first_rows В 7.3 эти хинты есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 11:41 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 Anatoly Moskovsky Anatoly Moskovsky ДремучийМне на примерах (по принципу "age = :age or :age = 0") было продемонстрировано, что игнорирует... Может быть в других версиях (у нас 7.3) по другому, но мы имеем то что имеем. Вообще в зависимости от режима оптимизации и наличия статистики такой запрос может быть преобразован оптимизатором в конкатенацию запросов: Код: plaintext Код: plaintext 1. 2. При этом скорее всего будет использован индекс по a. Для принудительного включения такой трансляции можно использовать хинты use_concat, first_rows В 7.3 эти хинты есть. Хм... а во что это превратиться, если параметров у retrieve будет полтора-два десятка (это абсолютно реальный вариант)? Т.е. до оптимизации будет: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 12:13 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Глянул на продолжение дискуссии. Чуть более понял постановку вопроса. Почти во всем с Вами согласен. Кроме вот этой фразы ДремучийЭто скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика. Это чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 13:40 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ДремучийХм... а во что это превратиться, если параметров у retrieve будет полтора-два десятка (это абсолютно реальный вариант)? Т.е. до оптимизации будет: Код: plaintext 1. 2. 3. 4. 5. 1) Эта форма не разлагается на части, соединенные ИЛИ. 2) Естественно что злоупотреблять хинтом use_concat не стоит, так как при громоздких условиях слишком большое время затрачивается на компиляцию запроса с большим кол. подзапросов в union all (бывало вообще сервер зависал :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 14:41 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ytrewqЭто чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же. Ну не совсем. В PB есть места, где обрезаются комменты в запросах, и все хинты идут лесом :) К счастью в DW этого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 14:45 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ytrewqГлянул на продолжение дискуссии. Чуть более понял постановку вопроса. Почти во всем с Вами согласен. Кроме вот этой фразы ДремучийЭто скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика. Это чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же. Из вашей постановки следует что на MS SQL или Sybase данной проблемы не возникнет? К сожалению возникнет. И вопросы будут одни и те же. Из своего опыта могу сказать что используются процедуры с "дофига параметров", но это связано с проверкой безопасности и допусков которые реализовать в View невозможно Вот типичный пример фильтрации списка документов: Код: 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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Правда вся эта лабудень генерится автоматом да и работает на объеме примерно 1-2 млн записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 14:52 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 ytrewq ytrewqГлянул на продолжение дискуссии. Чуть более понял постановку вопроса. Почти во всем с Вами согласен. Это плохо. Я бы предпочел, что бы это я с вами согласился. ytrewq Кроме вот этой фразы ДремучийЭто скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика. Это чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же. Не согласен. И дело не только в том, то в MS SQL тоже "что то есть". Дело в том, что механизм передачи условия задается/обрабатывается/формируется на клиенте! Соответственно и те проблемы которые при этом возникают можно оценить только на клиенте. Соотвественно надо знать в первую очередь Билдер (в разных СР разные тараканы), а потом СУБД. Это "имхо", конечно. 2 Anatoly Moskovsky Anatoly Moskovsky2) Естественно что злоупотреблять хинтом use_concat не стоит, так как при громоздких условиях слишком большое время затрачивается на компиляцию запроса с большим кол. подзапросов в union all (бывало вообще сервер зависал :)) Угу. :(. Испольование конструкции "( age = :age or :age is null )" намекает, что конструкций такого типа будет очень много с весьма вероятными последствиями для быстродействия. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 16:20 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Используйте способ 3 из Вашего начального сообщения. Не вижу в нем никаких сложностей или извращений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 16:55 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyИспользуйте способ 3 из Вашего начального сообщения. Не вижу в нем никаких сложностей или извращений. Дремучий3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ).IMHO, черезчур сложно, проще править Table.Select Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 17:08 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
PL99 Дремучий3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ).IMHO, черезчур сложно, проще править Table.Select Код: plaintext Ему требуется менять и перечень аргументов DW (из-за требования DBA не зашивать значения фильтра в код запроса, а использовать bind-переменные), а это можно только так сделать: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 17:13 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 Anatoly Moskovsky Anatoly MoskovskyИспользуйте способ 3 из Вашего начального сообщения. Не вижу в нем никаких сложностей или извращений. Мне казалось, что одновременная правка раздела where и передача параметров через retrieve несколько нелогична (по логике, либо то, либо то). Соотвественно в этом есть что-то извращенное. 2 PL99 Anatoly MoskovskyIMHO, черезчур сложно, проще править Table.Select Вы правы. Так и сделано. Просто, когда я начинал ветку, я предполагал, что это не работает (по аналогии с setSQLSelect()). Отсюда и самый жестокий вариант (что, кстати, и "увеличивает" извращенность ;) 2 Anatoly Moskovsky Anatoly MoskovskyЕму требуется менять и перечень аргументов DW (из-за требования DBA не зашивать значения фильтра в код запроса, а использовать bind-переменные), а это можно только так сделать: Да это так, но зачем менять список аргументов? Можно ведь просто часть не использовать и все (что я и сделал). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 17:32 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ДремучийДа это так, но зачем менять список аргументов? Можно ведь просто часть не использовать и все (что я и сделал). Это к вопросу об оптимизации a = :a or :a is null. Если вырезать из where условия где аргумент null, то СУБД сможет нормальный план построить, а иначе - всегда Full Table Scan с последующим повешаньем пользователями и ДБА :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 17:39 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky ДремучийДа это так, но зачем менять список аргументов? Можно ведь просто часть не использовать и все (что я и сделал). Это к вопросу об оптимизации a = :a or :a is null. Если вырезать из where условия где аргумент null, то СУБД сможет нормальный план построить, а иначе - всегда Full Table Scan с последующим повешаньем пользователями и ДБА :) То ли Вы меня не понимаете, то ли я Вас... Я делаю так: 1. Список аргументов в retrieve максимально полон (во время рисования в painter`е). 2. Условий в where нет вообще никаких (во время рисования в painter`е). Естественно, что какие-то условия могут быть (например, если данные из БД не удаляются, а помечаются как удаленные, то "удаленные" нужно отсечь сразу). 3. При использовании фильтра (или еще при какой надобности). Смотрится какие аргументы отличны от null/0/'' (и т.п.) и соответственно для этих аргументов вносится (добавляется к "базовому" условию в where, если оно есть, конечно) их упоминание в раздел where (по типу "a = :a"). Для этих телодвижений достаточно править dw.object.datawindow.table.select. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 17:55 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ДремучийДля этих телодвижений достаточно править dw.object.datawindow.table.select. Странно, я всегда думал что при использовании аргументов datawindow.table.select нельзя менять. Или это только про SetSQLSelect ? OK. Тут у меня одна идейка возникла, уже по реализации, применимая к обоим подходам, чтобы упростить модификацию where. Берем dw.syntax или select и делаем ls_arg = "a" ls_syntax = s.of_GlobalReplace(ls_syntax, ls_arg + " = :" + ls_arg, " 1=1 ") для тех арг., где null. А затем create() или dw.object.datawindow.table.select = ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 18:11 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyБерем dw.syntax или select и делаем ls_arg = "a" ls_syntax = s.of_GlobalReplace(ls_syntax, ls_arg + " = :" + ls_arg, " 1=1 ") для тех арг., где null. Не все так просто, а диапазоны дат и чисел, а поиски по подстроке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 18:30 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
ДремучийОчень интересуют мнения о разрешении ситуации и особенно собственный выбор/опыт (желательно с объяснением "почему так").Не уверен, поддерживает ли это 7.3, но, тем не менее Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 18:47 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky ДремучийДля этих телодвижений достаточно править dw.object.datawindow.table.select. Странно, я всегда думал что при использовании аргументов datawindow.table.select нельзя менять. Или это только про SetSQLSelect ? :) Я тоже так думал. Поэтому тоже первоначально писал о dw.create() OK. Anatoly MoskovskyТут у меня одна идейка возникла, уже по реализации, применимая к обоим подходам, чтобы упростить модификацию where. Берем dw.syntax или select и делаем ls_arg = "a" ls_syntax = s.of_GlobalReplace(ls_syntax, ls_arg + " = :" + ls_arg, " 1=1 ") для тех арг., где null. А затем create() или dw.object.datawindow.table.select = ... при использовании строгого равенства это пройдет, хотя смотреться будет некрасиво, а вот при минимальном расширении уже нет. Поэтому лучше сразу написать механизм, который добавляет условия. Если что, то потом будет проще добавлять функционал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 18:52 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
PL99 ДремучийОчень интересуют мнения о разрешении ситуации и особенно собственный выбор/опыт (желательно с объяснением "почему так").Не уверен, поддерживает ли это 7.3, но, тем не менее Код: plaintext Судя по заголовку: Переменные связывания и совместное использование курсоров: новые тенденции в СУБД Oracle9i в 7.3. этого нет. Но я, на всякий случай, подниму этот вопрос. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 18:57 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Estets Anatoly MoskovskyБерем dw.syntax или select и делаем ls_arg = "a" ls_syntax = s.of_GlobalReplace(ls_syntax, ls_arg + " = :" + ls_arg, " 1=1 ") для тех арг., где null. Не все так просто, а диапазоны дат и чисел, а поиски по подстроке? Общий подход сформулирован давно, надо только реализовать его так, чтобы у DBA не было поводов для наезда :-) У нас пока все по простому, без bind-переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 19:13 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
PL99 Estets Anatoly MoskovskyБерем dw.syntax или select и делаем ls_arg = "a" ls_syntax = s.of_GlobalReplace(ls_syntax, ls_arg + " = :" + ls_arg, " 1=1 ") для тех арг., где null. Не все так просто, а диапазоны дат и чисел, а поиски по подстроке? Общий подход сформулирован давно, надо только реализовать его так, чтобы у DBA не было поводов для наезда :-) У нас пока все по простому, без bind-переменных. Я конечно могу ошибаться, поскольку ORALE знаю хуже, но использование bind-переменных в данном случае это стандартная работа DW - неизменная часть WHERE выражения. И вся прелесть фильтрации в которой аргументы NULL приводят удалению части WHERE выражения, пропадает. Cерверу придется парсить и перестраивать план запроса? Хотя с другой стороны если основной объем запросов к серверу показать документ Код: plaintext Код: plaintext Но в таких случаях (если не считать пост "Вопрос по использованию/работе n_cst_dwsrv_linkage") не используется сложная динамическая фильтрация и исправления WHERE выражений тут не требуется. Вообщем вопрос а стоит ли данная овчинка выделки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 10:29 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
к вопросу об оптимизации a = :a or :a is null. я всегда использую конструкцию типа: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 10:38 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 народ: Дремучий 1. Придет DBA и со словами "какого ... у тебя каждый запрос имеет собственный план..." в общем будут проблемы. народ! поясните пожалуйста, чем плоха перекомпиляция плана? сервер долго его составляет? он в тихую выстраивает индексы? сам я работаю с mssql2000, с проблемой перекомпиляции не встречался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 10:59 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 Estets EstetsВообщем вопрос а стоит ли данная овчинка выделки? Вот этот вопрос меня очень сильно интересовал. Но по тому как протекало обсуждение я сделал вывод, что подавляющее большинство с постановкой вопроса под таким углом просто не сталкивалось (лично я столкнулся недавно). 2 zuzu zuzuк вопросу об оптимизации a = :a or :a is null. я всегда использую конструкцию типа: Код: plaintext 1. Хм... а план выполнения что показывает? На 7.3. у нас такая конструкция пошла шерстить всю таблицу не взирая на индексы. :( 2 savosin_sergey savosin_sergey2 народ: народ! поясните пожалуйста, чем плоха перекомпиляция плана? сервер долго его составляет? он в тихую выстраивает индексы? сам я работаю с mssql2000, с проблемой перекомпиляции не встречался Насколько я понимаю (сам с такой проблемой фактически сейчас столкнулся, до этого то ли на MS SQL2000 это не такая проблема, то ли DBA мне не попадался внимательный) проблема в том, что постоянная перекомпиляция плана очень хорошо загаживает кеш при работе большого количества пользователей. Если посмотреть ссылку PL99 , то там написано следующее "Значения 1234 и 5678 в двух примерах, показанных выше, являются константами (литералами), их использование в операторах SQL является причиной возникновения накладных расходов из-за дополнительных разборов и означает, что операторы SQL в библиотечном кеше не разделяются." Насколько это страшно (на сколько падает производительность) мне сказать трудно, но у нас DBA начал шуметь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 11:28 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
2 savosin_sergey Из той же ссылки: Как было показано в предыдущем разделе, при просмотре библиотечного кеша только полностью идентичные операторы SQL будут считаться идентичными. Следовательно, два оператора: select * from emp where empno=1234 и select * from emp where empno=5678 считаются различными и для их выполнения потребуются два полных разбора и две отдельных записи в библиотечном кеше. Вот почему настоятельно рекомендуется для связывания значений в прикладной программе использовать в операторах SQL переменные связывания, фактические значения которых подставляются только во время выполнения программы. Оператор, показанный выше, теперь будет таким: select * from emp where empno=:x Его можно выполнять много раз с различными значениями переменной связывания :x. В хорошо написанном приложении будет выполняться один разбор этого оператора, затем его можно выполнять столько раз, сколько требуется, с различными значениями переменной связывания в прикладной программе. Такой подход не только повышает производительность одной программы, он также обеспечивает масштабируемость многочисленных параллельно работающих программ, разделяющих одну и ту же копию данного оператора SQL. Корпорация Oracle рекомендует при программировании приложений всегда использовать этот подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 11:32 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
В хороших СУБД есть автоматическая параметризация запросов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 12:20 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Estetsиспользование bind-переменных в данном случае это стандартная работа DW - неизменная часть WHERE выражения.Правильно, но речь идет о том, чтобы вообще не использовать retrieval аргументы. Дело в том, что в наших приложениях практически не встречаются ситуации, когда сотни пользователей выполняют один и тот же запрос с разными аргументами, поэтому запросы так или иначе вытесняются из кэша сервера. Сейчас я выскажу крамольную мысль, но тем не менее... В OLTP системах подавляющее большинство запросов составляют вставки и изменения, просмотры же встречаются гораздо реже. Т.е., операторы вводят первичную информацию, а выбор значений из справочников нересуроемкая операция - редко когда в справочниках больше нескольких тысяч значений, чаще порядка 10-100, в противном случае применяются альтернативные подходы, например сканер штрихкодов. Но тогда принципиально меняется интерфейс пользователя, а значит, ничего не мешает использовать bind-переменные EstetsВообщем вопрос а стоит ли данная овчинка выделки?Во-во :-) Короче, мы не заморачиваемся, DBA не может запретить, может только рекомендовать изменить подход для каких-то особенно критичных запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 12:42 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Локшин МаркВ хороших СУБД есть автоматическая параметризация запросов :)Oracle 7.3 уже не менее 10 лет, тогда, видимо, это было не столь актуально :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 12:44 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
PL99 Сейчас я выскажу крамольную мысль, но тем не менее... В OLTP системах подавляющее большинство запросов составляют вставки и изменения, просмотры же встречаются гораздо реже. Т.е., операторы вводят первичную информацию, а выбор значений из справочников нересуроемкая операция - редко когда в справочниках больше нескольких тысяч значений, чаще порядка 10-100, в противном случае применяются альтернативные подходы, например сканер штрихкодов. Но тогда принципиально меняется интерфейс пользователя, а значит, ничего не мешает использовать bind-переменные речь, возможно, идёт не о справочниках, а об интерфейсе master-detail. перещёлкнул строку в master -- новый запрос из detail отправляется на сервер.. может пользователи данные и просматривают реже, чем вводят , но строк в подчинённой таблице может быть очень много. master -- шапки документов, а detail -- строки документов. их больше, чем строк в master'е! к тому же обычно (а может это только мне обычно) ввод информации совмещён с просмотром.. например, хочется просмотреть, чего-же ты такого назаводил только что. всё зависит от постановки задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 13:13 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
По теме чем плохо, что каждый запрос парсится. На самом деле при хорошем проектировании системы этой проблемы вообще нет. Проблемы начинаются, когда, из-за недостатка денег, опыта, ума и пр., объединяют в одном физическом сервере интенсивный OLTP и интенсивный OLAP. В этом случае запросы OLTP должны выполняться максимально быстро, а так как для них время исполнения сравнимо с временем парсинга, то кеширование отпарсенных запросов может значительно поднять производительность при массовых OLTP. Если же параллельно массово делается OLAP с множеством разных запросов (например вебпоисковик), то запросы OLTP вытесняются из кеша и снижается их производительность. Поэтому при массовых операциях OLTP + OLAP, надо обязательно использовать bind-аргументы. Или просто разнести эти два типа операций на разные сервера. Эта комбинация встречается не так уж и часто, мне вот на ум приходит только вебпоисковик (массовые изменения в базе+массовые запросы по базе). Так что в обычной жизни посылайте своего ДБА куда подальше, поскольку вряд ли у вас именно такой проект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:08 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Ребята, планы исполнения это заботы админов тем более, почему вы думаете что значения null приводят к полному сканированию таблицы (неуникальный индекс вполне работает) И get-set sql вполне приемлемый способ Значения сразу вписываются в sql и все работает(раз уж процедуру не хочется писать). Можно также выбрать все данные и накладывать фильтр на клиенте, но это зависит от обьема данных. Использование хинтов чревато последствиями (откуда вы знаете как собрана, допустим, та же статистика) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 09:47 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Не помню уже как в 7-ке (давно уже не использовал), а в 8-ке и тем более в9-ке, оптимизер уже сам может делает перепривязку, ну а план выполнения составляется куда быстрее чем вы думаете (не делайте проблему из выбора плана- на это уходит меньше времени чем вы думаете и зависит от грамотности написания запросов и настроек сервера ). Если понадобится админ сам укажет узкое место и подскажет. Работать надо в команде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 09:59 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
spas2001Ребята, планы исполнения это заботы админов тем более, почему вы думаете что значения null приводят к полному сканированию таблицы (неуникальный индекс вполне работает) А это фича такая http://www.dba-oracle.com/oracle_tips_ault_nulls_values.htm странно что Вы об этом спрашиваете, если используете Oracle. spas2001Использование хинтов чревато последствиями (откуда вы знаете как собрана, допустим, та же статистика) Эээ, как раз скорее наоборот в отсутствии нормальной статистики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 10:10 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Марк, что это за админ который не собирает статистику? Деньги он за что получает? И потом, любой нормальный админ уже давно нормально автоматизировал этот процесс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 10:44 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
А насчет первой фичи, положение дел несколько изменилось (если найду дам ссылку) Во-вторых, правильная настройка оптимизера тоже немаловажна В-третьих, при больших обьемах данных иной раз выгоднее использовать именно полное сканирование таблицы. И последнее, кто сказал, что план выполнения всегда верно отображает стоимость запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 10:56 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
spas2001Марк, что это за админ который не собирает статистику? Деньги он за что получает? И потом, любой нормальный админ уже давно нормально автоматизировал этот процесс Никто не говорит что нужно везде hint'ы расставлять, но если задаваться вопросом про то "откуда мы знаем как собрана статистика?", то вполне тогда логично задаться вопросом "а откуда мы знаем есть ли там вообще админ?". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 10:58 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Марк там где стоит Oracle, рано или поздно админ появляется, иначе система долго не проработает(может просто приходящий), иначе ребята просто с головой не дружат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 11:01 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
spas2001А насчет первой фичи, положение дел несколько изменилось (если найду дам ссылку) Oracle стал хранить значения null в b-tree индексе? К тому же речь идет о 7, где все явно не так. spas2001В-третьих, при больших обьемах данных иной раз выгоднее использовать именно полное сканирование таблицы. Гы-гы, full scan выгодно использовать либо при очень малых объемах данных, либо при высокой селективности предиката фильтации. А большой объем данных, средний, малый или очень большой - никакой роли не играет. spas2001И последнее, кто сказал, что план выполнения всегда верно отображает стоимость запроса Не понял мысли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 11:15 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Локшин Марклибо при высокой селективности предиката фильтации Следует читать либо при низкой селективности предиката фильтрации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 11:19 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Ну вот видишь, сам не маленький А если IOT используется (хотя для 7-ки таково быть не может) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 11:26 |
|
||
|
Организация фильтра на DW
|
|||
|---|---|---|---|
|
#18+
Ну и насчет full scan ты сам ответил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2006, 11:31 |
|
||
|
|

start [/forum/topic.php?all=1&fid=15&tid=1337628]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 308ms |

| 0 / 0 |
