Oracle Version: 11.1.0.7.0
У нас более высокое ожидание ввода-вывода в одном из наших экземпляров Oracle RAC.
Один SQL имеет большое время выполнения — 1452,57 с на выполнение. Это начало происходить внезапно в один прекрасный день. Раньше для запроса 20k (параметр: v4) записей требовалось максимум 3-4 минуты.
Записи о подписке: 59 миллионов (непараллельные)
Записи о заряде: 2k - 3k
SQL ниже
выберите o.msisdn, o.spid, o.serviceid, o.ChargeReferenceID, o.channelID, o.nextchargetime, o.failtimestamp, o.lastmonfeeday, o.networkId, o.retryEndDateTime, o.trialType, o.subFlag, o .faultCode из информации о подписке o, ставка r, где (o.monthbillid = :v1) и (((o.state = :"SYS_B_00") и (o.nextchargetime ‹ :v2) и ((o.IsAutoExtend ‹> :"SYS_B_01) ") или ((o.IsAutoExtend = :"SYS_B_02") и (o.extendflag ‹> :"SYS_B_03")))) или (o.subFlag = :"SYS_B_04" и o.state = :"SYS_B_05" и o .retryenddatetime > :v2)) и (o.ChargeClassForSub = r.chargeclassidx) и ((r.chargemode = :"SYS_B_06" и r.activetype = :"SYS_B_07" и o.nextchargetime != :"SYS_B_08") или ( r.chargemode = :"SYS_B_09" и r.activetype ‹> :"SYS_B_10") или (r.chargemode >= :"SYS_B_11" и r.chargemode ‹= :"SYS_B_12" и r.basecharge >= :"SYS_B_13" ) или (r.chargemode = :"SYS_B_14") или (r.chargemode = :"SYS_B_15") или (r.chargemode = :"SYS_B_16") ) и (o.failtimestamp ‹= :v3) и (rownum ‹= :v4)
Согласно отчету AWR, Top 5 Time Foreground Events
Чтение прямого пути [Среднее время ожидания: 22 с, %DB Time: 50,75%] Последовательное чтение файла БД [Среднее время ожидания: 15 с, %DB Time: 38,00]
Я не смогу опубликовать полный отчет AWR, потому что он ограничен. Поэтому, пожалуйста, спросите подробности, я опубликую
Пожалуйста, найдите план объяснения ниже:
ID Exec Ord Operation Go To More Peek Bind Capt Bind Cost2 Estim Card LAST Starts LAST Output Rows LAST Over/Under Estimate1 PStart PStop Рабочая область 0 7 SELECT STATEMENT
23335 1 2577 1 6 COUNT STOPKEY [+] [+]
[+] 23335 1 2577 2 5 . HASH JOIN [+] [+]
[+] 23335 20001 1 2577 8x over [+] 3 1 .. TABLE ACCESS FULL CHARGERATE [+] [+] 68 3035 1 3036 1x 4 4 .. СПИСОК РАЗДЕЛОВ SINGLE [ +] 23266 25223 1 2577 10x более KEY KEY 5 3 ... ДОСТУП К ТАБЛИЦАМ ПО ЛОКАЛЬНОМУ ИНДЕКСУ ROWID SUBSCRIBEINFO [+] [+] [+]
[+] 23266 25223 1 2577 10x более KEY KEY 6 2 ... .INDEX RANGE SCAN IDX_FAILTIMESTAMP_NEW [+] [+] [+] [+] 2435 1 2100765 KEY KEY
ИОСТАТ
Linux 2.6.16.46-0.12-smp (mdspdb01) 16.11.12
avg-cpu: %user %nice %system %iowait %steal %idle
8.41 0.00 9.38 13.25 0.00 67.67
Устройство: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
сда 5,71 39,53 121,79 665679995 2051190222
сдб 85,75 178,15 171,12 3000316741 2881953582
сдк 111,05 161,69 43,96 2723201251 740429949
Мы создали индекс для полей monthbillid, nextchargetime и failtimestamp... Хотя он сильно улучшил кардинальность на 1/6, но увеличил стоимость в 4-5 раз. Но оракул по умолчанию берет новый индекс
создать индекс IDX_MONTHBILLQUERY для информации о подписке (monthbillid, nextchargetime, failtimestamp) локального табличного пространства IMUSE_INDEX;
dbms_stats.gather_index_stats('IMUSE01', 'IDX_MONTHBILLQUERY');
У нас в отчетах AWR хард синтаксический анализ = 0. А также мы изменили cursor_sharing = FORCE
Теперь ИО под контролем. Все еще чувствует, это не первопричина. Кроме того, мы выделили экземпляр для этого запроса, который выполняется более 10 раз в час, для извлечения 20 000 записей требуется примерно 100 секунд.
Кто-нибудь может подсказать, будет ли хорошим решением переходить в режим оптимизатора как first_rows или использовать подсказку first_rows(20000).
На данный момент мы отключили работу статистики, можем ли мы включить то же самое только для некоторых таблиц или некоторых индексов. Это возможно?
iostat
?) - person vladr   schedule 16.11.2012