SQL.RU
 client/server technologies
 
 Главная | Документация | Статьи | Книги | Форум | Опросы | Рассылка | Работа | Поиск | FAQ |

Добро пожаловать в форум, Guest  >>  Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик  Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5]      все
 Re: Не работает оптимизатор   [new]
-=Marat=-
Member

Откуда:
Сообщений: 120
dmidek
Попробуйте собрать гистограммы по проблемной таблице

dbms_stats.gather_table_stats(owner, table_name, cascade=> true, method_opt => 'for all columns size 254');



а это дело долго делается? а то у меня уже 15 минут выполняется....это нормально?
23 авг 06, 12:09    [3042318] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
fortnet
Member

Откуда:
Сообщений: 408
Слушайте, ну вы даете. У вас полная каша в голове. Чем вы собираете статистику на "хорошей БД" ? Аналогично должно собираться и на "тормозной".
db_cache_size=367001600 - на "плохом"
db_cache_size=25165824 - на "хорошем"
Это вы называете одинаковыми "базульками".
Настраивайте OPTIMIZER_INDEX_CACHING и все что полагается
(OPTIMIZER_INDEX_COST_ADJ ...)
Собранная статистика смотрится там же в user_tables:
NUM_ROWS
BLOCKS
..
user_indexes:

BLEVEL
LEAF_BLOCKS
...
Или возвращайтесь к RBO и/или hints
23 авг 06, 12:18    [3042400] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
dmidek
Member

Откуда: Киев -> Дортмунд
Сообщений: 31258
-=Marat=-
dmidek
Попробуйте собрать гистограммы по проблемной таблице

dbms_stats.gather_table_stats(owner, table_name, cascade=> true, method_opt => 'for all columns size 254');



а это дело долго делается? а то у меня уже 15 минут выполняется....это нормально?

Да.
23 авг 06, 12:20    [3042413] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
-=Marat=-
Member

Откуда:
Сообщений: 120
fortnet
Слушайте, ну вы даете. У вас полная каша в голове. Чем вы собираете статистику на "хорошей БД" ? Аналогично должно собираться и на "тормозной".
db_cache_size=367001600 - на "плохом"
db_cache_size=25165824 - на "хорошем"
Это вы называете одинаковыми "базульками".
Настраивайте OPTIMIZER_INDEX_CACHING и все что полагается
(OPTIMIZER_INDEX_COST_ADJ ...)
Собранная статистика смотрится там же в user_tables:
NUM_ROWS
BLOCKS
..
user_indexes:

BLEVEL
LEAF_BLOCKS
...
Или возвращайтесь к RBO и/или hints




да вы не сравнивайте уже плохой и хороший сервер.......

теперь то проблема в следующем...... есть один сервер! на нем после сбора статистики запросы выполняются с использованием FULL scan
как только статистику удаляешь..... сразу начинают использоваться индексы!!!
собираешь статистику опять.... и снова FULL SCAN!!!
23 авг 06, 12:26    [3042461] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
-=Marat=-
Member

Откуда:
Сообщений: 120
dmidek
-=Marat=-
dmidek
Попробуйте собрать гистограммы по проблемной таблице

dbms_stats.gather_table_stats(owner, table_name, cascade=> true, method_opt => 'for all columns size 254');



а это дело долго делается? а то у меня уже 15 минут выполняется....это нормально?

Да.



ну тогда ждемс.....
23 авг 06, 12:27    [3042468] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
fortnet
Member

Откуда:
Сообщений: 408
-=Marat=-
да вы не сравнивайте уже плохой и хороший сервер.......

теперь то проблема в следующем...... есть один сервер! на нем после сбора статистики запросы выполняются с использованием FULL scan
как только статистику удаляешь..... сразу начинают использоваться индексы!!!
собираешь статистику опять.... и снова FULL SCAN!!!

Вы ничего не поняли, да, вам, возможно это и не надо.
23 авг 06, 12:31    [3042490] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
RAK123
Guest
-=Marat=-
кое что вот нарыл.....

после того как удалил всю статистику собранную с помощью dbms_utility.ANALYZE_SCHEMA с плохой базы....план запроса поменялся.....и стал нормально выбирать по индексу как положено.....
т.е. получается что собранная статистика все и портила.....

сейчас запустил сбор статистики с помощью dbms_stats.GATHER_DATABASE_STATS как закончит посмотрю к чему это приведет.....


