3.4. How the Executor Performs
In single-table queries, the executor takes the plan nodes in an order from the end of the plan tree to the root and then invokes the functions that perform the processing of the corresponding nodes.
Each plan node has functions that are meant for executing the respective operation. These functions are located in the src/backend/executor/ directory.
For example, the functions for executing the sequential scan (ScanScan) are defined in nodeSeqscan.c; the functions for executing the index scan (IndexScanNode) are defined in nodeIndexscan.c; the functions for sorting SortNode are defined in nodeSort.c, and so on.
Of course, the best way to understand how the executor performs is to read the output of the EXPLAIN command. PostgreSQL’s EXPLAIN shows the plan tree almost as it is. It will be explained using Example 1 in Section 3.3.3.1.
|
|
Let’s explore how the executor performs. Read the result of the EXPLAIN command from the bottom line to the top line.
-
Line 6: At first, the executor carries out a sequential scan operation using the functions defined in nodeSeqscan.c.
-
Line 4: Next, the executor sorts the result of the sequential scan using the functions defined in nodeSort.c.
Although the executor uses the work_men and temp_buffers, which are allocated in the memory, for query processing, it uses temporary files if the processing cannot be performed within the memory alone.
Using the ANALYZE option, the EXPLAIN command actually executes the query and displays the true row counts, true run time, and the actual memory usage. A specific example is shown below:
|
|
In Line 6, the EXPLAIN command shows that the executor has used a temporary file whose size is 10000kB.
Temporary files are created in the base/pg_tmp subdirectory temporarily, and the naming method is shown follows:
{"pgsql_tmp"} + {PID of the postgres process which creates the file} . {sequencial number from 0}
For example, the temporary file ‘pgsql_tmp8903.5’ is the 6th temporary file created by the postgres process with the pid of 8903.
$ ls -la /usr/local/pgsql/data/base/pgsql_tmp*
-rw------- 1 postgres postgres 10240000 12 4 14:18 pgsql_tmp8903.5