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

Откуда: Киев
Сообщений: 3742
дошли руки до Oracle9i Performance Tuning - Volume I
Хотя бы в 2х словах - что такое гистограммы и для чего они нужны,
чтобы я понимал о чём речь.

Спасибо.
5 окт 04, 11:06    [1008592]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
Elic
Member

Откуда:
Сообщений: 29991
А по-Google-ить? Например, использование гистограм.
5 окт 04, 11:36    [1008742]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1815
Небольшое замечание по ссылке 'использование гистограмм'

автор
Еще очень важное замечание: гистограмами Oracle пользуется только и только тогда, если в условии запроса столбец сравнивается с литералом, а не с бинд переменной.
Это очень важно понимать. Гистограмами Oracl пользуется на этапе построения плана выполнения SQL команды, но на этом этапе, значения
переменных не известны.

1) Это не так, гистограммы учитываются и при использовании bind переменных,
поскольку для столбцов с гистограммами density по столбцу вычесляется не так как для столбца без гистограмм ( не как 1/NDV, где NDV - Number of distinct values). А в свою очередь density используется при расчете filter factor (селективности предиката), т.е. гистограммы очень даже могут повлиять на путь выбираемый оптимизатором и при использовании bind-переменных.
2) Для >= 9i Oracle умеет подсматривать значение Bind переменной при разборе ( Peeking of User-Defined Bind Variables )
5 окт 04, 11:57    [1008849]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
Oleg Afanasiev
Member

Откуда: Киев
Сообщений: 3742
Elic
А по-Google-ить? Например, использование гистограм.


у меня нет инета на рабочем месте -
вот так бегаю, чтобы только на форуме спросить/ответить и всё
%)
5 окт 04, 12:26    [1008986]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: подскажите про гистограммы  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Я и ёжик
А в свою очередь density используется при расчете filter factor (селективности предиката), т.е. гистограммы очень даже могут повлиять на путь выбираемый оптимизатором и при использовании bind-переменных.

Ох... я тоже так считал... ..
bb@triton>create table test_density
  2  as
  3  select trunc(dbms_random.value(1,10)) as v1
  4  from all_objects where rownum<=10000
  5  /

Table created.

Elapsed: 00:00:00.07
bb@triton>-- собираем статистику без гисторамм
bb@triton>begin dbms_stats.gather_table_stats(ownname => 'BB',tabname => 'TEST_DENSITY'); end;
  2  .
bb@triton>/

PL/SQL procedure successfully completed.



bb@triton>select density, num_distinct from user_tab_columns where table_name = 'TEST_DENSITY' and column_name = 'V1';

   DENSITY NUM_DISTINCT
---------- ------------
.111111111            9


bb@triton>-- они совпадают распределение равномерное
bb@triton>-- меняем density на большее чем 1/NUM_DISTINCT
bb@triton>begin dbms_stats.set_column_stats(ownname => 'BB',tabname => 'TEST_DENSITY', colname => 'V1',density => 0.50); end;
  2  /

PL/SQL procedure successfully completed.


bb@triton>select density, num_distinct from user_tab_columns where table_name = 'TEST_DENSITY' and column_name = 'V1';

   DENSITY NUM_DISTINCT
---------- ------------
        .5            9

bb@triton>explain plan for select * from TEST_DENSITY where v1 = :b;

Explained.

bb@triton>@c:\utlxpls.sql

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------
| Id  | Operation            |  Name         | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |  5000 | 15000 |     3 |
|*  1 |  TABLE ACCESS FULL   | TEST_DENSITY  |  5000 | 15000 |     3 |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------
   1 - filter("TEST_DENSITY"."V1"=TO_NUMBER(:Z))

Note: cpu costing is off

14 rows selected.

bb@triton>-- меняем density на меньшее чем 1/NUM_DISTINCT
bb@triton>begin dbms_stats.set_column_stats(ownname => 'BB',tabname => 'TEST_DENSITY', colname => 'V1',density => 0.10); end;
  2  /

