powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Организация фильтра на DW
56 сообщений из 56, показаны все 3 страниц
Организация фильтра на DW
    #33928833
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимы мудрые мысли со стороны. Ибо... на перепутье. :(

Используется 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 ручками у меня есть, но извращения на то и извращения, что бы быть редкими, а не являться естественным способом работы!

Очень интересуют мнения о разрешении ситуации и особенно собственный выбор/опыт (желательно с объяснением "почему так").
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33928883
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно QueryByExample попробовать
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33929111
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 urvas
urvasМожно QueryByExample попробовать
В смысле?
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33929128
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33929146
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то здесь я уже пытался описать, как это работает у нас, но как всегда, лень все подробно писать. Буду краток:

1. При открытии окна, если надо сделать настройку выборки, вылезает окно настройки, где пользователь может задать параметры выборки, как-то:
Интервал дат (обычно везде это есть).
Задать условия выборки, которые добавляются к тому селекту, на котором построено DW в основном окне.
2. В окно настройки передается object.datawindow.table.select основного DW
3. Пользователь в окне настройки может выбирать разные таблицы и параметры для изменения селекта основного DW
4. Таблицы и наименование их полей показываются пользователю, используя pbcatcol и pbcattbl
5. Интерфейс достаточно прост и даже рядовой ламер легко справляется с написанием условий запросов.
6. Запросы можно сохранять, чтобы в следующий раз их не набирать.
7. После обработки данных, в основное окно возвращается подправленный object.datawindow.table.select
8. Запускаеться ретрив

Примерно так...
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33929220
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 urvas
Я к концу недели видимо совсем не соображаю уже. :(
1. Меня сбило с толку Query ByExample .
2. Я не улавливаю как мне это может помочь. :(

2 Black Savage
Насколько я понимаю это "расширенный" вариант 3 в моем списке. Только у меня идет речь исключительно о фильтре, а здесь, по большому счету, пользователю позволятся полностью конструировать результирующий список (в том числе и по составу полей). Я правильно понимаю?
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33929540
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Способ, конечно, примитивный и применим, на мой взгляд, больше к DW-grid.
А смысл в следующем - надо открыть датавиндов в режиме запроса, ввести нужные для отбора данные и выполнить запрос.
Это - вкратце.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33929691
ytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДремучийСуществует три (по крайней мере я больше не вижу) возможных решения:
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. Пришлось переписывать всю эту мутотень.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33930813
Сотников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю как в Oracle, но в ASE запрос можно пустить по интексу или написать план на него, так вот на DW вешаем процедуру с количеством параметров и пишем процедуру так, чтобы все работало по индексам при любых значениях параметров (анализ в процедуре можно сделать как угодно), причем передача значения как null дает то что этот параметр не усаствет в поиске (это тоже обрабатывается там же в процедуре)
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33931260
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СотниковНе знаю как в Oracle, но в ASE запрос можно пустить по интексу или написать план на него, так вот на DW вешаем процедуру с количеством параметров и пишем процедуру так, чтобы все работало по индексам при любых значениях параметров (анализ в процедуре можно сделать как угодно), причем передача значения как null дает то что этот параметр не усаствет в поиске (это тоже обрабатывается там же в процедуре)
Товарищ намекает на ороклячьи хинты, только я не знаю работают они в семёрке или нет, но в любом случае злоупотреблять хинтами не рекомендую. А вот по поводу процедурки - это правильно. Передать в процедурку кучу аргументов, она посмотрит какие Null или не Null и через динамический SQL вернёт в REF курсор то что надо.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33933096
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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").
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33933102
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Геннадич
ГеннадичТоварищ намекает на ороклячьи хинты, только я не знаю работают они в семёрке или нет, но в любом случае злоупотреблять хинтами не рекомендую. А вот по поводу процедурки - это правильно. Передать в процедурку кучу аргументов, она посмотрит какие Null или не Null и через динамический SQL вернёт в REF курсор то что надо.
К сожалению не пойдет. Я бы сам может так и сделал, но у нас четкое разделение на тех, кто пишет на клиенте и на тех, кто пишет на сервере... с понятными последствиями. :(
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33933213
ytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДремучийВот именно это меня и смущает в варианте 2... там индексы игнорируются (по крайней мере на Оракле 7.3), что при больших объемах таблиц может удручающе влиять на скорость.
Oracle может игнорировать индексы, но может и не игнорировать - тут "неправда Ваша".

ДремучийВ общем... честно говоря я не получил того, что ожидал. Я почему-то думал, что мое сообщение спровоцирует спор между сторонниками разных вариантов. А в результате я внимательно послушав смогу оценить минусы разных вариантов. Ведь кто лучше оппонента укажет на все недостатки? А может и еще какие интересные (для меня) мысли мелькнут. ;) Но увы... :(
Единого рецепта здесь, к сожалению, нет, посему, наверное, и нет предмета спора. Практически во всех разработках (по крайней мере, у меня) присутствуют все варианты.

ДремучийВ целом я склоняюсь к третьему варианту. Т.е. в retrieve() перечисляется тьма параметров, а потом по необходимости ручками правится раздел where, что бы избежать условий типа "( age = :age or :age is null )" (точнее использование конструкций: "... or :age is null").
Категоричные высказывания грозят в дальнейшем всеми теми неприятностями, про которые Вы и так знаете. Да, вдогонку, изменение фразы where в третьем варианте автоматически ведет к повторному разбору на сервере всего запроса.

Вам бы лучше перенестись с этим топиком в форум по Oracle, там получите гораздо больше информации по этому вопросу ...
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33933656
gal20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В свое время был использован механизм получения выборок при разных входных ограничениях - сначала во временную таблицу на основе входных параметров складывались значения PK, а потом они использовались в запросе единственного DW для отображения пользователю.
Для формирования выборок был создан объект, в котором на этапе открытия окна определялись наиболее вероятные варианты выборок. Количество выборок - сколько угодно, количество полей для ввода было разным для разных выборок, и ,если поле оставалось пустым, то оно не участвовало в запросе.
Объект в интерфейсе пользователя занимал очень мало места, что всех устраивало.
Выглядело это примерно так (приведены 2 выборки)
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33933748
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 для отображения пользователю.
Это немного другой случай. У нас тонкое место не в изначальном построении выборки, а в постоянном изменении условий одной выборки (результат постоянного использования пользователем фильтра).
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33934061
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДремучийМне на примерах (по принципу "age = :age or :age = 0") было продемонстрировано, что игнорирует... Может быть в других версиях (у нас 7.3) по другому, но мы имеем то что имеем.


Вообще в зависимости от режима оптимизации и наличия статистики такой запрос может быть преобразован оптимизатором в конкатенацию запросов:
Код: plaintext
select  1  from t where a = :a or a =  0 
=>
Код: plaintext
1.
2.
select  1  from t where a = :a 
union all  
select  1  from t where a =  0 

При этом скорее всего будет использован индекс по a.

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

В 7.3 эти хинты есть.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33934208
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Anatoly Moskovsky
Anatoly Moskovsky ДремучийМне на примерах (по принципу "age = :age or :age = 0") было продемонстрировано, что игнорирует... Может быть в других версиях (у нас 7.3) по другому, но мы имеем то что имеем.


Вообще в зависимости от режима оптимизации и наличия статистики такой запрос может быть преобразован оптимизатором в конкатенацию запросов:
Код: plaintext
select  1  from t where a = :a or a =  0 
=>
Код: plaintext
1.
2.
select  1  from t where a = :a 
union all  
select  1  from t where a =  0 

При этом скорее всего будет использован индекс по a.

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

В 7.3 эти хинты есть.
Хм... а во что это превратиться, если параметров у retrieve будет полтора-два десятка (это абсолютно реальный вариант)?
Т.е. до оптимизации будет:
Код: plaintext
1.
2.
3.
4.
5.
select  1  
from t 
where ( f = :f or f = '' )
      and ( i = :i or i = '' )
      and ( o = :o or o = '' )
...
а после???
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33934658
ytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Глянул на продолжение дискуссии. Чуть более понял постановку вопроса. Почти во всем с Вами согласен. Кроме вот этой фразы
ДремучийЭто скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика.

Это чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33934898
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДремучийХм... а во что это превратиться, если параметров у retrieve будет полтора-два десятка (это абсолютно реальный вариант)?
Т.е. до оптимизации будет:
Код: plaintext
1.
2.
3.
4.
5.
select  1  
from t 
where ( f = :f or f = '' )
      and ( i = :i or i = '' )
      and ( o = :o or o = '' )
...
а после???

1) Эта форма не разлагается на части, соединенные ИЛИ.

2) Естественно что злоупотреблять хинтом use_concat не стоит, так как при громоздких условиях слишком большое время затрачивается на компиляцию запроса с большим кол. подзапросов в union all (бывало вообще сервер зависал :))
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33934923
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ytrewqЭто чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же.

Ну не совсем.
В PB есть места, где обрезаются комменты в запросах, и все хинты идут лесом :)

