|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Кому интересно. Oracle Reports 10.1.2.3 Столкнулся с такой фичей, - есть таблица, с кучей полей. В таблице есть поле, пусть будет "abc", типа char(2) not null (не индексировано), значения типа: 01,02,03 и т.д.. Так вот в "в репортах", если в запросе написать Код: plsql 1.
, то отчёт генерится минуты 2, а если Код: plsql 1.
или равносильно Код: plsql 1.
, то 5-10 секунд! Замечу, что сам запрос, что с abc='01' , что abc=1 - отрабатавает одинаково быстро (0,01 сек.) Может кто знает, где @ зарыта? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 10:57 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Не верю ( C ) Запустить отчет, посмотреть ID выполняющегося запроса в сессии, посмотреть бинд переменные для данного запроса, посмотреть план для данного запроса (в данной сессии). Ну или включить трассировку и смотреть в трассировке. Как-то так. И все станет ясно. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 13:26 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Сам бы не поверил ) Планы посмотрел, причина понятна и в тоже время нет ) table: id (number), abc char(2), created (sysdate) ... index1: id index2: zzz, abc, yyy index3: abc, created Запросы: 1. Код: plsql 1.
2. Код: plsql 1.
Так вот SQL Developer, SQL Plus в запросах 1 и 2 использует index3 А Reports, в 1 случае - index2, а во втором - index1 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 14:46 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
А Reports, в 1 случае - index2, а во втором - index1 В Вашем запросе в WHERE нет поля ID, т.ч. как может план содержать индекс по полю, которого нет в запросе - лично мне не понятно. Быть такого не может, т.к. не может быть никогда. Предположу, что Вы что-то умалчиваете и не договариваете ))) А вообще, проблемы НЕ вижу. Выбирается "плохой" индекс, ну так поставьте хинт и/или соберите статистику ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 16:07 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, самому не понятно.. а получается всё может быть и быть всё может, чеснслово.. скрин прилагаю ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 16:48 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Ты лучше план покажи, с index1 ))). Как Oracle вообще умудряется в данный запрос Index1 притянуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 16:50 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Ну и самого интересного не видно. Какой тип у d_sta, d_end ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 16:52 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 17:14 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
А что за план такой, малость "укороченный"? В обычном виде нет возможности показать, а то хотя бы access predicate увидеть хотелось бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 18:34 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
-=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 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 08:27 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Хм, а что за тулза, которой так план отображается? Я ожидал увидеть, например, для второго случая что-то вроде: SELECT STATEMENT ...TABLE ACCESS BY INDEX ROWID // тут filter по to_number(tp)=1 и projection ID ......INDEX SKIP SCAN по index4 // тут access по created, и projection ROWID ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 12:33 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Поправка, не skip, а range scan ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 12:38 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
-=APS=-, Не по существу APS :) а "тулза" - select from ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 17:11 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Путаетесь в показаниях. Индексы были приведены с одними названиями полей (abc), план с совершенно другим названием полей. Ну и "а что за план такой, малость "укороченный"?", в v$sql_plan есть и TABLE ACCESS и все остальное. Какие-то куски плана. Вы уверяли, что mRdUKEindex1: id а на плане index1 access predicate TP='01'. Кто-то врет или Вы или Oracle. Предположу, что это Вы ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 19:47 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Путаетесь в показаниях. Индексы были приведены с одними названиями полей (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 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 08:27 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
У тебя в запросе ОДНО обращение к таблице и откуда-то ДВА обращения к индексам в плане. Такого быть не должно и такое представить при элементарном условии очень сложно. План ты привел урезанный. Каким образом эти ДВА обращения к индексу потом комбинируются совершенно не понятно. Я иногда наблюдал всякие битмап-то-ровид и комбайны с мержами но обычно на значительно более сложных запросах. По тем обрывкам плана, которые ты привел, что происходит не понятно. Ну и понятное дело, что Reports тут совершенно не причем. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 15:07 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Недавно видел похожий запрос над таблицей, типа получить ID-ы строк на большом диапазоне индексированных дат "select id from bigtable where dt between ... and ..." (т.е., строк потенциально много). Картина похожая, только fast full scan по pk-индексу, без обращения к самой таблице. Как-то так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 18:35 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Ну так создать индекс: tp + dt + id если хочется, что бы все из индекса бралось Или hint'ы в запрос. Но подозреваю или статистика кривая, либо админы "помогли" ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 18:42 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevНу и понятное дело, что Reports тут совершенно не причем. Посмотрел, - согласен ) -=APS=-..на основании "подсмотренных" биндов Что-то в "биндах", - согласен ) вообщем посмотрел EXPLAIN PLAN FOR в навигаторе, что и нужно было сделать изначально, имеем: Код: plsql 1. 2. 3.
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.
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.
Id Operation Name Rows Bytes Cost (%CPU)0 SELECT STATEMENT 14 238 1 (0) 1 INDEX RANGE SCAN index3 14 238 1 (0) т.е. с биндами одни индексы, без - другие используются ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2014, 08:43 |
|
Reports 10 и поле типа char
|
|||
---|---|---|---|
#18+
mRdUKE, может Bind peeking ? в принципе можно "кнопочку" включения-отключения трассировки в Reports сделать и отсылать по e-mail или через external table ....ну и там смотреть ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2014, 12:21 |
|
|
start [/forum/topic.php?fid=51&fpage=8&tid=1878149]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
82ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 202ms |
0 / 0 |