SlideShare a Scribd company logo
1 of 45
Download to read offline
1
Understanding the OptimizerUnderstanding the Optimizer
2
Global topicsGlobal topics
Introduction
At which point does the optimizer his work
Optimizer steps
Index
Questions?
3
IntroductionIntroduction
Arno Brinkman
BISIT engineering b.v.
ABVisie
firebird@abvisie.nl
Firebird conference 2007
4
Task of the OptimizerTask of the Optimizer
The optimizer should optimize the
execution path in a way that it becomes
the most efficient (fastest) way for the
engine to execute it.
In fact the name Optimizer already say what it should do
5
Optimizer strategiesOptimizer strategies
• Heuristic (rule based)
• Cost-based
• User determined.
These are the three optimizer strategies we have.
Heuristic optimizer is based on rules.
Cost-based is depending on estimated cost.
User determined optimizer in which the user controls how the execution path
should look like. Such as given hints or in case of firebird a explicit PLAN which
forces the execution path.
Firebird 1.5 uses cost based approach together with heuristic.
Firebird 2.0 is even some more towards the cost-based strategy.
A rule example is always preferring an PK index when there’s an equality
operator on all the PK fields.
6
When is the optimizer called?When is the optimizer called?
• SQL statement
• DSQL parser
• BLR (Binary Language Representation) generator
• Compile the BLR
• Optimizer (RSE RSB)
• Statement is prepared
First we have our SQL statement. This SQL statement is being parsed in the
Dynamic SQL parser.
After the DSQL the BLR (Binary language representation) is generated (the op-
code for the engine).
As next step the BLR is compiled into an Record Selection Expression tree were
also the Optimizer is called.
The Optimizer will finally turn the RSE into a RSB tree and then the statement is
prepared.
As you see many things happen before a statement is prepared.
So when you use the same statements a lot, keep them prepared in your
application. Note that there is no strong binding with a transaction.
7
RSERSE RSBRSB
The optimizer turns an RSE (Record
Selection Expression) into a RSB (Record
Source Blocks) tree.
The optimizer turns a RSE (record selection expression) into a RSB (record
source block) tree.
That are both tree’s with internally structures by the engine which are used to
walk down a path to execute it.
8
RSB types used by engine IRSB types used by engine I
- FIRST, SKIP: retrieve first x and skip y records
- CROSS: inner join
- LEFT_CROSS: left/right/full outer join
- MERGE: inner join using merge
- UNION: union
- AGGREGATE: perform aggregation
- SORT: use memory sorting
FIRST and SKIP: They retrieve the first X and/or skip Y records from a stream.
CROSS: That’s a nothing more then the INNER JOIN.
LEFT_CROSS: This can be a left/right or full outer join.
MERGE: Merge two sorted streams together (always together with SORT).
UNION: Union two or more stream.
AGGREGATE: Base stream for grouping and performing aggregate calculations
(sum, total, average, …) from a stream
SORT: Sort stream. Use memory when available else swap to disk.
9
RSB types used by engine IIRSB types used by engine II
- SEQUENTIAL: retrieve records in the way they are stored
- NAVIGATE: navigational index retrieval
- BOOLEAN: logical condition
- INDEXED: retrieve records through index
- DBKEY: retrieve specific record by recordnumber
- PROCEDURE: stored procedure
- EXT_SEQUENTIAL: external sequential access
SEQUENTIAL: Retrieving the records in the way they are stored on disk.
NAVIGATE: Walking trough an index and fetching the records that belong to
the index-entry.
BOOLEAN: Logical condition.
INDEXED: Filter, Retrieve records through index.
DBKEY: Retrieve explicit record by record number.
PROCEDURE: Executes stored procedure.
EXT_SEQUENTIAL: External sequential access.
There are still some other types in the engine, but they aren’t in use anymore.
10
RSERSE RSB exampleRSB example
SELECT
rf.RDB$RELATION_NAME,
rf.RDB$FIELD_NAME
FROM
RDB$RELATIONS r
JOIN RDB$RELATION_FIELDS rf ON
(rf.RDB$RELATION_NAME = r.RDB$RELATION_NAME)
Example SQL statement i’ll use for a RSE to RSB conversion.
Assume we’re using this simple statement against the system tables.
11
RSERSE RSB exampleRSB example
blr_rse, 1,
blr_rs_stream, 2,
blr_relation2, 13, 'R','D','B','$','R','E','L','A','T','I','O','N','S', 1, 'R', 1,
blr_relation2, 19, 'R','D','B','$','R','E','L','A','T','I','O','N','_','F','I','E','L','D','S', 2, 'R','F', 2,
blr_boolean,
blr_eql,
blr_field, 2, 17, 'R','D','B','$','R','E','L','A','T','I','O','N','_','N','A','M','E',
blr_field, 1, 17, 'R','D','B','$','R','E','L','A','T','I','O','N','_','N','A','M','E',
blr_end,
blr_end,
rsb_cross
rsb_sequential
RDB$RELATIONS
rsb_boolean
rsb_indexed
RDB$RELATION_FIELDS
RDB$INDEX_4
Then the RSE part (BLR-code) of the previous statement will look as the above
part in the screen. (When you create a VIEW with this statement you can see this
BLR in the blob-field RDB$VIEW_BLR of RDB$RELATIONS)
The RSE goes into the optimizer and will turn it into a RSB tree as you see
below.
First you see RSB_CROSS which meant JOIN (here two) streams.
The first stream has RSB_SEQUENTIAL and thus reads all records from the
table RDB$RELATIONS in storage order. For every record from the first stream
the RSB_BOOLEAN is executed which calls RSB_INDEXED and retrieves all
records evaluated by the RDB$INDEX_4 scan on RDB$RELATION_FIELDS.
For every record returned by RDB$RELATION_FIELDS the boolean condition
is evaluated.
12
DSQL optimization / transformationDSQL optimization / transformation
• NOT simplification (FB 2.0)
NOT A > 0 A <= 0
NOT NOT A = 0 A = 0
• Expr1 IN (sub-query) => Exists
EXISTS(SELECT … WHERE Expr1 = …)
• Expr1 IN (const 1, const 2, …, const n) to OR conditions
(Expr1 = const 1) OR
(Expr1 = const 2) OR
…
(Expr1 = const n)
There are a few optimizations/transformations that are done in the DSQL layer.
The NOT condition is simplified when possible, so that it can eventually use
indexes (FB 2.0).
An sub-query used in the IN predicate is transformed to an EXISTS.
IN predicate with list of values is converted to a list of OR conditions
13
Optimizer layoutOptimizer layout
Distribute conjunctions
Aggregate Union Procedure
River
Check sorts
Distribute / Explode conjunctions
Sub-streams Tables
Sort / Merge riversOuter join
Inner join (return rivers)
First / Skip
Sort / Merge rivers
Sort
Simple overview of how the flow of the optimizer is internally.
14
Check sortsCheck sorts
• Check if a GROUP BY exists using the same fields as
the projection (DISTINCT) and/or sort (ORDER BY).
If so, the projection/sort can be removed
• Check if the first n fields from the sort matches the projection.
If so, the sort can be removed.
• If all fields in the sort are from 1 stream, deliver
it to the outer stream when possible. (FB 2.0)
15
Conjunctions (conditions)Conjunctions (conditions)
• Decomposition
- Convert a “between” conjunction into a “greater than or equal”
and a “less than or equal” conjunction.
(x BETWEEN a AND b) (x >= a) and (x <= b)
- If a LIKE starts with anything else than a pattern-matching
character add a STARTING WITH conjunction, because
STARTING WITH can use a index.
• Try to make more conjunctions based on equality conjunctions
available.
- If (a = b) and (a # c) (b # c) for any operation '#'.
Decomposition:
The optimizer tries to convert/expand the conjunctions so it can do more with it.
For example:
- Convert a between conjunction into a “greater than or equal” and “less than
or equal” conjunction.
- We have the like: If the like starts with anything else than a pattern-matching
character then a STARTING WITH conjunction is added, because only the
STARTING WITH can be used with the index. The LIKE itself cannot use an
index. When a LIKE is used together with a parameter (.. WHERE FieldA LIKE
:parameter) never an index can be used, because at prepare time it’s unknown
what value will go into the parameter.
It also tries to make more conjunctions based on equality conjunctions available.
This to helps binding/choosing the best index available. For example you’ve (a =
b) and (a >= c) this will result in a new conjunction (b >= c).
16
Process orderProcess order
Items at same level processed first :
- UNION
- AGGREGATE
- PROCEDURE
- Nested-RSE’s
Finally processed :
- INNER JOIN
- OUTER JOIN
17
Distribute conjunctionsDistribute conjunctions
Distribute HAVING conjunctions to the WHERE clause (FB 2.0)
Distribute UNION filter conjunctions to the filter clauses of
the inside streams (FB 2.0)
Distribute HAVING conjunctions to the WHERE clause (FB 2.0)
Conjunctions in the HAVING clause which contain fields that are also in the
GROUP BY clause can be distributed to the WHERE clause, so that it eventually
can use an index.
Distribute UNION filter conjunctions to the filter clauses of the inside streams
(FB 2.0)
When an UNION is part of a VIEW and you perform a filter on the VIEW the
filter is distributed to every query from the UNION.
18
Optimizer decisionsOptimizer decisions
• Stream order
Only for inner streams
• Stream fetch method
In/Out storage order
• Filter methods
Index and/or boolean evaluation
• Join method
MERGE, INNER/OUTER JOIN
The Optimizer makes decisions about:
-The stream order for inner joins.
It decides in which order the streams should be executed after each other.
-Stream fetch method.
In or Out storage order. Which meant read it in the way it’s stored on disk (In
storage order) or use an index navigation.
-Filter methods.
Index and/or Boolean evaluation.
-JOIN method.
MERGE, INNER/OUTER JOIN
19
Optimizer layout inner join ODS 10Optimizer layout inner join ODS 10
Find best join order
Form rivers
Get Indexed Relationships
Unique indexed relationships
Indexed relationships
Calculate cost
Indirect relationships
Inner Join
Generate retrieval
Find best
Form river
Simplified overview of the inner join part in the optimizer for ODS 10.
First the indexed relationships between the streams are determined.
Next search for the best join order.
Finally match the conjunctions to the indexes and form rivers.
20
Relationships
Mark used streams
Calculate cost
Optimizer layout inner join ODS 11Optimizer layout inner join ODS 11
Find best join order
Form rivers
Calculate stream info
OR nodes
Make inversion
AND nodes
Mark used conjunctions
Inner Join Retrieval
Find best
Indexed relationships
Sort on cost
Base cost
Calculate stream info
Simplified overview of the inner join part in the optimizer for ODS 11.
First the base cost / indexed relationships between the streams are calculated.
Next do a walk for every stream and recursively for the next cheapest indexed
relationship stream.
Finally match the conjunctions to the indexes and form rivers.
21
Stream order ODS 10Stream order ODS 10
Given a set of streams, select the "best order" to join them.
The "best order" is defined as longest, cheapest join order.
(length, of course, takes precedence over cost).
- Determine relationships for every stream.
- Try every relationship combination.
- Calculate estimated cost and cardinality per stream.
Based on estimated total records, index-selectivity, unique-indexes
and number of indexes
- Loop through index relationships with unique relationships first
First determine relationships for every stream with other streams inside the same
INNER JOIN “block”.
Next try every relationship combination.
Calculate estimated cost and cardinality per stream.
This is based on estimated total records, index-selectivity, unique-indexes and
number of indexes
Loop through direct index relationships with direct unique relationships first.
This is done because the unique relationships are the most interesting/cheapest
relationships.
Finally check for indirect indexed relationships.
22
Stream order ODS 11Stream order ODS 11
Given a set of streams, select the "best order" to join them.
The "best order" is defined as longest, cheapest join order.
(length, of course, takes precedence over cost).
- First determine base cost and indexed relationships for every stream.
- Next try every stream.
- Calculate estimated cost and cardinality per stream.
Based on estimated total records, index-selectivity, indexes-cost.
- Try the next cheapest indexed relationship until all relationships
are calculated.
First determine base cost and indexed relationships for every stream.
Next try every stream.
Calculate estimated cost and cardinality per stream at each position.
This is based on estimated total records, index-selectivity, index-cost.
Try the next cheapest indexed relationship until all relationships are calculated.
23
Stream access methodsStream access methods
• NAVIGATION: Use index (ascending / descending)
Can only use 1 index for navigation.
Called “Out of storage order”.
Loop through index entries and fetch records (many pages needs
to be read).
• SEQUENTIAL: No index
Called “In storage order”.
Fetch the records from the pages in the way they are stored
(unpredictable order)
We’ve two types of stream access methods:
-NAVIGATION
Using an ascending/descending index.
Can only use 1 index for navigation and is called “Out of storage order”.
Loop through the index entries and fetch the records.
This causes many data-page reads, because in most cases for every record a new
data-page must be read.
Fastest way when you want to fetch only a few records by order (FIRST X) from
a huge table.
-SEQUENTIAL
No index and called “In storage order”.
Fetch the records in the way the are stored on disk. This is thus in an
unpredictable order.
Fastest way when you want to fetch a large piece of the table.
24
Filter methodsFilter methods
• Index retrieval
Combine (and/or operations) bitmaps into final bitmap.
Decide on selectivity / “segment match” if index is useful at all.
Final a list of recordnumbers for retrieval from records.
• Boolean evaluation
Evaluate expression on record after retrieval.
10001
10002
10003
10005
10001
10002
10004
10008
10001
10002
25
Join methodsJoin methods
• OUTER JOIN
Left / right / full
• INNER JOIN
Cross
• MERGE
Merge rivers (river = group of streams) into 1 river
FB 2.0 can also merge rivers based on expressions
OUTER JOIN: Left / right / full outer join.
INNER JOIN: Cross, join 2 or more streams.
MERGE: Merge rivers (a river represent multiple streams) into 1 river and does
only work for INNER JOINs.
When there’s a relationship between two streams, but no index could be used. It
will try to sort both streams and merge them together.
FB2 can also merge streams based on expressions, such as:
SELECT * FROM Table1 t1 JOIN Table2 t2 ON (t2.ID + 100 = t1.ID)
26
Execution PLAN IExecution PLAN I
You can retrieve the information (PLAN) how the optimizer has
decided which way to go. (for example in ISQL with SET PLAN ON)
The optimizer converts the RSB tree into a readable form using :
• PLAN
• NATURAL (In storage order)
• ORDER (Out of storage order)
• INDEX
• JOIN
• MERGE
• SORT
Almost every database tool can give you the PLAN from a query. Some give you
even a nice graphical screen with some hints about the PLAN.
When asking for a PLAN the optimizer converts the RSB tree into a readable
format using the keywords:
- PLAN (Start of a RSB tree)
- NATURAL (Sequential, In storage order)
- ORDER (Navigation, Out of storage order)
- INDEX (Retrieval by bitmap)
- JOIN (Inner/left/right/full join streams)
- MERGE (Merge two rivers)
- SORT (Sorting stream)
27
Execution PLAN IIExecution PLAN II
rsb_cross
rsb_sequential
RDB$RELATIONS
rsb_boolean
rsb_indexed
RDB$RELATION_FIELDS
RDB$INDEX_4
SELECT
rf.RDB$RELATION_NAME,
rf.RDB$FIELD_NAME
FROM
RDB$RELATIONS r
JOIN RDB$RELATION_FIELDS rf ON (rf.RDB$RELATION_NAME = r.RDB$RELATION_NAME)
PLAN JOIN (R NATURAL, RF INDEX (RDB$INDEX_4))
Read the PLAN from left to right, the most expensive part should be at the left
Let’s took the same example as used in a slide before.
At the top the statement with below the RSB tree used internally.
Under the RSB tree you see the readable PLAN output made by the optimizer.
Read the PLAN from left to right and you’ll notice that it has the same “nodes”
as the RSB tree from top to bottom.
Things at the left are thus processed first and at the right as last. As you
understand a NATURAL having on the right side is mostly a expensive thing,
because that will read the whole stream for every time called.
28
Calculations in optimizer ODS 10Calculations in optimizer ODS 10
stream cost = (cardinality * index_selectivity) +
(indexes * INDEX_COST)
INDEX_COST = 30.0
cardinality = (nr_data_pages * (page_size / format_length))
Estimated, because :
Assumed data page is 100% filled with uncompressed records
priority level for used indexes
Stream cost = (cardinality * index_selectivity) + (indexes * INDEX_COST)
INDEX_COST is an hard coded value of 30.0
Indexes is the number of indexes used by the stream
Cardinality = (nr_data_pages * (page_size / format_length_record))
Nr_data_pages is the number of data pages for the table.
format_length_record = Uncompressed size for the record.
This is estimated, because it’s assumed that all data pages are filled for 100
percent and the records aren’t compressed.
In FB1.5 a priority level for indexes is introduced.
The priority level is based on :
- How many equality conjunctions match against the segments.
- How many conjunctions can be matched against an index.
- How many segments are matched.
29
Calculations in optimizer ODS 11Calculations in optimizer ODS 11
stream cost = (cardinality * total selectivity) + total index cost
Index cost = estimated number of index pages
1 + (index selectivity * index cardinality).
cardinality =
nr_data_pages * ((page_size – offset) / format_length * 0.5)
Estimated, because :
Assumed data page is 100% filled with uncompressed records
Stream cost = (cardinality * index_selectivity) + index cost
Cardinality = nr_data_pages * ((page_size – offset) / (min_rec_size +
format_length_record * 0.5))
nr_data_pages is the number of data pages for the table.
format_length_record = Uncompressed size for the record.
offset = Header space used in page.
min_rec_size = Minimum size a record always will use.
Index cost = estimated number of index pages 1 + (selectivity * index
cardinality).
This is estimated, because it’s assumed that all data pages are filled for 100
percent and the records aren’t compressed.
30
Calculations outside optimizerCalculations outside optimizer
Index selectivityIndex selectivity
Index selectivity (value between 0 and 1) :
nodes = 0 :
selectivity = 0.0
nodes >= 1 :
selectivity = 1 / (nodes - duplicates)
How more duplicates how worse (higher value) the selectivity.
The index selectivity is calculated outside the optimizer and belongs to the index.
Selectivity is a value between 0 and 1.
If there are no nodes the selectivity is zero else the selectivity is calculated by:
Selectivity = 1 / (nodes – duplicates)
How higher the value is near to 1 the more duplicate nodes are in the index
(selectivity’s compared from indexes on same table). Note that the number of
nodes could be higher as the number of records in the table, because the index
can hold nodes which point to records which aren’t visible for the current
transaction. Need to be garbage collected for example.
In ODS 11 the selectivity is also calculated per segment which makes
calculations with compound indexes more accurate.
31
((Re)CalculateRe)Calculate index selectivityindex selectivity
Index selectivity is calculated when :
• creating a index (thus also restore)
• activate a index : ALTER INDEX name ACTIVE
• force recalculation : SET STATISTICS INDEX name
Keep your index selectivity information accurate
Periodically, recalculate index with SET STATISITICS command
Periodically, recalculate index with the SET STATISTICS command.
Also recalculate always all indexes that belong to a table, so that the selectivity’s
between the indexes are accurate when compared to each other.
32
IndexIndex
• Index root page
Every table has a index root page which hold all base index
information for that table. The selectivity, index-description is stored
together with the pagenumber from the first page of the index b-tree.
• Index b-tree
Nodes (index entries) are stored with prefix compression.
This meant a index page can only be walked forwards.
Note! A index contains also nodes from already deleted records,
because they still could be used by a other transaction. These are
removed by the garbage collector.
33
Content index page ODS 10Content index page ODS 10
Header
Examples: left and right sibling page
Nodes
UCHAR btn_prefix; // size of compressed prefix
UCHAR btn_length; // length of data in node
UCHAR btn_number[4]; // page or record number
UCHAR btn_data[x]; // key data
Maximum length 255 bytes
Example :
Ascending index with 2 nodes with Firebird and Fuel
0, 8, 1001, Firebird, 1, 3, 1002, uel
Maximum index size for Firebird 1.5 and lower is 255 bytes, but note that
collations can use 3 bytes for only 1 character and thus decreases the size to a
maximum of 84 characters. Beside that when a compound index is used also for
every 4 bytes an 1 byte “segment-marker” is added.
A nice key size calculator can be found on the site from Ivan Prenosil:
http://www.volny.cz/iprenosil/interbase/ip_ib_indexcalculator.htm
34
Content index page ODS 11Content index page ODS 11
Header
Examples: left and right sibling page
Jump information
Few nodes to jump immediately half the page
Nodes
Length, prefix and number are stored compressed
Maximum index key size ¼ of page size
Record numbers are stored in non-leaf pages
40-bits record number
The index nodes in ODS 11 are stored compressed and therefore more nodes fits
on 1 page, but a disadvantage was the decoding time for traversing all nodes on 1
page. To avoid this problem “jump information” has been added to the top of the
page. ”Jump information” contains a few nodes with offsets and point
somewhere in the page. When a node-lookup is done first is looked at the “jump
information” and then the search is started in the nodes.
35
Index lookup IIndex lookup I (Ascending)(Ascending)
SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD = 100
Index
Root
P30
L1
P52
L0
P50
L0
P51
L0
P53
L0
P..
With equal comparison
optimizer binds lower and
upper values for index
lookup.
Index evaluation starts with
lower bound value and scans
until it skips over the upper
bound value.
With an index lookup it will lookup the first b-tree page in the index root page.
Next it will lookup the first matching node in the b-tree page. If this is not the
leaf level page it will jump to the first next-level until the leaf page it found.
From there it will start scanning until it skips over the upper bound value.
36
Index lookup IIIndex lookup II (Ascending)(Ascending)
SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD <= 150
Index
Root
P30
L1
P52
L0
P50
L0
P51
L0
P53
L0
P..
With lower or equal than
condition optimizer binds
upper value for index lookup.
Index evaluation starts at
first page and scans until it
skips over the upper bound
value.
desc
With lower or equal than the first leaf-level page has to be found and from there
it starts scanning until it skips over the upper bound value.
37
Index lookup IIIIndex lookup III (Ascending)(Ascending)
SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD < 150 ?
Index
Root
P30
L1
P52
L0
P50
L0
P51
L0
P53
L0
P..
With lower than condition
optimizer binds upper value
for index lookup.
Index evaluation starts at
first page and scans
until it skip over upper
bound.
Note ! Without equal sign
index will still be scanned the
same.
For Firebird 1.5 the bitmap returned for “lower or equal than” and “lower than”
(of course compared with the same expressions on the left and right side from the
operator) is exactly the same. Which resulted in unneeded record-fetches.
This problem is fixed in Firebird 2.0
38
Index lookup IVIndex lookup IV (Ascending)(Ascending)
SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD >= 150
Index
Root
P30
L1
P52
L0
P50
L0
P51
L0
P53
L0
P..
With higher than or equal
condition optimizer binds
lower value for index lookup.
Index evaluation starts at
lower value and scans
until the end of the whole
index.
39
Index lookup VIndex lookup V (Ascending)(Ascending)
SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD BETWEEN 150 and 200
Index
Root
P30
L1
P52
L0
P50
L0
P51
L0
P53
L0
P..
With the between condition
the optimizer binds lower
and upper value.
Index evaluation starts at
lower value and scans
until it skips over the upper
value.
40
Index lookup VIIndex lookup VI (Descending)(Descending)
SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD <= 150
With lower and equal than
condition optimizer binds
lower value for index lookup
when index is descending.
Index evaluation starts at
lower bound value and scans
till the last page.
Index
Root
L1
L0
L0
L0
L0
asc
For ODS 10 NULLS are always stored at the end and this can cause unneeded
record fetches with an descending index.
In ODS 11 NULLS are stored at the front with an ascending index and at the end
by a descending index.
Prefer always an ascending index and create only a descending index when you
really need them for navigation (ORDER BY), but first think twice.
41
Optimizer improvements FB 1.5Optimizer improvements FB 1.5
• Compound-index, choose the most correct index.
• Ignore indexes which are bad compared to already chosen indexes.
• OR operator doesn’t choose every index anymore.
• Sub-select in UPDATE statement couldn’t use index
Example:
UPDATE TableA SET FieldA =
(SELECT FieldB FROM TableB b WHERE b.ID = TableA.ID)
• A VIEW in a LEFT JOIN couldn’t use a index.
• Make more conjunctions based on already existing ones.
• Distribute more conjunctions to LEFT JOIN.
• “no current record for fetch operation” fixes.
42
Optimizer Improvements FB 2.0Optimizer Improvements FB 2.0
• Segment selectivity for compound index (ODS 11).
• Use Merge on “larger” expressions (A.F1 + A.F2 = B.F2 – B.F1).
• Distribute conjunctions in Union / Aggregate when possible.
• ORDER BY using index also with outer joins.
• Re-use conjunctions, so compound indexes benefit from it (ODS 11).
• Better support for IS NULL / STARTING WITH in compound
indexes and choosing join order (ODS 11).
• Matching both OR and AND nodes to indexes (ODS 11).
• Exclude the lower and/or higher index scans with > (greater than)
and/or < (less than) conjunctions.
43
Future Optimizer ImprovementsFuture Optimizer Improvements
• OUTER Merge.
• Cached statements.
• Move LEFT JOINs to bottom when possible.
• Memory table.
• Hash JOIN.
• Histogram information.
• Out of storage order depending on FIRST/SKIP.
44
Questions?Questions?
45
Thank you for your attentionThank you for your attention

More Related Content

What's hot

oracle plsql training | oracle online training | oracle plsql demo | oracle p...
oracle plsql training | oracle online training | oracle plsql demo | oracle p...oracle plsql training | oracle online training | oracle plsql demo | oracle p...
oracle plsql training | oracle online training | oracle plsql demo | oracle p...Nancy Thomas
 
Packages in PL/SQL
Packages in PL/SQLPackages in PL/SQL
Packages in PL/SQLPooja Dixit
 
plsql tutorialhub....
plsql tutorialhub....plsql tutorialhub....
plsql tutorialhub....Abhiram Vijay
 
Oracle PLSQL Step By Step Guide
Oracle PLSQL Step By Step GuideOracle PLSQL Step By Step Guide
Oracle PLSQL Step By Step GuideSrinimf-Slides
 
Programming Without Coding Technology (PWCT) Environment
Programming Without Coding Technology (PWCT) EnvironmentProgramming Without Coding Technology (PWCT) Environment
Programming Without Coding Technology (PWCT) EnvironmentMahmoud Samir Fayed
 
Stacks IN DATA STRUCTURES
Stacks IN DATA STRUCTURESStacks IN DATA STRUCTURES
Stacks IN DATA STRUCTURESSowmya Jyothi
 
ORACLE PL SQL FOR BEGINNERS
ORACLE PL SQL FOR BEGINNERSORACLE PL SQL FOR BEGINNERS
ORACLE PL SQL FOR BEGINNERSmohdoracle
 
Procedure and Functions in pl/sql
Procedure and Functions in pl/sqlProcedure and Functions in pl/sql
Procedure and Functions in pl/sqlÑirmal Tatiwal
 
Programming c sharp 3rd ch6 7 21
Programming c sharp 3rd ch6 7 21Programming c sharp 3rd ch6 7 21
Programming c sharp 3rd ch6 7 21alowblow
 

What's hot (20)

oracle plsql training | oracle online training | oracle plsql demo | oracle p...
oracle plsql training | oracle online training | oracle plsql demo | oracle p...oracle plsql training | oracle online training | oracle plsql demo | oracle p...
oracle plsql training | oracle online training | oracle plsql demo | oracle p...
 
Packages in PL/SQL
Packages in PL/SQLPackages in PL/SQL
Packages in PL/SQL
 
Plsql les04
Plsql les04Plsql les04
Plsql les04
 
Apache solr liferay
Apache solr liferayApache solr liferay
Apache solr liferay
 
plsql tutorialhub....
plsql tutorialhub....plsql tutorialhub....
plsql tutorialhub....
 
Oracle PLSQL Step By Step Guide
Oracle PLSQL Step By Step GuideOracle PLSQL Step By Step Guide
Oracle PLSQL Step By Step Guide
 
Programming Without Coding Technology (PWCT) Environment
Programming Without Coding Technology (PWCT) EnvironmentProgramming Without Coding Technology (PWCT) Environment
Programming Without Coding Technology (PWCT) Environment
 
Sap abap
Sap abapSap abap
Sap abap
 
Python libraries
Python librariesPython libraries
Python libraries
 
Stacks IN DATA STRUCTURES
Stacks IN DATA STRUCTURESStacks IN DATA STRUCTURES
Stacks IN DATA STRUCTURES
 
Oracle: PLSQL Introduction
Oracle: PLSQL IntroductionOracle: PLSQL Introduction
Oracle: PLSQL Introduction
 
Log4j
Log4jLog4j
Log4j
 
plsql les01
 plsql les01 plsql les01
plsql les01
 
Abap reports
Abap reportsAbap reports
Abap reports
 
ORACLE PL SQL FOR BEGINNERS
ORACLE PL SQL FOR BEGINNERSORACLE PL SQL FOR BEGINNERS
ORACLE PL SQL FOR BEGINNERS
 
Procedure and Functions in pl/sql
Procedure and Functions in pl/sqlProcedure and Functions in pl/sql
Procedure and Functions in pl/sql
 
Oracle: Procedures
Oracle: ProceduresOracle: Procedures
Oracle: Procedures
 
Oracle: PLSQL
Oracle: PLSQLOracle: PLSQL
Oracle: PLSQL
 
Programming c sharp 3rd ch6 7 21
Programming c sharp 3rd ch6 7 21Programming c sharp 3rd ch6 7 21
Programming c sharp 3rd ch6 7 21
 
functions
functionsfunctions
functions
 

Similar to Understanding the firebird optimizer

Query-porcessing-& Query optimization
Query-porcessing-& Query optimizationQuery-porcessing-& Query optimization
Query-porcessing-& Query optimizationSaranya Natarajan
 
RDBMS
RDBMSRDBMS
RDBMSsowfi
 
The life of a query (oracle edition)
The life of a query (oracle edition)The life of a query (oracle edition)
The life of a query (oracle edition)maclean liu
 
Query Optimization - Brandon Latronica
Query Optimization - Brandon LatronicaQuery Optimization - Brandon Latronica
Query Optimization - Brandon Latronica"FENG "GEORGE"" YU
 
Db2 sql tuning and bmc catalog manager
Db2 sql tuning and bmc catalog manager Db2 sql tuning and bmc catalog manager
Db2 sql tuning and bmc catalog manager Krishan Singh
 
Query optimization
Query optimizationQuery optimization
Query optimizationPooja Dixit
 
127556030 bisp-informatica-question-collections
127556030 bisp-informatica-question-collections127556030 bisp-informatica-question-collections
127556030 bisp-informatica-question-collectionsAmit Sharma
 
Nested subqueries and subquery chaining in openCypher
Nested subqueries and subquery chaining in openCypherNested subqueries and subquery chaining in openCypher
Nested subqueries and subquery chaining in openCypheropenCypher
 
Optimizing MySQL Queries
Optimizing MySQL QueriesOptimizing MySQL Queries
Optimizing MySQL QueriesAchievers Tech
 
evaluation of statistical expression, materialised views, evaluation plans
evaluation of statistical expression, materialised views, evaluation plansevaluation of statistical expression, materialised views, evaluation plans
evaluation of statistical expression, materialised views, evaluation plansHarsh Kotwani
 
Tech Talk - JPA and Query Optimization - publish
Tech Talk  -  JPA and Query Optimization - publishTech Talk  -  JPA and Query Optimization - publish
Tech Talk - JPA and Query Optimization - publishGleydson Lima
 
Informatica Designer Module
Informatica Designer ModuleInformatica Designer Module
Informatica Designer Moduleganblues
 
MySQL Optimizer Overview
MySQL Optimizer OverviewMySQL Optimizer Overview
MySQL Optimizer OverviewOlav Sandstå
 
Cost-based Query Optimization in Apache Phoenix using Apache Calcite
Cost-based Query Optimization in Apache Phoenix using Apache CalciteCost-based Query Optimization in Apache Phoenix using Apache Calcite
Cost-based Query Optimization in Apache Phoenix using Apache CalciteJulian Hyde
 

Similar to Understanding the firebird optimizer (20)

Query-porcessing-& Query optimization
Query-porcessing-& Query optimizationQuery-porcessing-& Query optimization
Query-porcessing-& Query optimization
 
RDBMS
RDBMSRDBMS
RDBMS
 
The life of a query (oracle edition)
The life of a query (oracle edition)The life of a query (oracle edition)
The life of a query (oracle edition)
 
Query Optimization - Brandon Latronica
Query Optimization - Brandon LatronicaQuery Optimization - Brandon Latronica
Query Optimization - Brandon Latronica
 
Chapter15
Chapter15Chapter15
Chapter15
 
Db2 sql tuning and bmc catalog manager
Db2 sql tuning and bmc catalog manager Db2 sql tuning and bmc catalog manager
Db2 sql tuning and bmc catalog manager
 
Mdb dn 2016_06_query_primer
Mdb dn 2016_06_query_primerMdb dn 2016_06_query_primer
Mdb dn 2016_06_query_primer
 
ORDBMS.pptx
ORDBMS.pptxORDBMS.pptx
ORDBMS.pptx
 
Mdb dn 2016_05_index_tuning
Mdb dn 2016_05_index_tuningMdb dn 2016_05_index_tuning
Mdb dn 2016_05_index_tuning
 
Query optimization
Query optimizationQuery optimization
Query optimization
 
127556030 bisp-informatica-question-collections
127556030 bisp-informatica-question-collections127556030 bisp-informatica-question-collections
127556030 bisp-informatica-question-collections
 
Final exam in advance dbms
Final exam in advance dbmsFinal exam in advance dbms
Final exam in advance dbms
 
Nested subqueries and subquery chaining in openCypher
Nested subqueries and subquery chaining in openCypherNested subqueries and subquery chaining in openCypher
Nested subqueries and subquery chaining in openCypher
 
Optimizing MySQL Queries
Optimizing MySQL QueriesOptimizing MySQL Queries
Optimizing MySQL Queries
 
evaluation of statistical expression, materialised views, evaluation plans
evaluation of statistical expression, materialised views, evaluation plansevaluation of statistical expression, materialised views, evaluation plans
evaluation of statistical expression, materialised views, evaluation plans
 
Tech Talk - JPA and Query Optimization - publish
Tech Talk  -  JPA and Query Optimization - publishTech Talk  -  JPA and Query Optimization - publish
Tech Talk - JPA and Query Optimization - publish
 
Informatica Designer Module
Informatica Designer ModuleInformatica Designer Module
Informatica Designer Module
 
MySQL Optimizer Overview
MySQL Optimizer OverviewMySQL Optimizer Overview
MySQL Optimizer Overview
 
Cost-based Query Optimization in Apache Phoenix using Apache Calcite
Cost-based Query Optimization in Apache Phoenix using Apache CalciteCost-based Query Optimization in Apache Phoenix using Apache Calcite
Cost-based Query Optimization in Apache Phoenix using Apache Calcite
 
Cost-Based query optimization
Cost-Based query optimizationCost-Based query optimization
Cost-Based query optimization
 

More from Marius Adrian Popa

Python with Firebird: FDB driver 101
Python with Firebird: FDB driver 101Python with Firebird: FDB driver 101
Python with Firebird: FDB driver 101Marius Adrian Popa
 
The State of the Romanian Game Developers Industry Rgda 2019 report
The State of the Romanian Game Developers Industry Rgda 2019 reportThe State of the Romanian Game Developers Industry Rgda 2019 report
The State of the Romanian Game Developers Industry Rgda 2019 reportMarius Adrian Popa
 
Firebird 3.0 statistics and plans
Firebird 3.0 statistics and plansFirebird 3.0 statistics and plans
Firebird 3.0 statistics and plansMarius Adrian Popa
 
Tuning Linux Windows and Firebird for Heavy Workload
Tuning Linux Windows and Firebird for Heavy WorkloadTuning Linux Windows and Firebird for Heavy Workload
Tuning Linux Windows and Firebird for Heavy WorkloadMarius Adrian Popa
 
Firebird Performance 2.5/3.0.x/4.0
 Firebird Performance 2.5/3.0.x/4.0 Firebird Performance 2.5/3.0.x/4.0
Firebird Performance 2.5/3.0.x/4.0Marius Adrian Popa
 

More from Marius Adrian Popa (11)

Python with Firebird: FDB driver 101
Python with Firebird: FDB driver 101Python with Firebird: FDB driver 101
Python with Firebird: FDB driver 101
 
The State of the Romanian Game Developers Industry Rgda 2019 report
The State of the Romanian Game Developers Industry Rgda 2019 reportThe State of the Romanian Game Developers Industry Rgda 2019 report
The State of the Romanian Game Developers Industry Rgda 2019 report
 
Firebird Advanced Trace API
Firebird Advanced Trace API Firebird Advanced Trace API
Firebird Advanced Trace API
 
Firebird 3.0 statistics and plans
Firebird 3.0 statistics and plansFirebird 3.0 statistics and plans
Firebird 3.0 statistics and plans
 
Tuning Linux Windows and Firebird for Heavy Workload
Tuning Linux Windows and Firebird for Heavy WorkloadTuning Linux Windows and Firebird for Heavy Workload
Tuning Linux Windows and Firebird for Heavy Workload
 
Firebird Performance 2.5/3.0.x/4.0
 Firebird Performance 2.5/3.0.x/4.0 Firebird Performance 2.5/3.0.x/4.0
Firebird Performance 2.5/3.0.x/4.0
 
Django firebird project
Django firebird projectDjango firebird project
Django firebird project
 
Proiectul django firebird
Proiectul django firebirdProiectul django firebird
Proiectul django firebird
 
Firebird Myths in Romanian
Firebird Myths in RomanianFirebird Myths in Romanian
Firebird Myths in Romanian
 
2 Firebird Technical Ro
2 Firebird Technical Ro2 Firebird Technical Ro
2 Firebird Technical Ro
 
0 What Is Mind The Bird Ro
0 What Is Mind The Bird Ro0 What Is Mind The Bird Ro
0 What Is Mind The Bird Ro
 

Recently uploaded

From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...Florian Roscheck
 
9711147426✨Call In girls Gurgaon Sector 31. SCO 25 escort service
9711147426✨Call In girls Gurgaon Sector 31. SCO 25 escort service9711147426✨Call In girls Gurgaon Sector 31. SCO 25 escort service
9711147426✨Call In girls Gurgaon Sector 31. SCO 25 escort servicejennyeacort
 
ASML's Taxonomy Adventure by Daniel Canter
ASML's Taxonomy Adventure by Daniel CanterASML's Taxonomy Adventure by Daniel Canter
ASML's Taxonomy Adventure by Daniel Cantervoginip
 
Customer Service Analytics - Make Sense of All Your Data.pptx
Customer Service Analytics - Make Sense of All Your Data.pptxCustomer Service Analytics - Make Sense of All Your Data.pptx
Customer Service Analytics - Make Sense of All Your Data.pptxEmmanuel Dauda
 
How we prevented account sharing with MFA
How we prevented account sharing with MFAHow we prevented account sharing with MFA
How we prevented account sharing with MFAAndrei Kaleshka
 
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degreeyuu sss
 
PKS-TGC-1084-630 - Stage 1 Proposal.pptx
PKS-TGC-1084-630 - Stage 1 Proposal.pptxPKS-TGC-1084-630 - Stage 1 Proposal.pptx
PKS-TGC-1084-630 - Stage 1 Proposal.pptxPramod Kumar Srivastava
 
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一F La
 
GA4 Without Cookies [Measure Camp AMS]
GA4 Without Cookies [Measure Camp AMS]GA4 Without Cookies [Measure Camp AMS]
GA4 Without Cookies [Measure Camp AMS]📊 Markus Baersch
 
dokumen.tips_chapter-4-transient-heat-conduction-mehmet-kanoglu.ppt
dokumen.tips_chapter-4-transient-heat-conduction-mehmet-kanoglu.pptdokumen.tips_chapter-4-transient-heat-conduction-mehmet-kanoglu.ppt
dokumen.tips_chapter-4-transient-heat-conduction-mehmet-kanoglu.pptSonatrach
 
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdfKantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdfSocial Samosa
 
20240419 - Measurecamp Amsterdam - SAM.pdf
20240419 - Measurecamp Amsterdam - SAM.pdf20240419 - Measurecamp Amsterdam - SAM.pdf
20240419 - Measurecamp Amsterdam - SAM.pdfHuman37
 
RadioAdProWritingCinderellabyButleri.pdf
RadioAdProWritingCinderellabyButleri.pdfRadioAdProWritingCinderellabyButleri.pdf
RadioAdProWritingCinderellabyButleri.pdfgstagge
 
B2 Creative Industry Response Evaluation.docx
B2 Creative Industry Response Evaluation.docxB2 Creative Industry Response Evaluation.docx
B2 Creative Industry Response Evaluation.docxStephen266013
 
Predicting Salary Using Data Science: A Comprehensive Analysis.pdf
Predicting Salary Using Data Science: A Comprehensive Analysis.pdfPredicting Salary Using Data Science: A Comprehensive Analysis.pdf
Predicting Salary Using Data Science: A Comprehensive Analysis.pdfBoston Institute of Analytics
 
04242024_CCC TUG_Joins and Relationships
04242024_CCC TUG_Joins and Relationships04242024_CCC TUG_Joins and Relationships
04242024_CCC TUG_Joins and Relationshipsccctableauusergroup
 
NLP Data Science Project Presentation:Predicting Heart Disease with NLP Data ...
NLP Data Science Project Presentation:Predicting Heart Disease with NLP Data ...NLP Data Science Project Presentation:Predicting Heart Disease with NLP Data ...
NLP Data Science Project Presentation:Predicting Heart Disease with NLP Data ...Boston Institute of Analytics
 
Building on a FAIRly Strong Foundation to Connect Academic Research to Transl...
Building on a FAIRly Strong Foundation to Connect Academic Research to Transl...Building on a FAIRly Strong Foundation to Connect Academic Research to Transl...
Building on a FAIRly Strong Foundation to Connect Academic Research to Transl...Jack DiGiovanna
 
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)jennyeacort
 