К счастью в DW этого нет.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33934946
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
  and td_depo_docs.in_date between @in_date_bb and @in_date_ee
  and isnull(rtrim(ltrim(upper(td_depo_docs.out_no))),'') LIKE isnull('%'+rtrim(ltrim(upper(@out_no_nn)))+'%','%')
  and isnull(rtrim(ltrim(upper(td_depo_docs.in_no))),'') LIKE isnull('%'+rtrim(ltrim(upper(@in_no_nn)))+'%','%')
  and (td_depo_docs.correspondent_id between @correspondent_id_bb and @correspondent_id_ee
       or @correspondent_id_nn is null
      )
  and (td_depo_docs.payer_id between @payer_id_bb and @payer_id_ee
       or @payer_id_nn is null
      )
  and (td_depo_docs.pay_sum between @pay_sum_bb and @pay_sum_ee
       or @pay_sum_nn is null
      )
  and (td_depo_docs.initiator_id between @initiator_id_bb and @initiator_id_ee
       or @initiator_id_nn is null
      )
  and (td_depo_docs.document_form_id between @document_form_id_bb and @document_form_id_ee
       or @document_form_id_nn is null
      )
  and (td_depo_docs.changed_item_id between @changed_item_id_bb and @changed_item_id_ee
       or @changed_item_id_nn is null
      )
  and (td_depo_docs.depo_doc_type between @depo_doc_type_bb and @depo_doc_type_ee
       or @depo_doc_type_nn is null
      )
  and (td_depo_docs.class_id between @class_id_bb and @class_id_ee
       or @class_id_nn is null
      )
  and (td_depo_docs.folder_id between @folder_id_bb and @folder_id_ee
       or @folder_id_nn is null
      )
  and (td_depo_docs.sum_cur_id between @sum_cur_id_bb and @sum_cur_id_ee
       or @sum_cur_id_nn is null
      )
  and isnull(rtrim(ltrim(upper(td_depo_docs.foundation_remark))),'') LIKE isnull('%'+rtrim(ltrim(upper(@foundation_remark_nn)))+'%','%')
  and (td_depo_docs.arch_date between @arch_date_bb and @arch_date_ee
       or @arch_date_nn is null
      )
  and isnull(rtrim(ltrim(upper(td_depo_docs.arch_no))),'') LIKE isnull('%'+rtrim(ltrim(upper(@arch_no_nn)))+'%','%')

