What is the value of duplicating stuff people can find in other sites into this list? Waleed -----Original Message----- From: Juan Cachito Reyes Pacheco [mailto:jreyes@xxxxxxxxxxxxxxxx] Sent: Friday, February 20, 2004 2:45 PM To: oracle-l@xxxxxxxxxxxxx Subject: optimizer If you forgot some point about optimizer here are some point you should remember about how to set in Oracle 9i, basically. 3.1 Optimizer The optimizer is who defines de optimum access path to get data. To get that real optimum access the database and the session must give enough information about what he is doing. There are parameter which instructs the optimizer how to interpret the data and what to do. 3.1.1 OPTIMIZER_INDEX_COST_ADJ (1-10000) MUST BE SET Default value 100, a value of 100 indicates that access a table from an index is the same that accessing all the table, THIS IS FALSE. Suggested values: 10-30 OLTP database, too much inserts, y 50 Data Warehousing, big queries few inserts I suggest to start with a value of 10 and then you can increase it. 3.1.2 OPTIMIZER_INDEX_CACHING (0-99) MUST BE SET This parameter sets the possibility to find blocks accessed through an index in memory. Default value is 0, 0 means that no one block accessed through index will be found in memory THIS IS FALSE. A value of 90% is advisable. 3.1.2.1 Example An example that shows how a value incorrect in both parameter can change your execution plan. SQL> select * from cuentas_me where cts_cuenta = '1'; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=2 Bytes=288) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'CUENTAS_ME' (Cost=2 Card=2 Bytes=288) 2 1 INDEX (SKIP SCAN) OF 'CST_CTS_CUENTA' (UNIQUE) (Cost=3 Card=1) ****USES INDEX Statistics ---------------------------------------------------------- 24 consistent gets ** this is 28*8K needed to be read SQL> ALTER SESSION SET OPTIMIZER_INDEX_COST_ADJ= 10000; SQL> ALTER SESSION SET OPTIMIZER_INDEX_CACHING=0; SQL> select * from cuentas_me where cts_cuenta = '1'; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=39 Card=2 Bytes=288) 1 0 TABLE ACCESS (FULL) OF 'CUENTAS_ME' (Cost=39 Card=2 Bytes= 288) **** DO A FULL SCAN Statistics ---------------------------------------------------------- 388 consistent gets ** this is 388*8K hended to be read, this is more than 1,600% 3.1.3 DB_FILE_MULTIBLOCK_READ_COUNT MUST BE SET This parameter indicates the number of block that are read by the operating system at once, the optimizer uses this value to evaluate the cost of a full scan against through an index. In Windows NT is 128, in consequence the value should be 128/(block size)8K=16 3.1.4 OPTIMIZER_FEATURES_ENABLE Every Oracle release , the optimizer change the way it interprets the information, and are introduce new features. But as all this change can cause that old execution plans "to fail" , Oracle offer a way to use a previous optimizer behavior Is not advisable to change this parameter. 3.1.5 OPTIMIZER_MAX_PERMUTATIONS (4-80000) This parameter indicates the maximum number of permutation the optimizer analyze before generate an execution plan, when there are table unions. A value of 80,000 indicates there is no limit This value is used to reduce the time to get an execution plan, and to get a better execution plan in tuning phase. This parameter works with _OPTIMIZER_SEARCH_LIMIT parameter, ( NOTE the underscore means this is a hidden parameter, only to be modified by experts). What some experts uses to do a high tune is to set the value in _OPTIMIZER_SEARCH_LIMIT equal to the number of tables in the query and increases the value of OPTIMIZER_MAX_PERMUTATIONS to 80,000. To get the best execution plan. Once they get it they end the optimization and uses hints to force the best execution plan. Is not advisable to change this parameter permanently. 3.1.6 OPTIMIZER_MODE The optimizer chooses between a cost-based approach and a rule-based approach, depending on whether statistics are available. CHOOSE This is the default value, it uses database statistics to get the best execution plan. =ALL_ROWS Cost-based approach to get the minimum resource use to complete the entire statement, for example to get reports. =FIRST_ROWS_n Cost-based approach, to get best response time to return the first n number of rows; n can equal 1, 10, 100, or 1000, Oracle suggest to use it, for example ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS(10); Select /* FIRST_ROWS(10) */ column from table =FIRST_ROWS only, not suggested Uses a mix of cost and heuristics to find a best plan for fast delivery of the first few rows. Note: Using heuristics sometimes leads the CBO to generate a plan with a cost that is significantly larger than the cost of a plan without applying the heuristic. =FIRST_ROWS is available for backward compatibility and plan stability. RULE This is discontinued from 10G, so doesn't deserve attention, it was a method that used fixed rules to get the execution path, as it didn't use statistics it was frequently inaccurate. More information in http://www.evdbt.com/SearchIntelligenceCBO.doc ---------------------------------------------------------------- Please see the official ORACLE-L FAQ: http://www.orafaq.com ---------------------------------------------------------------- To unsubscribe send email to: oracle-l-request@xxxxxxxxxxxxx put 'unsubscribe' in the subject line. -- Archives are at //www.freelists.org/archives/oracle-l/ FAQ is at //www.freelists.org/help/fom-serve/cache/1.html ----------------------------------------------------------------- ---------------------------------------------------------------- Please see the official ORACLE-L FAQ: http://www.orafaq.com ---------------------------------------------------------------- To unsubscribe send email to: oracle-l-request@xxxxxxxxxxxxx put 'unsubscribe' in the subject line. -- Archives are at //www.freelists.org/archives/oracle-l/ FAQ is at //www.freelists.org/help/fom-serve/cache/1.html -----------------------------------------------------------------