PL/SQL procedure successfully completed.


bb@triton>select density, num_distinct from user_tab_columns where table_name = 'TEST_DENSITY' and column_name = 'V1';

   DENSITY NUM_DISTINCT
---------- ------------
        .1            9


bb@triton>explain plan for select * from TEST_DENSITY where v1 = :b;

Explained.


bb@triton>@c:\utlxpls.sql

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------
| Id  | Operation            |  Name         | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |  1111 |  3333 |     3 |
|*  1 |  TABLE ACCESS FULL   | TEST_DENSITY  |  1111 |  3333 |     3 |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------
   1 - filter("TEST_DENSITY"."V1"=TO_NUMBER(:Z))

Note: cpu costing is off

14 rows selected.


bb@triton>-- меняем density на еще более меньшее чем 1/NUM_DISTINCT
bb@triton>begin dbms_stats.set_column_stats(ownname => 'BB',tabname => 'TEST_DENSITY', colname => 'V1',density => 0.00010); end;
  2  /

PL/SQL procedure successfully completed.


bb@triton>select density, num_distinct from user_tab_columns where table_name = 'TEST_DENSITY' and column_name = 'V1';

   DENSITY NUM_DISTINCT
---------- ------------
     .0001            9


bb@triton>explain plan for select * from TEST_DENSITY where v1 = :b;

Explained.


bb@triton>@c:\utlxpls.sql

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------
| Id  | Operation            |  Name         | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |  1111 |  3333 |     3 |
|*  1 |  TABLE ACCESS FULL   | TEST_DENSITY  |  1111 |  3333 |     3 |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------
   1 - filter("TEST_DENSITY"."V1"=TO_NUMBER(:Z))

Note: cpu costing is off

14 rows selected.


bb@triton>-- теперь собираем гистограммы
bb@triton>begin dbms_stats.gather_table_stats(ownname => 'BB',tabname => 'TEST_DENSITY',method_opt => 'for all columns'); end;
  2  .
bb@triton>/

PL/SQL procedure successfully completed.


bb@triton>select count(*) from user_tab_histograms where table_name = 'TEST_DENSITY' and column_name = 'V1';

  COUNT(*)
----------
         9



bb@triton>explain plan for select * from TEST_DENSITY where v1 = :b;

Explained.


bb@triton>@c:\utlxpls.sql

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------
| Id  | Operation            |  Name         | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |  1111 |  3333 |     3 |
|*  1 |  TABLE ACCESS FULL   | TEST_DENSITY  |  1111 |  3333 |     3 |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------
   1 - filter("TEST_DENSITY"."V1"=TO_NUMBER(:Z))

Note: cpu costing is off

14 rows selected.



bb@triton>select density, num_distinct from user_tab_columns where table_name = 'TEST_DENSITY' and column_name = 'V1';

   DENSITY NUM_DISTINCT
---------- ------------
    .00005            9

bb@triton>begin dbms_stats.gather_table_stats(ownname => 'BB',tabname => 'TEST_DENSITY',method_opt => 'for all columns'); end;
  2  /

PL/SQL procedure successfully completed.



/* заключительный тест:
    та же таблица, только */
bb@triton>insert into test_density
  2  select 1
  3  from all_objects where rownum<=10000
  4  /

10000 rows created.

bb@triton>select density, num_distinct from user_tab_columns where table_name = 'TEST_DENSITY' and column_name = 'V1';

   DENSITY NUM_DISTINCT
---------- ------------
   .000025            9


bb@triton>explain plan for select * from TEST_DENSITY where v1 = :b;

Explained.


bb@triton>@c:\utlxpls.sql

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------
| Id  | Operation            |  Name         | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |  2222 |  6666 |     4 |
|*  1 |  TABLE ACCESS FULL   | TEST_DENSITY  |  2222 |  6666 |     4 |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------
   1 - filter("TEST_DENSITY"."V1"=TO_NUMBER(:Z))