Правда вся эта лабудень генерится автоматом да и работает на объеме примерно 1-2 млн записей.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935344
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ytrewq
ytrewqГлянул на продолжение дискуссии. Чуть более понял постановку вопроса. Почти во всем с Вами согласен.
Это плохо. Я бы предпочел, что бы это я с вами согласился.

ytrewq Кроме вот этой фразы
ДремучийЭто скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика.

Это чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же.
Не согласен. И дело не только в том, то в MS SQL тоже "что то есть". Дело в том, что механизм передачи условия задается/обрабатывается/формируется на клиенте! Соответственно и те проблемы которые при этом возникают можно оценить только на клиенте. Соотвественно надо знать в первую очередь Билдер (в разных СР разные тараканы), а потом СУБД. Это "имхо", конечно.

2 Anatoly Moskovsky
Anatoly Moskovsky2) Естественно что злоупотреблять хинтом use_concat не стоит, так как при громоздких условиях слишком большое время затрачивается на компиляцию запроса с большим кол. подзапросов в union all (бывало вообще сервер зависал :))
Угу. :(. Испольование конструкции "( age = :age or :age is null )" намекает, что конструкций такого типа будет очень много с весьма вероятными последствиями для быстродействия. :(
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935467
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте способ 3 из Вашего начального сообщения.
Не вижу в нем никаких сложностей или извращений.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935520
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyИспользуйте способ 3 из Вашего начального сообщения.
Не вижу в нем никаких сложностей или извращений. Дремучий3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ).IMHO, черезчур сложно, проще править Table.Select
Код: plaintext
myDW.modify("DataWindow.Table.Select='" + <новый запрос, который отличается от старого только условием WHERE> + "'")
у нас только так и делают :-))
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935538
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99 Дремучий3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ).IMHO, черезчур сложно, проще править Table.Select
Код: plaintext
myDW.modify("DataWindow.Table.Select=...
у нас только так и делают :-))