Recently uploaded (20)

From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...
 
9711147426✨Call In girls Gurgaon Sector 31. SCO 25 escort service
9711147426✨Call In girls Gurgaon Sector 31. SCO 25 escort service9711147426✨Call In girls Gurgaon Sector 31. SCO 25 escort service
9711147426✨Call In girls Gurgaon Sector 31. SCO 25 escort service
 
ASML's Taxonomy Adventure by Daniel Canter
ASML's Taxonomy Adventure by Daniel CanterASML's Taxonomy Adventure by Daniel Canter
ASML's Taxonomy Adventure by Daniel Canter
 
Customer Service Analytics - Make Sense of All Your Data.pptx
Customer Service Analytics - Make Sense of All Your Data.pptxCustomer Service Analytics - Make Sense of All Your Data.pptx
Customer Service Analytics - Make Sense of All Your Data.pptx
 
How we prevented account sharing with MFA
How we prevented account sharing with MFAHow we prevented account sharing with MFA
How we prevented account sharing with MFA
 
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Defence Colony Delhi 💯Call Us 🔝8264348440🔝
 
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
 
PKS-TGC-1084-630 - Stage 1 Proposal.pptx
PKS-TGC-1084-630 - Stage 1 Proposal.pptxPKS-TGC-1084-630 - Stage 1 Proposal.pptx
PKS-TGC-1084-630 - Stage 1 Proposal.pptx
 
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
 