Note: cpu costing is off

14 rows selected.



bb@triton>select * from v$version;

BANNER
-----------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.5.0 - Produ
PL/SQL Release 9.2.0.5.0 - Production
CORE    9.2.0.6.0       Production
TNS for Linux: Version 9.2.0.5.0 - Production
NLSRTL Version 9.2.0.5.0 - Production

теперь итог, что получился у меня:
если density < 1/num_distinct, то при оценки кардинальности выражений column_name = :b используется 1/num_distinct,
иначе наоборот.
P.S. У кого есть возможность повторите этот тест на 9.2.0.6 - 7 ,
10.2 \ 10.1 , 8i
2 июн 06, 12:25    [2734037]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
?
Guest
Oleg Afanasiev
дошли руки до Oracle9i Performance Tuning - Volume I
Хотя бы в 2х словах - что такое гистограммы и для чего они нужны,
чтобы я понимал о чём речь.

Спасибо.


?

Информация: OCA DBA. 
BrainBench - Oracle PL/SQL - master.
BrainBench - Oracle 9i Administration. 
2 июн 06, 12:36    [2734104]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
?
Информация: OCA DBA.
BrainBench - Oracle PL/SQL - master.
BrainBench - Oracle 9i Administration. [/src]

С тех пор много воды утекло.
2 июн 06, 12:59    [2734254]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
АД
Guest
HX
P.S. У кого есть возможность повторите этот тест на 9.2.0.6 - 7 ,
10.2 \ 10.1 , 8i

8.1.7, 10.2 аналогично.
2 июн 06, 13:46    [2734627]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
АД
HX
P.S. У кого есть возможность повторите этот тест на 9.2.0.6 - 7 ,
10.2 \ 10.1 , 8i

8.1.7, 10.2 аналогично.

Значит Jonatan Lewis неправ про 10g? :

Cost-Based Oracle Fundamentals

The two numbers are related in our example, but this is not always true. When you create
a histogram on a column you will (usually) find that the density is no longer 1 / num_distinct
and, when histograms are in place, different versions of Oracle behave in slightly different
ways. Use a different version to run the example, and you find the optimizer in 10g uses the
num_distinct column to work out the result: cardinality = num_rows / num_distinct. If
there had been a histogram in place, the optimizer would have used the density column:
cardinality = num_rows * density.
2 июн 06, 15:12    [2735225]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
АД
Guest
SQL> SELECT banner
  2    FROM v$version
  3  /

BANNER                                                                                  
----------------------------------------------------------------                        
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod                        
PL/SQL Release 10.2.0.1.0 - Production                                                  
CORE	10.2.0.1.0	Production                                                              
TNS for Linux: Version 10.2.0.1.0 - Production                                          
NLSRTL Version 10.2.0.1.0 - Production                                                  

SQL> 
SQL> CREATE TABLE test_density AS
  2  SELECT TRUNC (DBMS_RANDOM.VALUE (1, 10)) AS v1
  3    FROM all_objects
  4   WHERE ROWNUM <= 10000
  5  /

Table created.

SQL> 
SQL> 
SQL> BEGIN
  2  	DBMS_STATS.gather_table_stats (ownname	    => NULL,
  3  				       tabname	    => 'TEST_DENSITY');
  4  END;
  5  /

PL/SQL procedure successfully completed.

SQL> 
SQL> SELECT density, num_distinct
  2    FROM user_tab_columns
  3   WHERE table_name = 'TEST_DENSITY' AND column_name = 'V1'
  4  /

   DENSITY NUM_DISTINCT                                                                 
---------- ------------                                                                 
,111111111            9                                                                 

SQL> 
SQL> EXPLAIN PLAN FOR
  2  SELECT * FROM test_density WHERE v1 = :b
  3  /

Explained.

