r expansion is the use of OR's to process something instead of another method. for example (P and Q are predicates):
select * from t
where P or Q
can be "or expanded" to something like
select * from t where P
union all
select * from t where Q and NOT(P)
that is or expansion.
The NO_EXPAND hint prevents the cost-based optimizer from considering OR-expansion for queries having OR conditions or IN-lists in the WHERE clause. Usually, the optimizer considers using OR expansion and uses this method if it decides the cost is lower than not using it. NO_EXPAND is the opposite of USE_CONCAT.
Use the no-expand when it goes faster. The optimizer might have many more permutations to consider with a OR-expansion then without -- leading to a longer parse time and perhaps a less optimal plan (if it gives up soon enough).
The designing and tuning for performance guide has info on this.
select * from t
where P or Q
can be "or expanded" to something like
select * from t where P
union all
select * from t where Q and NOT(P)
that is or expansion.
The NO_EXPAND hint prevents the cost-based optimizer from considering OR-expansion for queries having OR conditions or IN-lists in the WHERE clause. Usually, the optimizer considers using OR expansion and uses this method if it decides the cost is lower than not using it. NO_EXPAND is the opposite of USE_CONCAT.
Use the no-expand when it goes faster. The optimizer might have many more permutations to consider with a OR-expansion then without -- leading to a longer parse time and perhaps a less optimal plan (if it gives up soon enough).
The designing and tuning for performance guide has info on this.