GA4 Without Cookies [Measure Camp AMS]
GA4 Without Cookies [Measure Camp AMS]GA4 Without Cookies [Measure Camp AMS]
GA4 Without Cookies [Measure Camp AMS]
 
dokumen.tips_chapter-4-transient-heat-conduction-mehmet-kanoglu.ppt
dokumen.tips_chapter-4-transient-heat-conduction-mehmet-kanoglu.pptdokumen.tips_chapter-4-transient-heat-conduction-mehmet-kanoglu.ppt
dokumen.tips_chapter-4-transient-heat-conduction-mehmet-kanoglu.ppt
 
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdfKantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
Kantar AI Summit- Under Embargo till Wednesday, 24th April 2024, 4 PM, IST.pdf
 
20240419 - Measurecamp Amsterdam - SAM.pdf
20240419 - Measurecamp Amsterdam - SAM.pdf20240419 - Measurecamp Amsterdam - SAM.pdf
20240419 - Measurecamp Amsterdam - SAM.pdf
 
RadioAdProWritingCinderellabyButleri.pdf
RadioAdProWritingCinderellabyButleri.pdfRadioAdProWritingCinderellabyButleri.pdf
RadioAdProWritingCinderellabyButleri.pdf
 
B2 Creative Industry Response Evaluation.docx
B2 Creative Industry Response Evaluation.docxB2 Creative Industry Response Evaluation.docx
B2 Creative Industry Response Evaluation.docx
 
Predicting Salary Using Data Science: A Comprehensive Analysis.pdf
Predicting Salary Using Data Science: A Comprehensive Analysis.pdfPredicting Salary Using Data Science: A Comprehensive Analysis.pdf
Predicting Salary Using Data Science: A Comprehensive Analysis.pdf
 
04242024_CCC TUG_Joins and Relationships
04242024_CCC TUG_Joins and Relationships04242024_CCC TUG_Joins and Relationships
04242024_CCC TUG_Joins and Relationships
 
NLP Data Science Project Presentation:Predicting Heart Disease with NLP Data ...
NLP Data Science Project Presentation:Predicting Heart Disease with NLP Data ...NLP Data Science Project Presentation:Predicting Heart Disease with NLP Data ...
NLP Data Science Project Presentation:Predicting Heart Disease with NLP Data ...
 
Building on a FAIRly Strong Foundation to Connect Academic Research to Transl...
Building on a FAIRly Strong Foundation to Connect Academic Research to Transl...Building on a FAIRly Strong Foundation to Connect Academic Research to Transl...
Building on a FAIRly Strong Foundation to Connect Academic Research to Transl...
 
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
 

Understanding the firebird optimizer

  • 2. 2 Global topicsGlobal topics Introduction At which point does the optimizer his work Optimizer steps Index Questions?
  • 3. 3 IntroductionIntroduction Arno Brinkman BISIT engineering b.v. ABVisie firebird@abvisie.nl Firebird conference 2007
  • 4. 4 Task of the OptimizerTask of the Optimizer The optimizer should optimize the execution path in a way that it becomes the most efficient (fastest) way for the engine to execute it. In fact the name Optimizer already say what it should do
  • 5. 5 Optimizer strategiesOptimizer strategies • Heuristic (rule based) • Cost-based • User determined. These are the three optimizer strategies we have. Heuristic optimizer is based on rules. Cost-based is depending on estimated cost. User determined optimizer in which the user controls how the execution path should look like. Such as given hints or in case of firebird a explicit PLAN which forces the execution path. Firebird 1.5 uses cost based approach together with heuristic. Firebird 2.0 is even some more towards the cost-based strategy. A rule example is always preferring an PK index when there’s an equality operator on all the PK fields.
  • 6. 6 When is the optimizer called?When is the optimizer called? • SQL statement • DSQL parser • BLR (Binary Language Representation) generator • Compile the BLR • Optimizer (RSE RSB) • Statement is prepared First we have our SQL statement. This SQL statement is being parsed in the Dynamic SQL parser. After the DSQL the BLR (Binary language representation) is generated (the op- code for the engine). As next step the BLR is compiled into an Record Selection Expression tree were also the Optimizer is called. The Optimizer will finally turn the RSE into a RSB tree and then the statement is prepared. As you see many things happen before a statement is prepared. So when you use the same statements a lot, keep them prepared in your application. Note that there is no strong binding with a transaction.
  • 7. 7 RSERSE RSBRSB The optimizer turns an RSE (Record Selection Expression) into a RSB (Record Source Blocks) tree. The optimizer turns a RSE (record selection expression) into a RSB (record source block) tree. That are both tree’s with internally structures by the engine which are used to walk down a path to execute it.
  • 8. 8 RSB types used by engine IRSB types used by engine I - FIRST, SKIP: retrieve first x and skip y records - CROSS: inner join - LEFT_CROSS: left/right/full outer join - MERGE: inner join using merge - UNION: union - AGGREGATE: perform aggregation - SORT: use memory sorting FIRST and SKIP: They retrieve the first X and/or skip Y records from a stream. CROSS: That’s a nothing more then the INNER JOIN. LEFT_CROSS: This can be a left/right or full outer join. MERGE: Merge two sorted streams together (always together with SORT). UNION: Union two or more stream. AGGREGATE: Base stream for grouping and performing aggregate calculations (sum, total, average, …) from a stream SORT: Sort stream. Use memory when available else swap to disk.
  • 9. 9 RSB types used by engine IIRSB types used by engine II - SEQUENTIAL: retrieve records in the way they are stored - NAVIGATE: navigational index retrieval - BOOLEAN: logical condition - INDEXED: retrieve records through index - DBKEY: retrieve specific record by recordnumber - PROCEDURE: stored procedure - EXT_SEQUENTIAL: external sequential access SEQUENTIAL: Retrieving the records in the way they are stored on disk. NAVIGATE: Walking trough an index and fetching the records that belong to the index-entry. BOOLEAN: Logical condition. INDEXED: Filter, Retrieve records through index. DBKEY: Retrieve explicit record by record number. PROCEDURE: Executes stored procedure. EXT_SEQUENTIAL: External sequential access. There are still some other types in the engine, but they aren’t in use anymore.
  • 10. 10 RSERSE RSB exampleRSB example SELECT rf.RDB$RELATION_NAME, rf.RDB$FIELD_NAME FROM RDB$RELATIONS r JOIN RDB$RELATION_FIELDS rf ON (rf.RDB$RELATION_NAME = r.RDB$RELATION_NAME) Example SQL statement i’ll use for a RSE to RSB conversion. Assume we’re using this simple statement against the system tables.
  • 11. 11 RSERSE RSB exampleRSB example blr_rse, 1, blr_rs_stream, 2, blr_relation2, 13, 'R','D','B','$','R','E','L','A','T','I','O','N','S', 1, 'R', 1, blr_relation2, 19, 'R','D','B','$','R','E','L','A','T','I','O','N','_','F','I','E','L','D','S', 2, 'R','F', 2, blr_boolean, blr_eql, blr_field, 2, 17, 'R','D','B','$','R','E','L','A','T','I','O','N','_','N','A','M','E', blr_field, 1, 17, 'R','D','B','$','R','E','L','A','T','I','O','N','_','N','A','M','E', blr_end, blr_end, rsb_cross rsb_sequential RDB$RELATIONS rsb_boolean rsb_indexed RDB$RELATION_FIELDS RDB$INDEX_4 Then the RSE part (BLR-code) of the previous statement will look as the above part in the screen. (When you create a VIEW with this statement you can see this BLR in the blob-field RDB$VIEW_BLR of RDB$RELATIONS) The RSE goes into the optimizer and will turn it into a RSB tree as you see below. First you see RSB_CROSS which meant JOIN (here two) streams. The first stream has RSB_SEQUENTIAL and thus reads all records from the table RDB$RELATIONS in storage order. For every record from the first stream the RSB_BOOLEAN is executed which calls RSB_INDEXED and retrieves all records evaluated by the RDB$INDEX_4 scan on RDB$RELATION_FIELDS. For every record returned by RDB$RELATION_FIELDS the boolean condition is evaluated.
  • 12. 12 DSQL optimization / transformationDSQL optimization / transformation • NOT simplification (FB 2.0) NOT A > 0 A <= 0 NOT NOT A = 0 A = 0 • Expr1 IN (sub-query) => Exists EXISTS(SELECT … WHERE Expr1 = …) • Expr1 IN (const 1, const 2, …, const n) to OR conditions (Expr1 = const 1) OR (Expr1 = const 2) OR … (Expr1 = const n) There are a few optimizations/transformations that are done in the DSQL layer. The NOT condition is simplified when possible, so that it can eventually use indexes (FB 2.0). An sub-query used in the IN predicate is transformed to an EXISTS. IN predicate with list of values is converted to a list of OR conditions
  • 13. 13 Optimizer layoutOptimizer layout Distribute conjunctions Aggregate Union Procedure River Check sorts Distribute / Explode conjunctions Sub-streams Tables Sort / Merge riversOuter join Inner join (return rivers) First / Skip Sort / Merge rivers Sort Simple overview of how the flow of the optimizer is internally.
  • 14. 14 Check sortsCheck sorts • Check if a GROUP BY exists using the same fields as the projection (DISTINCT) and/or sort (ORDER BY). If so, the projection/sort can be removed • Check if the first n fields from the sort matches the projection. If so, the sort can be removed. • If all fields in the sort are from 1 stream, deliver it to the outer stream when possible. (FB 2.0)
  • 15. 15 Conjunctions (conditions)Conjunctions (conditions) • Decomposition - Convert a “between” conjunction into a “greater than or equal” and a “less than or equal” conjunction. (x BETWEEN a AND b) (x >= a) and (x <= b) - If a LIKE starts with anything else than a pattern-matching character add a STARTING WITH conjunction, because STARTING WITH can use a index. • Try to make more conjunctions based on equality conjunctions available. - If (a = b) and (a # c) (b # c) for any operation '#'. Decomposition: The optimizer tries to convert/expand the conjunctions so it can do more with it. For example: - Convert a between conjunction into a “greater than or equal” and “less than or equal” conjunction. - We have the like: If the like starts with anything else than a pattern-matching character then a STARTING WITH conjunction is added, because only the STARTING WITH can be used with the index. The LIKE itself cannot use an index. When a LIKE is used together with a parameter (.. WHERE FieldA LIKE :parameter) never an index can be used, because at prepare time it’s unknown what value will go into the parameter. It also tries to make more conjunctions based on equality conjunctions available. This to helps binding/choosing the best index available. For example you’ve (a = b) and (a >= c) this will result in a new conjunction (b >= c).
  • 16. 16 Process orderProcess order Items at same level processed first : - UNION - AGGREGATE - PROCEDURE - Nested-RSE’s Finally processed : - INNER JOIN - OUTER JOIN
  • 17. 17 Distribute conjunctionsDistribute conjunctions Distribute HAVING conjunctions to the WHERE clause (FB 2.0) Distribute UNION filter conjunctions to the filter clauses of the inside streams (FB 2.0) Distribute HAVING conjunctions to the WHERE clause (FB 2.0) Conjunctions in the HAVING clause which contain fields that are also in the GROUP BY clause can be distributed to the WHERE clause, so that it eventually can use an index. Distribute UNION filter conjunctions to the filter clauses of the inside streams (FB 2.0) When an UNION is part of a VIEW and you perform a filter on the VIEW the filter is distributed to every query from the UNION.
  • 18. 18 Optimizer decisionsOptimizer decisions • Stream order Only for inner streams • Stream fetch method In/Out storage order • Filter methods Index and/or boolean evaluation • Join method MERGE, INNER/OUTER JOIN The Optimizer makes decisions about: -The stream order for inner joins. It decides in which order the streams should be executed after each other. -Stream fetch method. In or Out storage order. Which meant read it in the way it’s stored on disk (In storage order) or use an index navigation. -Filter methods. Index and/or Boolean evaluation. -JOIN method. MERGE, INNER/OUTER JOIN
  • 19. 19 Optimizer layout inner join ODS 10Optimizer layout inner join ODS 10 Find best join order Form rivers Get Indexed Relationships Unique indexed relationships Indexed relationships Calculate cost Indirect relationships Inner Join Generate retrieval Find best Form river Simplified overview of the inner join part in the optimizer for ODS 10. First the indexed relationships between the streams are determined. Next search for the best join order. Finally match the conjunctions to the indexes and form rivers.
  • 20. 20 Relationships Mark used streams Calculate cost Optimizer layout inner join ODS 11Optimizer layout inner join ODS 11 Find best join order Form rivers Calculate stream info OR nodes Make inversion AND nodes Mark used conjunctions Inner Join Retrieval Find best Indexed relationships Sort on cost Base cost Calculate stream info Simplified overview of the inner join part in the optimizer for ODS 11. First the base cost / indexed relationships between the streams are calculated. Next do a walk for every stream and recursively for the next cheapest indexed relationship stream. Finally match the conjunctions to the indexes and form rivers.
  • 21. 21 Stream order ODS 10Stream order ODS 10 Given a set of streams, select the "best order" to join them. The "best order" is defined as longest, cheapest join order. (length, of course, takes precedence over cost). - Determine relationships for every stream. - Try every relationship combination. - Calculate estimated cost and cardinality per stream. Based on estimated total records, index-selectivity, unique-indexes and number of indexes - Loop through index relationships with unique relationships first First determine relationships for every stream with other streams inside the same INNER JOIN “block”. Next try every relationship combination. Calculate estimated cost and cardinality per stream. This is based on estimated total records, index-selectivity, unique-indexes and number of indexes Loop through direct index relationships with direct unique relationships first. This is done because the unique relationships are the most interesting/cheapest relationships. Finally check for indirect indexed relationships.
  • 22. 22 Stream order ODS 11Stream order ODS 11 Given a set of streams, select the "best order" to join them. The "best order" is defined as longest, cheapest join order. (length, of course, takes precedence over cost). - First determine base cost and indexed relationships for every stream. - Next try every stream. - Calculate estimated cost and cardinality per stream. Based on estimated total records, index-selectivity, indexes-cost. - Try the next cheapest indexed relationship until all relationships are calculated. First determine base cost and indexed relationships for every stream. Next try every stream. Calculate estimated cost and cardinality per stream at each position. This is based on estimated total records, index-selectivity, index-cost. Try the next cheapest indexed relationship until all relationships are calculated.
  • 23. 23 Stream access methodsStream access methods • NAVIGATION: Use index (ascending / descending) Can only use 1 index for navigation. Called “Out of storage order”. Loop through index entries and fetch records (many pages needs to be read). • SEQUENTIAL: No index Called “In storage order”. Fetch the records from the pages in the way they are stored (unpredictable order) We’ve two types of stream access methods: -NAVIGATION Using an ascending/descending index. Can only use 1 index for navigation and is called “Out of storage order”. Loop through the index entries and fetch the records. This causes many data-page reads, because in most cases for every record a new data-page must be read. Fastest way when you want to fetch only a few records by order (FIRST X) from a huge table. -SEQUENTIAL No index and called “In storage order”. Fetch the records in the way the are stored on disk. This is thus in an unpredictable order. Fastest way when you want to fetch a large piece of the table.
  • 24. 24 Filter methodsFilter methods • Index retrieval Combine (and/or operations) bitmaps into final bitmap. Decide on selectivity / “segment match” if index is useful at all. Final a list of recordnumbers for retrieval from records. • Boolean evaluation Evaluate expression on record after retrieval. 10001 10002 10003 10005 10001 10002 10004 10008 10001 10002
  • 25. 25 Join methodsJoin methods • OUTER JOIN Left / right / full • INNER JOIN Cross • MERGE Merge rivers (river = group of streams) into 1 river FB 2.0 can also merge rivers based on expressions OUTER JOIN: Left / right / full outer join. INNER JOIN: Cross, join 2 or more streams. MERGE: Merge rivers (a river represent multiple streams) into 1 river and does only work for INNER JOINs. When there’s a relationship between two streams, but no index could be used. It will try to sort both streams and merge them together. FB2 can also merge streams based on expressions, such as: SELECT * FROM Table1 t1 JOIN Table2 t2 ON (t2.ID + 100 = t1.ID)
  • 26. 26 Execution PLAN IExecution PLAN I You can retrieve the information (PLAN) how the optimizer has decided which way to go. (for example in ISQL with SET PLAN ON) The optimizer converts the RSB tree into a readable form using : • PLAN • NATURAL (In storage order) • ORDER (Out of storage order) • INDEX • JOIN • MERGE • SORT Almost every database tool can give you the PLAN from a query. Some give you even a nice graphical screen with some hints about the PLAN. When asking for a PLAN the optimizer converts the RSB tree into a readable format using the keywords: - PLAN (Start of a RSB tree) - NATURAL (Sequential, In storage order) - ORDER (Navigation, Out of storage order) - INDEX (Retrieval by bitmap) - JOIN (Inner/left/right/full join streams) - MERGE (Merge two rivers) - SORT (Sorting stream)
  • 27. 27 Execution PLAN IIExecution PLAN II rsb_cross rsb_sequential RDB$RELATIONS rsb_boolean rsb_indexed RDB$RELATION_FIELDS RDB$INDEX_4 SELECT rf.RDB$RELATION_NAME, rf.RDB$FIELD_NAME FROM RDB$RELATIONS r JOIN RDB$RELATION_FIELDS rf ON (rf.RDB$RELATION_NAME = r.RDB$RELATION_NAME) PLAN JOIN (R NATURAL, RF INDEX (RDB$INDEX_4)) Read the PLAN from left to right, the most expensive part should be at the left Let’s took the same example as used in a slide before. At the top the statement with below the RSB tree used internally. Under the RSB tree you see the readable PLAN output made by the optimizer. Read the PLAN from left to right and you’ll notice that it has the same “nodes” as the RSB tree from top to bottom. Things at the left are thus processed first and at the right as last. As you understand a NATURAL having on the right side is mostly a expensive thing, because that will read the whole stream for every time called.
  • 28. 28 Calculations in optimizer ODS 10Calculations in optimizer ODS 10 stream cost = (cardinality * index_selectivity) + (indexes * INDEX_COST) INDEX_COST = 30.0 cardinality = (nr_data_pages * (page_size / format_length)) Estimated, because : Assumed data page is 100% filled with uncompressed records priority level for used indexes Stream cost = (cardinality * index_selectivity) + (indexes * INDEX_COST) INDEX_COST is an hard coded value of 30.0 Indexes is the number of indexes used by the stream Cardinality = (nr_data_pages * (page_size / format_length_record)) Nr_data_pages is the number of data pages for the table. format_length_record = Uncompressed size for the record. This is estimated, because it’s assumed that all data pages are filled for 100 percent and the records aren’t compressed. In FB1.5 a priority level for indexes is introduced. The priority level is based on : - How many equality conjunctions match against the segments. - How many conjunctions can be matched against an index. - How many segments are matched.
  • 29. 29 Calculations in optimizer ODS 11Calculations in optimizer ODS 11 stream cost = (cardinality * total selectivity) + total index cost Index cost = estimated number of index pages 1 + (index selectivity * index cardinality). cardinality = nr_data_pages * ((page_size – offset) / format_length * 0.5) Estimated, because : Assumed data page is 100% filled with uncompressed records Stream cost = (cardinality * index_selectivity) + index cost Cardinality = nr_data_pages * ((page_size – offset) / (min_rec_size + format_length_record * 0.5)) nr_data_pages is the number of data pages for the table. format_length_record = Uncompressed size for the record. offset = Header space used in page. min_rec_size = Minimum size a record always will use. Index cost = estimated number of index pages 1 + (selectivity * index cardinality). This is estimated, because it’s assumed that all data pages are filled for 100 percent and the records aren’t compressed.
  • 30. 30 Calculations outside optimizerCalculations outside optimizer Index selectivityIndex selectivity Index selectivity (value between 0 and 1) : nodes = 0 : selectivity = 0.0 nodes >= 1 : selectivity = 1 / (nodes - duplicates) How more duplicates how worse (higher value) the selectivity. The index selectivity is calculated outside the optimizer and belongs to the index. Selectivity is a value between 0 and 1. If there are no nodes the selectivity is zero else the selectivity is calculated by: Selectivity = 1 / (nodes – duplicates) How higher the value is near to 1 the more duplicate nodes are in the index (selectivity’s compared from indexes on same table). Note that the number of nodes could be higher as the number of records in the table, because the index can hold nodes which point to records which aren’t visible for the current transaction. Need to be garbage collected for example. In ODS 11 the selectivity is also calculated per segment which makes calculations with compound indexes more accurate.
  • 31. 31 ((Re)CalculateRe)Calculate index selectivityindex selectivity Index selectivity is calculated when : • creating a index (thus also restore) • activate a index : ALTER INDEX name ACTIVE • force recalculation : SET STATISTICS INDEX name Keep your index selectivity information accurate Periodically, recalculate index with SET STATISITICS command Periodically, recalculate index with the SET STATISTICS command. Also recalculate always all indexes that belong to a table, so that the selectivity’s between the indexes are accurate when compared to each other.
  • 32. 32 IndexIndex • Index root page Every table has a index root page which hold all base index information for that table. The selectivity, index-description is stored together with the pagenumber from the first page of the index b-tree. • Index b-tree Nodes (index entries) are stored with prefix compression. This meant a index page can only be walked forwards. Note! A index contains also nodes from already deleted records, because they still could be used by a other transaction. These are removed by the garbage collector.
  • 33. 33 Content index page ODS 10Content index page ODS 10 Header Examples: left and right sibling page Nodes UCHAR btn_prefix; // size of compressed prefix UCHAR btn_length; // length of data in node UCHAR btn_number[4]; // page or record number UCHAR btn_data[x]; // key data Maximum length 255 bytes Example : Ascending index with 2 nodes with Firebird and Fuel 0, 8, 1001, Firebird, 1, 3, 1002, uel Maximum index size for Firebird 1.5 and lower is 255 bytes, but note that collations can use 3 bytes for only 1 character and thus decreases the size to a maximum of 84 characters. Beside that when a compound index is used also for every 4 bytes an 1 byte “segment-marker” is added. A nice key size calculator can be found on the site from Ivan Prenosil: http://www.volny.cz/iprenosil/interbase/ip_ib_indexcalculator.htm
  • 34. 34 Content index page ODS 11Content index page ODS 11 Header Examples: left and right sibling page Jump information Few nodes to jump immediately half the page Nodes Length, prefix and number are stored compressed Maximum index key size ¼ of page size Record numbers are stored in non-leaf pages 40-bits record number The index nodes in ODS 11 are stored compressed and therefore more nodes fits on 1 page, but a disadvantage was the decoding time for traversing all nodes on 1 page. To avoid this problem “jump information” has been added to the top of the page. ”Jump information” contains a few nodes with offsets and point somewhere in the page. When a node-lookup is done first is looked at the “jump information” and then the search is started in the nodes.
  • 35. 35 Index lookup IIndex lookup I (Ascending)(Ascending) SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD = 100 Index Root P30 L1 P52 L0 P50 L0 P51 L0 P53 L0 P.. With equal comparison optimizer binds lower and upper values for index lookup. Index evaluation starts with lower bound value and scans until it skips over the upper bound value. With an index lookup it will lookup the first b-tree page in the index root page. Next it will lookup the first matching node in the b-tree page. If this is not the leaf level page it will jump to the first next-level until the leaf page it found. From there it will start scanning until it skips over the upper bound value.
  • 36. 36 Index lookup IIIndex lookup II (Ascending)(Ascending) SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD <= 150 Index Root P30 L1 P52 L0 P50 L0 P51 L0 P53 L0 P.. With lower or equal than condition optimizer binds upper value for index lookup. Index evaluation starts at first page and scans until it skips over the upper bound value. desc With lower or equal than the first leaf-level page has to be found and from there it starts scanning until it skips over the upper bound value.
  • 37. 37 Index lookup IIIIndex lookup III (Ascending)(Ascending) SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD < 150 ? Index Root P30 L1 P52 L0 P50 L0 P51 L0 P53 L0 P.. With lower than condition optimizer binds upper value for index lookup. Index evaluation starts at first page and scans until it skip over upper bound. Note ! Without equal sign index will still be scanned the same. For Firebird 1.5 the bitmap returned for “lower or equal than” and “lower than” (of course compared with the same expressions on the left and right side from the operator) is exactly the same. Which resulted in unneeded record-fetches. This problem is fixed in Firebird 2.0
  • 38. 38 Index lookup IVIndex lookup IV (Ascending)(Ascending) SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD >= 150 Index Root P30 L1 P52 L0 P50 L0 P51 L0 P53 L0 P.. With higher than or equal condition optimizer binds lower value for index lookup. Index evaluation starts at lower value and scans until the end of the whole index.
  • 39. 39 Index lookup VIndex lookup V (Ascending)(Ascending) SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD BETWEEN 150 and 200 Index Root P30 L1 P52 L0 P50 L0 P51 L0 P53 L0 P.. With the between condition the optimizer binds lower and upper value. Index evaluation starts at lower value and scans until it skips over the upper value.
  • 40. 40 Index lookup VIIndex lookup VI (Descending)(Descending) SELECT * FROM A_TABLE WHERE A_INDEXED_FIELD <= 150 With lower and equal than condition optimizer binds lower value for index lookup when index is descending. Index evaluation starts at lower bound value and scans till the last page. Index Root L1 L0 L0 L0 L0 asc For ODS 10 NULLS are always stored at the end and this can cause unneeded record fetches with an descending index. In ODS 11 NULLS are stored at the front with an ascending index and at the end by a descending index. Prefer always an ascending index and create only a descending index when you really need them for navigation (ORDER BY), but first think twice.
  • 41. 41 Optimizer improvements FB 1.5Optimizer improvements FB 1.5 • Compound-index, choose the most correct index. • Ignore indexes which are bad compared to already chosen indexes. • OR operator doesn’t choose every index anymore. • Sub-select in UPDATE statement couldn’t use index Example: UPDATE TableA SET FieldA = (SELECT FieldB FROM TableB b WHERE b.ID = TableA.ID) • A VIEW in a LEFT JOIN couldn’t use a index. • Make more conjunctions based on already existing ones. • Distribute more conjunctions to LEFT JOIN. • “no current record for fetch operation” fixes.
  • 42. 42 Optimizer Improvements FB 2.0Optimizer Improvements FB 2.0 • Segment selectivity for compound index (ODS 11). • Use Merge on “larger” expressions (A.F1 + A.F2 = B.F2 – B.F1). • Distribute conjunctions in Union / Aggregate when possible. • ORDER BY using index also with outer joins. • Re-use conjunctions, so compound indexes benefit from it (ODS 11). • Better support for IS NULL / STARTING WITH in compound indexes and choosing join order (ODS 11). • Matching both OR and AND nodes to indexes (ODS 11). • Exclude the lower and/or higher index scans with > (greater than) and/or < (less than) conjunctions.
  • 43. 43 Future Optimizer ImprovementsFuture Optimizer Improvements • OUTER Merge. • Cached statements. • Move LEFT JOINs to bottom when possible. • Memory table. • Hash JOIN. • Histogram information. • Out of storage order depending on FIRST/SKIP.
  • 45. 45 Thank you for your attentionThank you for your attention