SQL> 
SQL> SELECT * FROM TABLE (DBMS_XPLAN.display)
  2  /

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
Plan hash value: 3660606841                                                             
                                                                                        
----------------------------------------------------------------------------------      
| Id  | Operation         | Name         | Rows  | Bytes | Cost (%CPU)| Time     |      
----------------------------------------------------------------------------------      
|   0 | SELECT STATEMENT  |              |  1111 |  3333 |     7  (15)| 00:00:01 |      
|*  1 |  TABLE ACCESS FULL| TEST_DENSITY |  1111 |  3333 |     7  (15)| 00:00:01 |      
----------------------------------------------------------------------------------      
                                                                                        
Predicate Information (identified by operation id):                                     
---------------------------------------------------                                     

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
                                                                                        
   1 - filter("V1"=TO_NUMBER(:B))                                                       

13 rows selected.

SQL> 
SQL> BEGIN
  2  	DBMS_STATS.set_column_stats (ownname	  => NULL,
  3  				     tabname	  => 'TEST_DENSITY',
  4  				     colname	  => 'V1',
  5  				     density	  => 0.5
  6  				    );
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> 
SQL> SELECT density, num_distinct
  2    FROM user_tab_columns
  3   WHERE table_name = 'TEST_DENSITY' AND column_name = 'V1'
  4  /

   DENSITY NUM_DISTINCT                                                                 
---------- ------------                                                                 
        ,5            9                                                                 

SQL> 
SQL> EXPLAIN PLAN FOR
  2  SELECT * FROM test_density WHERE v1 = :b
  3  /

Explained.

SQL> 
SQL> SELECT * FROM TABLE (DBMS_XPLAN.display)
  2  /

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
Plan hash value: 3660606841                                                             
                                                                                        
----------------------------------------------------------------------------------      
| Id  | Operation         | Name         | Rows  | Bytes | Cost (%CPU)| Time     |      
----------------------------------------------------------------------------------      
|   0 | SELECT STATEMENT  |              |  5000 | 15000 |     7  (15)| 00:00:01 |      
|*  1 |  TABLE ACCESS FULL| TEST_DENSITY |  5000 | 15000 |     7  (15)| 00:00:01 |      
----------------------------------------------------------------------------------      
                                                                                        
Predicate Information (identified by operation id):                                     
---------------------------------------------------                                     

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
                                                                                        
   1 - filter("V1"=TO_NUMBER(:B))                                                       

13 rows selected.

SQL> 
SQL> BEGIN
  2  	DBMS_STATS.set_column_stats (ownname	  => NULL,
  3  				     tabname	  => 'TEST_DENSITY',
  4  				     colname	  => 'V1',
  5  				     density	  => 0.0001
  6  				    );
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> 
SQL> SELECT density, num_distinct
  2    FROM user_tab_columns
  3   WHERE table_name = 'TEST_DENSITY' AND column_name = 'V1'
  4  /

   DENSITY NUM_DISTINCT                                                                 
---------- ------------                                                                 
     ,0001            9                                                                 

SQL> 
SQL> EXPLAIN PLAN FOR
  2  SELECT * FROM test_density WHERE v1 = :b
  3  /

Explained.

SQL> 
SQL> SELECT * FROM TABLE (DBMS_XPLAN.display)
  2  /

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
Plan hash value: 3660606841                                                             
                                                                                        
----------------------------------------------------------------------------------      
| Id  | Operation         | Name         | Rows  | Bytes | Cost (%CPU)| Time     |      
----------------------------------------------------------------------------------      
|   0 | SELECT STATEMENT  |              |  1111 |  3333 |     7  (15)| 00:00:01 |      
|*  1 |  TABLE ACCESS FULL| TEST_DENSITY |  1111 |  3333 |     7  (15)| 00:00:01 |      
----------------------------------------------------------------------------------      
                                                                                        