Было что то похожее .
После переналивки базы (exp,imp)некоторые запросы начали делать Full Scan .
Пришел к следующему выводу .
До переналивки таблица занимала 40 блоков .
После переналивки 10.
DB_FILE_MULTIBLOCK_READ_COUNT=4
Стоимость чтения по индексу с этой таблицы была равна 12.
Когда перелили базу стоимость полного чтения стала равна
10/DB_FILE_MULTIBLOCK_READ_COUNT=3.
То есть дешевле чем стоимость чтения по индексу .
В результате оптимизатор предпочел Full Scan.
Тогда я удалил статистику с этой таблицы .
Запрос начал работать через RULE и в результате индекс cтал использоваться .
Знаю что сделал плохо , но выхода не было .


У меня 8 ка .
23 авг 06, 12:32    [3042497] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
Ваши проблемы от использования неверных типов данных, в частности для хранения даты использование числа вместо даты.
Я буду рассматривать упрощенный запрос с отбором по дате

select * from shax where zam_date>20060301
Выжимки из вашего 10053:
Плохой, данные по таблице:
Table stats    Table: SHAX   Alias: SHAX
  TOTAL ::  CDN: 10411456  NBLKS:  59708  AVG_ROW_LEN:  39
SINGLE TABLE ACCESS PATH
Column:   ZAM_DATE  Col#: 2      Table: SHAX   Alias: SHAX
    NDV: 2264      NULLS: 0         DENS: 4.4170e-004 LO:  18991230  HI: 20090803
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: SHAX     ORIG CDN: 10411456  ROUNDED CDN: 288812  CMPTD CDN: 288812
Хороший, данные по таблице:
Table stats    Table: SHAX   Alias: SHAX
  TOTAL ::  CDN: 8207527  NBLKS:  46960  AVG_ROW_LEN:  39
SINGLE TABLE ACCESS PATH
Column:   ZAM_DATE  Col#: 2      Table: SHAX   Alias: SHAX
    NDV: 2152      NULLS: 0         DENS: 4.6468e-004 LO:  18991230  HI: 20060817
    NO HISTOGRAM: #BKT: 1 #VAL: 2
Плохой, рассмотрение индекса по ZAM_DATE :
  Access path: index (scan)
      Index: ZAM_DATE
  TABLE: SHAX
      RSC_CPU: 0   RSC_IO: 10333
  IX_SEL:  2.7740e-002  TB_SEL:  2.7740e-002
  BEST_CST: 5744.00  PATH: 2  Degree:  1
Хороший, рассмотрение индекса по ZAM_DATE:
  Access path: index (scan)
      Index: ZAM_DATE
  TABLE: SHAX
      RSC_CPU: 0   RSC_IO: 125
  IX_SEL:  4.8243e-004  TB_SEL:  4.8243e-004
  BEST_CST: 125.00  PATH: 4  Degree: 

Селективность для условия c1 > value вычисляется по формуле
(Hi - value) / (Hi - Lo)
т.е. у Вас:
Плохой= (20090803-20060301)/(20090803-18991230) = 0,0277398590180006 (IX_SEL: 2.7740e-002 TB_SEL: 2.7740e-002)
Хороший=(20060817-20060301)/(20090803-18991230) = 0,000469273072365364 (IX_SEL: 4.8243e-004 TB_SEL: 4.8243e-004, немножко не совпало, но не будем сейчас разбираться , порядок тот же)

Соответственно число строк ожидаемое после применения предиката
zam_date>20060301
Плохой:
10411456 * 0,0277398590180006 = 288812 , и индекс кажется не выгодным
Хороший:
8207527 * 0,000469273072365364= 3851, тут доступ по индексу становится выгодным с точки зрения оптимизатора.

Т.е. проблема в том, что в интервал между числами 20090803 - 20060301 влезает слишком много возможных значений, 30502 дней, больше 83 лет.
В то время когда между датами 03.08.2009 и 01.03.2006 всего 3 года.

Т.е. ваша основная проблема в неверном выборе типов полей для хранения, кроме того наличие в "плохом" случае данных в будущее ( hi =20090803 против hi=20060817).

Возможно в вашем случае может помочь гистограмма по столбцу ZAM_DATE, если нет то хинтование запроса или построение OUTLINE.



