|
|
|
|
@ -32,35 +32,35 @@ The parser takes the complex queries, and creates a |
|
|
|
|
<A HREF="../../include/nodes/parsenodes.h">Query</A> structure that |
|
|
|
|
contains all the elements used by complex queries. Query.qual holds the |
|
|
|
|
WHERE clause qualification, which is filled in by |
|
|
|
|
|
|
|
|
|
<A HREF="../../backend/parser/parse_clause.c">transformWhereClause().</A> |
|
|
|
|
Each table is represented by a <A HREF="../../include/nodes/parsenodes.h"> |
|
|
|
|
RangeTableEntry,</A> |
|
|
|
|
and they are linked together to form the <I>range table</I> for the |
|
|
|
|
query, and is generated by <A HREF="../../backend/parser/parse_clause.c"> |
|
|
|
|
Each table referenced in the query is represented by a <A |
|
|
|
|
HREF="../../include/nodes/parsenodes.h"> RangeTableEntry,</A> and they |
|
|
|
|
are linked together to form the <I>range table</I> of the query, which is |
|
|
|
|
generated by <A HREF="../../backend/parser/parse_clause.c"> |
|
|
|
|
makeRangeTable().</A> Query.rtable holds the queries range table. |
|
|
|
|
<P> |
|
|
|
|
Certain queries, like SELECT, return columns of data. Other queries, |
|
|
|
|
like INSERT and UPDATE, specify the columns modified by the query. |
|
|
|
|
These columns references are converted to <A |
|
|
|
|
These column references are converted to <A |
|
|
|
|
HREF="../../include/nodes/primnodes.h"> Resdom</A> entries, which are |
|
|
|
|
linked together to make up the <I>target list</I> of the query. The |
|
|
|
|
target list is stored in Query.targetList, and is generated by |
|
|
|
|
target list is stored in Query.targetList, which is generated by |
|
|
|
|
<A HREF="../../backend/parser/parse_target.c">transformTargetList().</A> |
|
|
|
|
<P> |
|
|
|
|
Other query elements, like aggregates(SUM()), GROUP BY, ORDER BY are |
|
|
|
|
also stored in their own fields. |
|
|
|
|
also stored in their own Query fields. |
|
|
|
|
<P> |
|
|
|
|
The next step is for the Query to be modified by any VIEWS or RULES that |
|
|
|
|
may apply to the query. This is performed by the <A |
|
|
|
|
HREF="../../backend/rewrite">rewrite</A> system. |
|
|
|
|
<P> |
|
|
|
|
The optimizer takes the Query structure, and generates an optimal |
|
|
|
|
<A HREF="../..//include/nodes/plannodes.h">Plan</A> containing primitive |
|
|
|
|
operations to be performed by the executor to complete the query. The |
|
|
|
|
<A HREF="../../backend/optimizer/path">path</A> module |
|
|
|
|
determines the table join order and join type of each of the tables in |
|
|
|
|
the RangeTable, using Query.qual(WHERE clause) to consider optimal index |
|
|
|
|
The <A HREF="../../backend/optimizer">optimizer</A> takes the Query |
|
|
|
|
structure, and generates an optimal |
|
|
|
|
<A HREF="../..//include/nodes/plannodes.h">Plan</A> containing the |
|
|
|
|
primitive operations to be performed by the executor to execute the |
|
|
|
|
query. The <A HREF="../../backend/optimizer/path">path</A> module |
|
|
|
|
determines the best table join order and join type of each table in the |
|
|
|
|
RangeTable, using Query.qual(WHERE clause) to consider optimal index |
|
|
|
|
usage. |
|
|
|
|
<P> |
|
|
|
|
The Plan is then passed to the <A |
|
|
|
|
@ -76,21 +76,27 @@ table data/index blocks, locks, and backend information: |
|
|
|
|
<LI>ShmemIndex - contains an index of all other shared memory |
|
|
|
|
structures, allowing quick lookup of other structure locations in shared |
|
|
|
|
memory |
|
|
|
|
<LI>Buffer Descriptors - control header for shared memory buffer block |
|
|
|
|
<LI>Buffer Blocks - block of table/index data shared by all backends |
|
|
|
|
<LI><A HREF="../../include/storage/buf_internals.h">Buffer |
|
|
|
|
Descriptors</A> - control header for shared memory buffer block |
|
|
|
|
|
|
|
|
|
<LI><A HREF="../../include/storage/buf_internals.h">Buffer Blocks</A> |
|
|
|
|
- block of table/index data shared by all backends |
|
|
|
|
<LI>Shared Buf Lookup Table - lookup to see if a requested buffer |
|
|
|
|
is already in the shared memory area |
|
|
|
|
<LI>LockTable - lock table structure, specifiying table, lock types, and |
|
|
|
|
<LI><A HREF="../../include/storage/lock.h">LockTable</A> |
|
|
|
|
- lock table structure, specifiying table, lock types, and |
|
|
|
|
backends holding or waiting on lock |
|
|
|
|
<LI>LockTable (lock hash) - lookup of LockTable structures using |
|
|
|
|
table name |
|
|
|
|
<LI>LockTable (xid hash) - lookup of LockTable structures using |
|
|
|
|
transaction id |
|
|
|
|
<LI>Proc Header - information about each backend, including locks held/waiting, |
|
|
|
|
indexed by process id |
|
|
|
|
<LI><A HREF="../../include/storage/proc.h">Proc Header</A> - information |
|
|
|
|
about each backend, including locks held/waiting, indexed by process id |
|
|
|
|
</UL> |
|
|
|
|
Each structure is created by calling <A |
|
|
|
|
HREF="../../backend/storage/ipc/shmem.c"> ShmemInitStruct().</A> |
|
|
|
|
Each data structure is created by calling <A |
|
|
|
|
HREF="../../backend/storage/ipc/shmem.c"> ShmemInitStruct(),</A> and |
|
|
|
|
the lookup hashes are created by |
|
|
|
|
<A HREF="../../backend/storage/ipc/shmem.c">ShmemInitHash().</A> |
|
|
|
|
<HR> |
|
|
|
|
<CENTER> |
|
|
|
|
<EM><BIG> |
|
|
|
|
|