Ему требуется менять и перечень аргументов DW (из-за требования DBA не зашивать значения фильтра в код запроса, а использовать bind-переменные), а это можно только так сделать:
Код: plaintext
dw.create( {новый синтаксис DW} )
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935589
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Anatoly Moskovsky
Anatoly MoskovskyИспользуйте способ 3 из Вашего начального сообщения.
Не вижу в нем никаких сложностей или извращений.
Мне казалось, что одновременная правка раздела where и передача параметров через retrieve несколько нелогична (по логике, либо то, либо то). Соотвественно в этом есть что-то извращенное.

2 PL99
Anatoly MoskovskyIMHO, черезчур сложно, проще править Table.Select
Вы правы. Так и сделано. Просто, когда я начинал ветку, я предполагал, что это не работает (по аналогии с setSQLSelect()). Отсюда и самый жестокий вариант (что, кстати, и "увеличивает" извращенность ;)

2 Anatoly Moskovsky
Anatoly MoskovskyЕму требуется менять и перечень аргументов DW (из-за требования DBA не зашивать значения фильтра в код запроса, а использовать bind-переменные), а это можно только так сделать:
Да это так, но зачем менять список аргументов? Можно ведь просто часть не использовать и все (что я и сделал).
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935615
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДремучийДа это так, но зачем менять список аргументов? Можно ведь просто часть не использовать и все (что я и сделал).
Это к вопросу об оптимизации a = :a or :a is null.

Если вырезать из where условия где аргумент null, то СУБД сможет нормальный план построить, а иначе - всегда Full Table Scan с последующим повешаньем пользователями и ДБА :)
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935655
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935715
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДремучийДля этих телодвижений достаточно править 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 =
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935775
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyБерем dw.syntax или select и делаем
ls_arg = "a"
ls_syntax = s.of_GlobalReplace(ls_syntax, ls_arg + " = :" + ls_arg, " 1=1 ")
для тех арг., где null.
Не все так просто, а диапазоны дат и чисел, а поиски по подстроке?
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935816
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДремучийОчень интересуют мнения о разрешении ситуации и особенно собственный выбор/опыт (желательно с объяснением "почему так").Не уверен, поддерживает ли это 7.3, но, тем не менее
Код: plaintext
alter session set cursor_sharing=force
Ну и вот
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935827
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 =
... при использовании строгого равенства это пройдет, хотя смотреться будет некрасиво, а вот при минимальном расширении уже нет. Поэтому лучше сразу написать механизм, который добавляет условия. Если что, то потом будет проще добавлять функционал.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935840
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99 ДремучийОчень интересуют мнения о разрешении ситуации и особенно собственный выбор/опыт (желательно с объяснением "почему так").Не уверен, поддерживает ли это 7.3, но, тем не менее
Код: plaintext
alter session set cursor_sharing=force
Ну и вот
Судя по заголовку:
Переменные связывания и совместное использование курсоров: новые тенденции в СУБД Oracle9i
в 7.3. этого нет. Но я, на всякий случай, подниму этот вопрос. Спасибо!
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33935867
Фотография 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-переменных.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33936571
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WHERE id =  123456789 
И кучу перечней к нему
Код: plaintext
WHERE master_id =  123456789 
То замена на bind переменные master_id = :master_id дадут выигрыш производительности по сравнению с прямой подстановкой констант в WHERE.

Но в таких случаях (если не считать пост "Вопрос по использованию/работе n_cst_dwsrv_linkage") не используется сложная динамическая фильтрация и исправления WHERE выражений тут не требуется.

Вообщем вопрос а стоит ли данная овчинка выделки?
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33936619
zuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к вопросу об оптимизации a = :a or :a is null.
я всегда использую конструкцию типа:
Код: plaintext
1.
select * from table_test
where nvl(:ID_FIELD,ID_FIELD) = ID_FIELD 
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33936722
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 народ:
Дремучий
1. Придет DBA и со словами "какого ... у тебя каждый запрос имеет собственный план..." в общем будут проблемы.

народ! поясните пожалуйста, чем плоха перекомпиляция плана? сервер долго его составляет? он в тихую выстраивает индексы? сам я работаю с mssql2000, с проблемой перекомпиляции не встречался
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33936869
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Estets
EstetsВообщем вопрос а стоит ли данная овчинка выделки?
Вот этот вопрос меня очень сильно интересовал. Но по тому как протекало обсуждение я сделал вывод, что подавляющее большинство с постановкой вопроса под таким углом просто не сталкивалось (лично я столкнулся недавно).