Predicate Information (identified by operation id):                                     
---------------------------------------------------                                     

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
                                                                                        
   1 - filter("V1"=TO_NUMBER(:B))                                                       

13 rows selected.

SQL> 
SQL> BEGIN
  2  	DBMS_STATS.gather_table_stats (ownname	       => NULL,
  3  				       tabname	       => 'TEST_DENSITY',
  4  				       method_opt      => 'for all columns size 10'
  5  				      );
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> 
SQL> SELECT COUNT (*)
  2    FROM user_tab_histograms
  3   WHERE table_name = 'TEST_DENSITY' AND column_name = 'V1'
  4  /

  COUNT(*)                                                                              
----------                                                                              
         9                                                                              

SQL> 
SQL> SELECT density, num_distinct
  2    FROM user_tab_columns
  3   WHERE table_name = 'TEST_DENSITY' AND column_name = 'V1'
  4  /

   DENSITY NUM_DISTINCT                                                                 
---------- ------------                                                                 
    ,00005            9                                                                 

SQL> 
SQL> EXPLAIN PLAN FOR
  2  SELECT * FROM test_density WHERE v1 = :b
  3  /

Explained.

SQL> 
SQL> SELECT * FROM TABLE (DBMS_XPLAN.display)
  2  /

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
Plan hash value: 3660606841                                                             
                                                                                        
----------------------------------------------------------------------------------      
| Id  | Operation         | Name         | Rows  | Bytes | Cost (%CPU)| Time     |      
----------------------------------------------------------------------------------      
|   0 | SELECT STATEMENT  |              |  1111 |  3333 |     7  (15)| 00:00:01 |      
|*  1 |  TABLE ACCESS FULL| TEST_DENSITY |  1111 |  3333 |     7  (15)| 00:00:01 |      
----------------------------------------------------------------------------------      
                                                                                        
Predicate Information (identified by operation id):                                     
---------------------------------------------------                                     

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
                                                                                        
   1 - filter("V1"=TO_NUMBER(:B))                                                       

13 rows selected.

SQL> 
SQL> BEGIN
  2  	DBMS_STATS.set_column_stats (ownname	  => NULL,
  3  				     tabname	  => 'TEST_DENSITY',
  4  				     colname	  => 'V1',
  5  				     density	  => 0.5
  6  				    );
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> 
SQL> SELECT density, num_distinct
  2    FROM user_tab_columns
  3   WHERE table_name = 'TEST_DENSITY' AND column_name = 'V1'
  4  /

   DENSITY NUM_DISTINCT                                                                 
---------- ------------                                                                 
        ,5            9                                                                 

SQL> 
SQL> EXPLAIN PLAN FOR
  2  SELECT * FROM test_density WHERE v1 = :b
  3  /

Explained.

SQL> 
SQL> SELECT * FROM TABLE (DBMS_XPLAN.display)
  2  /

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
Plan hash value: 3660606841                                                             
                                                                                        
----------------------------------------------------------------------------------      
| Id  | Operation         | Name         | Rows  | Bytes | Cost (%CPU)| Time     |      
----------------------------------------------------------------------------------      
|   0 | SELECT STATEMENT  |              |  5000 | 15000 |     7  (15)| 00:00:01 |      
|*  1 |  TABLE ACCESS FULL| TEST_DENSITY |  5000 | 15000 |     7  (15)| 00:00:01 |      
----------------------------------------------------------------------------------      
                                                                                        
Predicate Information (identified by operation id):                                     
---------------------------------------------------                                     

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
                                                                                        
   1 - filter("V1"=TO_NUMBER(:B))                                                       

13 rows selected.

SQL> 
SQL> BEGIN
  2  	DBMS_STATS.set_column_stats (ownname	  => NULL,
  3  				     tabname	  => 'TEST_DENSITY',
  4  				     colname	  => 'V1',
  5  				     density	  => 0.0001
  6  				    );
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> 
SQL> SELECT density, num_distinct
  2    FROM user_tab_columns
  3   WHERE table_name = 'TEST_DENSITY' AND column_name = 'V1'
  4  /

   DENSITY NUM_DISTINCT                                                                 