Andrei Kiselev
--
The views expressed are my own and not necessarily those of my hedgehog
23 авг 06, 12:53    [3042668] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
givanov
Member

Откуда:
Сообщений: 757
Значит так. Дело в данных.
select max(ZAM_DATE) from shax
На одном сервере 20090803, на другом 20060817.
Запрос:
select  * from shax where zam_date>20060301
с точки зрения Oracle будет обрабатывать разное количество строк:
(20090803-20060301)/(20090803-18991230)*10411456=288812 на "плохом сервере" и
(20060817-20060301)/(20090803-18991230)*8207527=3959 на "хорошем". Видимо, реальное распределение данных отличается от предполагаемого, откуда и проблема.
Как ее решать - не знаю. Возможно, поможет гистограмма по столбцу, возможно, можно ограничить в запросе дату сверху.
Считаю, что Oracle в данной ситуации ведет себя вполне правильно.
Сколько времени будет работать запрос
select /*+rule*/ *,count(*) over() from shax where zam_date>18991230
, который будет использовать индекс для доступа к большому количеству строк?
23 авг 06, 12:58    [3042692] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
givanov
Member

Откуда:
Сообщений: 757
Я и ёжик
Т.е. проблема в том, что в интервал между числами 20090803 - 20060301 влезает слишком много возможных значений, 30502 дней, больше 83 лет.
В то время когда между датами 03.08.2009 и 01.03.2006 всего 3 года.
До этого я не допер.
Супер!
23 авг 06, 13:01    [3042719] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
contr
Member

Откуда:
Сообщений: 1897
givanov
Я и ёжик
Т.е. проблема в том, что в интервал между числами 20090803 - 20060301 влезает слишком много возможных значений, 30502 дней, больше 83 лет.
В то время когда между датами 03.08.2009 и 01.03.2006 всего 3 года.
До этого я не допер.
Супер!

Анализ действительно великолепен.
Вот только этот конкретный вывод мне представляется сомнительным - пропорция однако:
SQL> alter session set nls_date_format='yyyymmdd';

Session altered

SQL> select (20090803-20060301)/(20090803-18991230)*10411456 Numbers
  2       , (to_date('20090803')-to_date('20060301'))/(to_date('20090803')-to_date('18991230'))*10411456 Dates
  3  from dual;

   NUMBERS      DATES
---------- ----------
288812.321 325390.513

SQL> 
23 авг 06, 13:09    [3042770] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
contr

Вот только этот конкретный вывод мне представляется сомнительным

Согласен, в этом запросе формат хранения не сыграл в ухудшающую сторону, тем не менее в общем на схеме думаю он играет существенную роль в проблемах оптимазатора на данном приложении.
23 авг 06, 13:56    [3043091] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 11564
Я и ёжик
(Hi - value) / (Hi - Lo)
т.е. у Вас:
Плохой= (20090803-20060301)/(20090803-18991230) = 0,0277398590180006 (IX_SEL: 2.7740e-002 TB_SEL: 2.7740e-002)
Хороший=(20060817-20060301)/(20090803-18991230) = 0,000469273072365364 (IX_SEL: 4.8243e-004 TB_SEL: 4.8243e-004, немножко не совпало, но не будем сейчас разбираться , порядок тот же)
Если подставить правильные значения, то совпадет
(20060817-20060301)/(20060817-18991230)=4.8242919930777019541187392890901e-4

Но вообще прикольный разбор -- я даже понимать кое-что начал
24 авг 06, 03:34    [3046324] Ответить | Цитировать    Сообщить модератору

 Re: Не работает оптимизатор   [new]
-=Marat=-
Member

Откуда:
Сообщений: 120
Да действительно классный разбор получился!

Долго вникал в то что тут написали..... :)

В общем ситуация на сегодня такая......
Удалил левые записи......после чего особо ничего не изменилось....
потом удалил всю статистику и пересобрал заново.... и все вылечилось!
теперь все так же летает как и на хорошем сервере.......

Всем огромное спасибо за помощь!!!!
24 авг 06, 06:27    [3046361] Ответить | Цитировать    Сообщить модератору

Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5]      все
Все форумы / Oracle Ответить
Generated time: 62ms.
Rambler's Top100 Powered by ActualForum 1.5.3 [s1] Copyright (c) Alex Sibilev 2000-2010