Cardinality is so far off from reality
The first thing I'd do is check the stats for the columns individually with these queries:


select count(*) from table1 where col1 = 123;
select count(*) from table1 where col2 = '1';


If the estimated cardinalities here agree much better with the actual row counts, it means there is some correlation between the columns that the CBO cannot guess based on the histograms generated by a vanilla gather_table_stats. Dynamic sampling should improve things at the cost of increased parse time, but is not a silver bullet. 

Alternatively, with 11g, "Oracle Database can also gather statistics on a group of columns within a table"


create a column group
gather stats on a column group