---------- ------------                                                                 
     ,0001            9                                                                 

SQL> 
SQL> EXPLAIN PLAN FOR
  2  SELECT * FROM test_density WHERE v1 = :b
  3  /

Explained.

SQL> 
SQL> SELECT * FROM TABLE (DBMS_XPLAN.display)
  2  /

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
Plan hash value: 3660606841                                                             
                                                                                        
----------------------------------------------------------------------------------      
| Id  | Operation         | Name         | Rows  | Bytes | Cost (%CPU)| Time     |      
----------------------------------------------------------------------------------      
|   0 | SELECT STATEMENT  |              |  1111 |  3333 |     7  (15)| 00:00:01 |      
|*  1 |  TABLE ACCESS FULL| TEST_DENSITY |  1111 |  3333 |     7  (15)| 00:00:01 |      
----------------------------------------------------------------------------------      
                                                                                        
Predicate Information (identified by operation id):                                     
---------------------------------------------------                                     

PLAN_TABLE_OUTPUT                                                                       
----------------------------------------------------------------------------------------
                                                                                        
   1 - filter("V1"=TO_NUMBER(:B))                                                       

13 rows selected.

SQL> 
2 июн 06, 17:40    [2736530]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Ясно. получается точно такое же поведение...
2 июн 06, 17:52    [2736628]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Забыл сказать: СПАСИБО! :-)
2 июн 06, 17:52    [2736631]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
Ааз
Member

Откуда: Москва/Протвино
Сообщений: 4274
Мужики, а flush shared_pool, или instance бортануть после пересбора статистики? Так, на всякий пожарный...

Всего
2 июн 06, 22:04    [2737330]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18399
Ааз
Мужики, а flush shared_pool, или instance бортануть после пересбора статистики? Так, на всякий пожарный...

Вот и меня сомнения мучают...
Пересбор статистики вроде как зависимые курсоры инвалидирует, а вот на счет DBMS_STATS.set* - есть некоторые сомнения... Впрочем, быть может, и безосновательные...
3 июн 06, 00:07    [2737622]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
АД
Guest
Ааз
Мужики, а flush shared_pool, или instance бортануть после пересбора статистики?

Для чистоты что ли? :)

andrey_anonymous
Пересбор статистики вроде как зависимые курсоры инвалидирует, а вот на счет DBMS_STATS.set* - есть некоторые сомнения...

А можно уточнить?
3 июн 06, 00:27    [2737667]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
--
Guest
параметр
no_invalidate    BOOLEAN  DEFAULT FALSE
3 июн 06, 09:59    [2737866]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
АД
....

HX
....


Дело ясное, что дело темное, в данном случае - EXPLAIN PLAN - достаточно бесполезен. Фактическая проверка на использование гистограмм в случае связываемых переменных (и хранения этих значений), если не ошибаюсь, требует трассировки.

Также, возмножно, стоит обратить внимание на BIND_DATA в V$SQLAREA...

Кроме того, если не отказывает память, "заглядываение" в переменные привязки появилось в Oracle от проблем с использованием CURSOR_SHARING=FORCE|SIMILAIR, а также от необоснованного подавления черезчур "усердными" разработчиками константных значений в переменных привязки...

И все это, безусловно, лишь добавило новых горизонтов остроты впечатлений ;))
3 июн 06, 18:12    [2738285]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
АД
Guest
grexhide
Дело ясное, что дело темное, в данном случае - EXPLAIN PLAN - достаточно бесполезен. Фактическая проверка на использование гистограмм в случае связываемых переменных (и хранения этих значений), если не ошибаюсь, требует трассировки.


Действительно. Повторил с трассировкой.

Current SQL statement for this session:
SELECT /* S1 */ * FROM test_density WHERE v1 = :b1