2 zuzu
zuzuк вопросу об оптимизации a = :a or :a is null.
я всегда использую конструкцию типа:
Код: plaintext
1.
select * from table_test
where nvl(:ID_FIELD,ID_FIELD) = ID_FIELD 

Хм... а план выполнения что показывает? На 7.3. у нас такая конструкция пошла шерстить всю таблицу не взирая на индексы. :(

2 savosin_sergey
savosin_sergey2 народ:
народ! поясните пожалуйста, чем плоха перекомпиляция плана? сервер долго его составляет? он в тихую выстраивает индексы? сам я работаю с mssql2000, с проблемой перекомпиляции не встречался
Насколько я понимаю (сам с такой проблемой фактически сейчас столкнулся, до этого то ли на MS SQL2000 это не такая проблема, то ли DBA мне не попадался внимательный) проблема в том, что постоянная перекомпиляция плана очень хорошо загаживает кеш при работе большого количества пользователей. Если посмотреть ссылку PL99 , то там написано следующее "Значения 1234 и 5678 в двух примерах, показанных выше, являются константами (литералами), их использование в операторах SQL является причиной возникновения накладных расходов из-за дополнительных разборов и означает, что операторы SQL в библиотечном кеше не разделяются."
Насколько это страшно (на сколько падает производительность) мне сказать трудно, но у нас DBA начал шуметь.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33936887
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 рекомендует при программировании приложений всегда использовать этот подход.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33937108
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В хороших СУБД есть автоматическая параметризация запросов :)
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33937211
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Estetsиспользование bind-переменных в данном случае это стандартная работа DW - неизменная часть WHERE выражения.Правильно, но речь идет о том, чтобы вообще не использовать retrieval аргументы. Дело в том, что в наших приложениях практически не встречаются ситуации, когда сотни пользователей выполняют один и тот же запрос с разными аргументами, поэтому запросы так или иначе вытесняются из кэша сервера.

Сейчас я выскажу крамольную мысль, но тем не менее...
В OLTP системах подавляющее большинство запросов составляют вставки и изменения, просмотры же встречаются гораздо реже. Т.е., операторы вводят первичную информацию, а выбор значений из справочников нересуроемкая операция - редко когда в справочниках больше нескольких тысяч значений, чаще порядка 10-100, в противном случае применяются альтернативные подходы, например сканер штрихкодов. Но тогда принципиально меняется интерфейс пользователя, а значит, ничего не мешает использовать bind-переменные


EstetsВообщем вопрос а стоит ли данная овчинка выделки?Во-во :-)
Короче, мы не заморачиваемся, DBA не может запретить, может только рекомендовать изменить подход для каких-то особенно критичных запросов.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33937220
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркВ хороших СУБД есть автоматическая параметризация запросов :)Oracle 7.3 уже не менее 10 лет, тогда, видимо, это было не столь актуально :-)
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33937359
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99
Сейчас я выскажу крамольную мысль, но тем не менее...
В OLTP системах подавляющее большинство запросов составляют вставки и изменения, просмотры же встречаются гораздо реже. Т.е., операторы вводят первичную информацию, а выбор значений из справочников нересуроемкая операция - редко когда в справочниках больше нескольких тысяч значений, чаще порядка 10-100, в противном случае применяются альтернативные подходы, например сканер штрихкодов. Но тогда принципиально меняется интерфейс пользователя, а значит, ничего не мешает использовать bind-переменные


речь, возможно, идёт не о справочниках, а об интерфейсе master-detail. перещёлкнул строку в master -- новый запрос из detail отправляется на сервер.. может пользователи данные и просматривают реже, чем вводят , но строк в подчинённой таблице может быть очень много. master -- шапки документов, а detail -- строки документов. их больше, чем строк в master'е!

к тому же обычно (а может это только мне обычно) ввод информации совмещён с просмотром.. например, хочется просмотреть, чего-же ты такого назаводил только что. всё зависит от постановки задачи.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33937835
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По теме чем плохо, что каждый запрос парсится.

На самом деле при хорошем проектировании системы этой проблемы вообще нет.

Проблемы начинаются, когда, из-за недостатка денег, опыта, ума и пр., объединяют в одном физическом сервере интенсивный OLTP и интенсивный OLAP. В этом случае запросы OLTP должны выполняться максимально быстро, а так как для них время исполнения сравнимо с временем парсинга, то кеширование отпарсенных запросов может значительно поднять производительность при массовых OLTP. Если же параллельно массово делается OLAP с множеством разных запросов (например вебпоисковик), то запросы OLTP вытесняются из кеша и снижается их производительность.

Поэтому при массовых операциях OLTP + OLAP, надо обязательно использовать bind-аргументы. Или просто разнести эти два типа операций на разные сервера.

Эта комбинация встречается не так уж и часто, мне вот на ум приходит только вебпоисковик (массовые изменения в базе+массовые запросы по базе).

Так что в обычной жизни посылайте своего ДБА куда подальше, поскольку вряд ли у вас именно такой проект.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942059
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, планы исполнения это заботы админов
тем более, почему вы думаете что значения null приводят к
полному сканированию таблицы (неуникальный индекс вполне работает)
И get-set sql вполне приемлемый способ
Значения сразу вписываются в sql и все работает(раз уж процедуру не хочется писать). Можно также выбрать все данные и накладывать фильтр на клиенте, но это зависит от обьема данных. Использование хинтов чревато последствиями (откуда вы знаете как собрана, допустим, та же статистика)
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942085
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помню уже как в 7-ке (давно уже не использовал), а в 8-ке и тем более в9-ке, оптимизер уже сам может делает перепривязку, ну а план выполнения составляется куда быстрее чем вы думаете (не делайте проблему из выбора плана- на это уходит меньше времени чем вы думаете и зависит от грамотности написания запросов и настроек сервера ). Если понадобится админ сам укажет узкое место и подскажет. Работать надо в команде
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942120
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001Ребята, планы исполнения это заботы админов
тем более, почему вы думаете что значения null приводят к
полному сканированию таблицы (неуникальный индекс вполне работает)
А это фича такая
http://www.dba-oracle.com/oracle_tips_ault_nulls_values.htm
странно что Вы об этом спрашиваете, если используете Oracle.
spas2001Использование хинтов чревато последствиями (откуда вы знаете как собрана, допустим, та же статистика)
Эээ, как раз скорее наоборот в отсутствии нормальной статистики.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942250
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, что это за админ который не собирает статистику?
Деньги он за что получает?
И потом, любой нормальный админ уже давно нормально автоматизировал этот процесс
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942306
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насчет первой фичи, положение дел несколько изменилось (если найду дам ссылку)
Во-вторых, правильная настройка оптимизера тоже немаловажна
В-третьих, при больших обьемах данных иной раз выгоднее использовать именно полное сканирование таблицы.
И последнее, кто сказал, что план выполнения всегда верно отображает стоимость запроса
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942315
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001Марк, что это за админ который не собирает статистику?
Деньги он за что получает?
И потом, любой нормальный админ уже давно нормально автоматизировал этот процесс
Никто не говорит что нужно везде hint'ы расставлять, но если задаваться вопросом про то "откуда мы знаем как собрана статистика?", то вполне тогда логично задаться вопросом "а откуда мы знаем есть ли там вообще админ?".
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942326
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк там где стоит Oracle, рано или поздно админ появляется, иначе система долго не проработает(может просто приходящий), иначе ребята просто с головой не дружат
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942376
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001А насчет первой фичи, положение дел несколько изменилось (если найду дам ссылку)
Oracle стал хранить значения null в b-tree индексе? К тому же речь идет о 7, где все явно не так.
spas2001В-третьих, при больших обьемах данных иной раз выгоднее использовать именно полное сканирование таблицы.
Гы-гы, full scan выгодно использовать либо при очень малых объемах данных, либо при высокой селективности предиката фильтации. А большой объем данных, средний, малый или очень большой - никакой роли не играет.
spas2001И последнее, кто сказал, что план выполнения всегда верно отображает стоимость запроса
Не понял мысли.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942390
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марклибо при высокой селективности предиката фильтации
Следует читать либо при низкой селективности предиката фильтрации.
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942417
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот видишь, сам не маленький
А если IOT используется (хотя для 7-ки таково быть не может)
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942439
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и насчет full scan ты сам ответил
...
Рейтинг: 0 / 0
Организация фильтра на DW
    #33942480
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001А если IOT используется (хотя для 7-ки таково быть не может)
IOT по нескольким индексам не построишь...
...
Рейтинг: 0 / 0
56 сообщений из 56, показаны все 3 страниц
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Организация фильтра на DW
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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