For every predicate in an SQL statement, the optimizer checks to see if there are indexes that include the columns referenced in the predicate.
Once the optimizer knows which indexes exist on the relevant tables, it generates a list of all the possible index predicates that could be used. For each predicate for which there is an index, the optimizer checks whether:
The predicate's relational operator (=, <, <=, etc.) can be performed by the index
The index has multiple components, and if so, that the key components with predicates form a sequence of leading components of the index