============
Plan Table
============
-----------------------------------------+-----------------------------------+
| Id  | Operation          | Name        | Rows  | Bytes | Cost  | Time      |
-----------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT   |             |       |       |     6 |           |
| 1   |  TABLE ACCESS FULL | TEST_DENSITY|  1111 |  3333 |     6 |  00:00:01 |
-----------------------------------------+-----------------------------------+
Predicate Information:
----------------------
1 - filter("V1"=:B1)


Current SQL statement for this session:
SELECT /* S2 */ * FROM test_density WHERE v1 = :b1

============
Plan Table
============
-----------------------------------------+-----------------------------------+
| Id  | Operation          | Name        | Rows  | Bytes | Cost  | Time      |
-----------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT   |             |       |       |     6 |           |
| 1   |  TABLE ACCESS FULL | TEST_DENSITY|  5000 |   15K |     6 |  00:00:01 |
-----------------------------------------+-----------------------------------+
Predicate Information:
----------------------
1 - filter("V1"=:B1)


Current SQL statement for this session:
SELECT /* S3 */ * FROM test_density WHERE v1 = :b1

============
Plan Table
============
-----------------------------------------+-----------------------------------+
| Id  | Operation          | Name        | Rows  | Bytes | Cost  | Time      |
-----------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT   |             |       |       |     6 |           |
| 1   |  TABLE ACCESS FULL | TEST_DENSITY|     1 |     3 |     6 |  00:00:01 |
-----------------------------------------+-----------------------------------+
Predicate Information:
----------------------
1 - filter("V1"=:B1)


Current SQL statement for this session:
SELECT /* S4 */ * FROM test_density WHERE v1 = :b1

============
Plan Table
============
-----------------------------------------+-----------------------------------+
| Id  | Operation          | Name        | Rows  | Bytes | Cost  | Time      |
-----------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT   |             |       |       |     6 |           |
| 1   |  TABLE ACCESS FULL | TEST_DENSITY|  1110 |  3330 |     6 |  00:00:01 |
-----------------------------------------+-----------------------------------+
Predicate Information:
----------------------
1 - filter("V1"=:B1)


Current SQL statement for this session:
SELECT /* S5 */ * FROM test_density WHERE v1 = :b1

============
Plan Table
============
-----------------------------------------+-----------------------------------+
| Id  | Operation          | Name        | Rows  | Bytes | Cost  | Time      |
-----------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT   |             |       |       |     6 |           |
| 1   |  TABLE ACCESS FULL | TEST_DENSITY|  5000 |   15K |     6 |  00:00:01 |
-----------------------------------------+-----------------------------------+
Predicate Information:
----------------------
1 - filter("V1"=:B1)


Current SQL statement for this session:
SELECT /* S6 */ * FROM test_density WHERE v1 = :b1

============
Plan Table
============
-----------------------------------------+-----------------------------------+
| Id  | Operation          | Name        | Rows  | Bytes | Cost  | Time      |
-----------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT   |             |       |       |     6 |           |
| 1   |  TABLE ACCESS FULL | TEST_DENSITY|     1 |     3 |     6 |  00:00:01 |
-----------------------------------------+-----------------------------------+
Predicate Information:
----------------------
1 - filter("V1"=:B1)
3 июн 06, 23:24    [2738608]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
АД


Не совсем понятно то, что вы тестируете, господа.

Привожу пример проще:

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jun 4 02:43:36 2006


SQL> set wrap off;
SQL> set autotrace on;
SQL> variable v1 number;
SQL> begin :v1 := 20; end;
  2  /

PL/SQL procedure successfully completed.

SQL> select /*+ ALL_ROWS */ count(name1) from test where v1 = :v1;

COUNT(NAME1)
------------
           0


Execution Plan
----------------------------------------------------------
Plan hash value: 605053723

