Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 711
  • Last Modified:

Full table scan of a partitioned table.

I have a table partitioned by date.

I have a select statement on which the oracle optimizer decides to do  a full table scan  across all partitions why?
0
gram77
Asked:
gram77
3 Solutions
 
gram77Author Commented:
select *
from mytable
where to_date(date, 'dd-mm-yyyy') = to_date(v_date, 'dd-mm-yyyy');

However, the optimiser decides to do a partition scan on the following statement:

select *
from mytable
where date = to_date(v_date, 'dd-mm-yyyy');

why?
0
 
Wasim Akram ShaikCommented:
its simple because the partition is on date column not on to_date(date, 'dd-mm-yyyy')
0
 
Mark GeerlingsDatabase AdministratorCommented:
The optimizer will do a full-table scan instead of a more-efficient partition- based scan if the SQL statement (or query) does not provide a value that matches the partition key column, of if the SQL statement or query applies an operator (like: to_date, to_char, upper, trunc, etc.) on the partition key column.

It is not clear from your second comment what the word "date" refers to in your two examples.  Does your table actually have a column named "date"?  That would be unusual (and not recommended).  What is the actual name of the partition key column in your table?

Also, it is not clear from your examples what "v_date" is.  I'm guessing that represents a variable.

If your table has a column named "date_created" for example, and this is defined as a "date" (and not "varchar2" or "number", etc.) and if the table is partitioned by range on this column, then a query like this should use only one of the table's partitions:

select *
from my_table
where date_created = to_date('&v_date','dd-mm-yyyy')


But a query like this will use a full-table scan (of all partitions):
select *
from my_table
where trunc(date_created) = to_date('&v_date','dd-mm-yyyy')
0
 
Geert GruwezOracle dbaCommented:
don't do a calculation on a column with an index (or partitioned index)
if you want to the optimizer to use the index
0
 
Naveen KumarProduction Manager / Application Support ManagerCommented:
If at all you need some calculation or function on a column ( for a genuine reason ) and at the same time you want your optimizer to use indexes then you will have to create functional indexes.

http://www.akadia.com/services/ora_function_based_index_2.html
http://psoug.org/snippet/INDEXES-Function-Based-Index_804.htm
www.oracle-base.com/articles/8i/function-based-indexes.php
0

Featured Post

Fill in the form and get your FREE NFR key NOW!

Veeam is happy to provide a FREE NFR server license to certified engineers, trainers, and bloggers.  It allows for the non‑production use of Veeam Agent for Microsoft Windows. This license is valid for five workstations and two servers.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now