powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Reports 10 и поле типа char
21 сообщений из 21, страница 1 из 1
Reports 10 и поле типа char
    #38692810
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому интересно. Oracle Reports 10.1.2.3

Столкнулся с такой фичей, - есть таблица, с кучей полей.
В таблице есть поле, пусть будет "abc", типа char(2) not null (не индексировано), значения типа: 01,02,03 и т.д..
Так вот в "в репортах", если в запросе написать
Код: plsql
1.
where abc='01'

, то отчёт генерится минуты 2,
а если
Код: plsql
1.
where abc=01

или равносильно
Код: plsql
1.
where abc=1

, то 5-10 секунд!

Замечу, что сам запрос, что с abc='01' , что abc=1 - отрабатавает одинаково быстро (0,01 сек.)

Может кто знает, где @ зарыта?
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693110
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не верю ( C )

Запустить отчет, посмотреть ID выполняющегося запроса в сессии, посмотреть бинд переменные для данного запроса, посмотреть план для данного запроса (в данной сессии).

Ну или включить трассировку и смотреть в трассировке.

Как-то так. И все станет ясно. IMHO & AFAIK
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693274
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Сам бы не поверил )
Планы посмотрел, причина понятна и в тоже время нет )

table: id (number), abc char(2), created (sysdate) ...

index1: id
index2: zzz, abc, yyy
index3: abc, created

Запросы:
1.
Код: plsql
1.
select id from table where abc='01' and created between :date1 and :date2


2.
Код: plsql
1.
select id from table where abc=1 and created between :date1 and :date2



Так вот SQL Developer, SQL Plus в запросах 1 и 2 использует index3
А Reports, в 1 случае - index2, а во втором - index1
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693485
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Reports, в 1 случае - index2, а во втором - index1

В Вашем запросе в WHERE нет поля ID, т.ч. как может план содержать индекс по полю, которого нет в запросе - лично мне не понятно. Быть такого не может, т.к. не может быть никогда. Предположу, что Вы что-то умалчиваете и не договариваете )))

А вообще, проблемы НЕ вижу. Выбирается "плохой" индекс, ну так поставьте хинт и/или соберите статистику
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693567
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

самому не понятно..
а получается всё может быть и быть всё может, чеснслово..
скрин прилагаю
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693572
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты лучше план покажи, с index1 ))). Как Oracle вообще умудряется в данный запрос Index1 притянуть.
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693574
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и самого интересного не видно. Какой тип у d_sta, d_end
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693619
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

v$sql
sql_textmodulehash_valueselect id from hm_tp where tp='01' and created between :d_sta and :d_endrwbuilder.exe3322942397
v$sql_plan 3322942397
operation options object_nameobject_type filter_predicatesINDEXUNIQUE SCANindex1INDEX (UNIQUE)("CREATED">=:D_STA AND "CREATED"<=:D_END)INDEXSKIP SCANindex2INDEX"TP"='01'

v$sql
sql_textmodulehash_valueselect id from hm_tp where tp=01 and created between :d_sta and :d_endrwbuilder.exe1710107384
v$sql_plan 1710107384
operation options object_nameobject_type filter_predicatesINDEXUNIQUE SCANindex1INDEX (UNIQUE)TO_NUMBER("TP")=1INDEXRANGE SCANindex4INDEXnull

index4: created

d_sta и d_end: Datatype: Date , Width: 12 , Input Mask: ddmmyyyyhh24mi
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693721
-=APS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что за план такой, малость "укороченный"?
В обычном виде нет возможности показать, а то хотя бы access predicate увидеть хотелось бы.
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38693966
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=APS=-,

hash_valueoperationoptionsobject_nameobject_typecostcardinalitybytescpu_costaccess_predicatesfilter_predicatesprojectiontime3322942397"INDEX""UNIQUE SCAN""index1""INDEX (UNIQUE)"24019263274263842006"TP"='01'("CREATED">=:D_STA AND "CREATED"<=:D_END)"ID"[NUMBER.22]"33322942397"INDEX""SKIP SCAN""index2""INDEX"23977037432904167"TP"='01'"TP""='01'ROWID[ROWID.31]. "ID"[NUMBER.22]. "TP"[CHARACTER.2]. "CREATED"[DATE.7]. ROWID[ROWID.31]3

hash_valueoperationoptionsobject_nameobject_typecostcardinalitybytescpu_costaccess_predicatesfilter_predicatesprojectiontime1710107384"INDEX""UNIQUE SCAN""index1""INDEX (UNIQUE)"13696273528574"CREATED">=:D_STA AND "CREATED"<=:D_ENDTO_NUMBER("TP")=1"ID"[NUMBER.22]11710107384"INDEX""RANGE SCAN""index4""INDEX"16646261681"CREATED">=:D_STA AND "CREATED"<=:D_ENDROWID[ROWID.31]. "ID"[NUMBER.22]. "TP"[CHARACTER.2]. "CREATED"[DATE.7]. ROWID[ROWID.31]1
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38694206
-=APS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, а что за тулза, которой так план отображается?

Я ожидал увидеть, например, для второго случая что-то вроде:
SELECT STATEMENT
...TABLE ACCESS BY INDEX ROWID // тут filter по to_number(tp)=1 и projection ID
......INDEX SKIP SCAN по index4 // тут access по created, и projection ROWID
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38694209
-=APS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка, не skip, а range scan
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38697109
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=APS=-,

Не по существу APS :) а "тулза" - select from
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38698326
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Путаетесь в показаниях. Индексы были приведены с одними названиями полей (abc), план с совершенно другим названием полей.

Ну и "а что за план такой, малость "укороченный"?", в v$sql_plan есть и TABLE ACCESS и все остальное. Какие-то куски плана.

Вы уверяли, что
mRdUKEindex1: id
а на плане index1 access predicate TP='01'. Кто-то врет или Вы или Oracle. Предположу, что это Вы )))
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38698557
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Путаетесь в показаниях. Индексы были приведены с одними названиями полей (abc), план с совершенно другим названием полей.
abc это tp

Ну и "а что за план такой, малость "укороченный"?", в v$sql_plan есть и TABLE ACCESS и все остальное. Какие-то куски плана.
Там много чего есть, что нужно то, имхо необходимое привёл.

Вы уверяли, что index1: id а на плане index1 access predicate TP='01'. Кто-то врет или Вы или Oracle. Предположу, что это Вы )))
index1: id
index2: zzz, tp, yyy
index3: tp, created
index4: created

повторюсь, - именно reports использует другие индексы, те же forms используют как нужно - index3
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38699213
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя в запросе ОДНО обращение к таблице и откуда-то ДВА обращения к индексам в плане. Такого быть не должно и такое представить при элементарном условии очень сложно.

План ты привел урезанный. Каким образом эти ДВА обращения к индексу потом комбинируются совершенно не понятно. Я иногда наблюдал всякие битмап-то-ровид и комбайны с мержами но обычно на значительно более сложных запросах.

По тем обрывкам плана, которые ты привел, что происходит не понятно.

Ну и понятное дело, что Reports тут совершенно не причем.
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38699591
-=APS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно видел похожий запрос над таблицей, типа получить ID-ы строк на большом диапазоне индексированных дат "select id from bigtable where dt between ... and ..." (т.е., строк потенциально много). Картина похожая, только fast full scan по pk-индексу, без обращения к самой таблице.
Как-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
--------------------------------------------------------------------------------------------
| Id  | Operation               | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |                  |       |       |   250K(100)|          |
|*  1 |  FILTER                 |                  |       |       |            |          |
|*  2 |   VIEW                  | index$_join$_001 |   153M|  2200M|   250K (29)| 00:01:57 |
|*  3 |    HASH JOIN            |                  |       |       |            |          |
|*  4 |     INDEX RANGE SCAN    | DT_IDX           |   153M|  2200M| 48721  (54)| 00:00:23 |
|   5 |     INDEX FAST FULL SCAN| PK_IDX           |   153M|  2200M| 28895  (16)| 00:00:14 |
--------------------------------------------------------------------------------------------
Возможно, выводы оптимизатора при парсе запроса из rwbuilder были сделаны на основании "подсмотренных" биндов?
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38699599
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так создать индекс:
tp + dt + id
если хочется, что бы все из индекса бралось

Или hint'ы в запрос.

Но подозреваю или статистика кривая, либо админы "помогли"
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38699904
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНу и понятное дело, что Reports тут совершенно не причем.
Посмотрел, - согласен )

-=APS=-..на основании "подсмотренных" биндов
Что-то в "биндах", - согласен )

вообщем посмотрел EXPLAIN PLAN FOR в навигаторе, что и нужно было сделать изначально, имеем:

Код: plsql
1.
2.
3.
select id 
from hm_tp 
where tp='01' and created between :d_sta and :d_end


Id Operation Name Rows Bytes Cost (%CPU)0 SELECT STATEMENT 1926 32742 240 (1) 1 FILTER 2 INDEX UNIQUE SCAN index1 1926 32742 240 (1) 3 INDEX SKIP SCAN index2 770K 239 (1)

Код: plsql
1.
2.
3.
select id 
from hm_tp 
where tp=1 and created between :d_sta and :d_end


Id Operation Name Rows Bytes Cost (%CPU)0 SELECT STATEMENT 369 6273 1 (0) 1 FILTER 2 INDEX UNIQUE SCAN index1 369 6273 1 (0) 3 INDEX RANGE SCAN index4 6646 1 (0)

Код: plsql
1.
2.
3.
select id
from hm_tp
where tp='01' and created between to_date('010920131200','ddmmyyyyhh24mi') and to_date('010920131300','ddmmyyyyhh24mi')


Id Operation Name Rows Bytes Cost (%CPU)0 SELECT STATEMENT 14 238 1 (0) 1 INDEX RANGE SCAN index3 14 238 1 (0)

т.е. с биндами одни индексы, без - другие используются
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38721711
AG#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mRdUKE,

может Bind peeking ?

в принципе можно "кнопочку" включения-отключения трассировки в Reports сделать и отсылать по e-mail или через external table ....ну и там смотреть
...
Рейтинг: 0 / 0
Reports 10 и поле типа char
    #38721720
AG#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и разумеется после трейса его нужно зачищать...небольшой ява-процедурой с шифрованием по ключу
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Reports 10 и поле типа char
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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