--------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     1 |     3 |    21   (0)| 00
|   1 |  SORT AGGREGATE              |         |     1 |     3 |            |
|   2 |   TABLE ACCESS BY INDEX ROWID| TEST    |  2000 |  6000 |    21   (0)| 00
|*  3 |    INDEX RANGE SCAN          | TEST_V1 |  2000 |       |     5   (0)| 00
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("V1"=TO_NUMBER(:V1))

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         46  consistent gets
          0  physical reads
          0  redo size
        414  bytes sent via SQL*Net to client
        381  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

при этом tkprof на этот же запрос дает такой результат:

select /*+ ALL_ROWS */ count(name1) from test where v1 = :v1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.01       0.00          0         92          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.01       0.00          0         92          0           1

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 80  

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=92 pr=0 pw=0 time=7910 us)
  10000   TABLE ACCESS FULL TEST (cr=92 pr=0 pw=0 time=20440 us)
4 июн 06, 02:50    [2738696]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
В аспектах гистограмм и связываемых переменных - explaing plan и autotrace в sql*plus - говорят совсем не то, что реально происходит при выполнении запросов.

О чем достаточно наглядно свидетельствует трассировка по событию 10046.

---

P.S. В наше время нельзя верить никому. Но трассировщику - наверное можно.
4 июн 06, 03:07    [2738698]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
АД
Guest
grexhide
Не совсем понятно то, что вы тестируете, господа.

Что тут непонятного? В первом посте повторил тест HX. Во втором - использовал свой же пример, но вместо EXPLAIN PLAN включил диагностическое событие 10053 и из полученного при этом трейссировочного файла привел планы.
4 июн 06, 10:37    [2738782]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
grexhide
АД
....

HX
....


Дело ясное, что дело темное, в данном случае - EXPLAIN PLAN - достаточно бесполезен. Фактическая проверка на использование гистограмм в случае связываемых переменных (и хранения этих значений), если не ошибаюсь, требует трассировки.

Также, возмножно, стоит обратить внимание на BIND_DATA в V$SQLAREA...

Кроме того, если не отказывает память, "заглядываение" в переменные привязки появилось в Oracle от проблем с использованием CURSOR_SHARING=FORCE|SIMILAIR, а также от необоснованного подавления черезчур "усердными" разработчиками константных значений в переменных привязки...

И все это, безусловно, лишь добавило новых горизонтов остроты впечатлений ;))

К cursor_sharing, _optim_peek_user_binds - это немного другие проболемы. Наши тесты предназначались только для уточнения маханизма оценки селективности при использовании bind переменных, при наличии гистограмм и без. А имеено, роль density и num_distincts в этих механизмах, даже больше без гистограмм...

to АД, для своего второго теста не моглы бы написать про s1, s2, s3, s4, s5, s6 какой случай с использованием чего?..
5 июн 06, 11:03    [2740261]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
МиФ
Guest
Я тоже когда-то так заблуждался по поводу explain plan и SQL*Plaus autotrace. При использовании explain plan не используется bind variable peeking. Это написано в документации. При вып-ии запроса SQLPLUS (c включенным autotrace) показывает просто результат селекта и результат выполнения команды explain plan. Реальный план выполнения запроса с bind переменной может отличаться его можно посмотреть через v$sql_plan, адрес плана вып-я берем из v$sql или v$sql_area
5 июн 06, 11:33    [2740381]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
АД
Guest
HX
to АД, для своего второго теста не моглы бы написать про s1, s2, s3, s4, s5, s6 какой случай с использованием чего?..

Нумерация совпадает с порядком выполнения.
5 июн 06, 12:18    [2740553]     Ответить | Цитировать Сообщить модератору
 Re: подскажите про гистограммы  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Нет никакого заблуждения относительно explain plan, autotrace и реальных планов и peeking. Мне интересно поведение как раз без peeking\с peeking с\без гистограммами. :-)
5 июн 06, 12:40    [2740647]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить