Neoview Query Guide HP Part Number: 544579–001 Published: August 2007 Edition: HP Neoview Release 2.
© Copyright 2007 Hewlett-Packard Development Company, L.P. Legal Notice Confidential computer software. Valid license from HP required for possession, use or copying. Consistent with FAR 12.211 and 12.212, Commercial Computer Software, Computer Software Documentation, and Technical Data for Commercial Items are licensed to the U.S. Government under vendor’s standard commercial license. The information contained herein is subject to change without notice.
Table of Contents About This Document.........................................................................................................9 Supported Release Version Updates (RVUs)..........................................................................................9 Intended Audience.................................................................................................................................9 New and Changed Information in This Edition.............................................
NESTED_SEMI_JOIN Operator.................................................................................................37 NESTED_ANTI_SEMI_JOIN Operator......................................................................................38 LEFT_NESTED_JOIN Operator.................................................................................................38 TUPLE_FLOW Operator............................................................................................................39 Merge Joins..
TUPLELIST Operator.................................................................................................................63 UNPACK Operator....................................................................................................................63 VALUES Operator......................................................................................................................63 Operators Appearing Infrequently or Not At All..............................................................
List of Figures 2-1 2-2 Visual Query Planner....................................................................................................................22 Simple Nested Join Plan With ESP Parallelism.............................................................................
About This Document This guide describes how to understand query execution plans and how to affect performance of an HP Neoview database. This guide is for HP users who use Neoview SQL to query a Neoview database and who have a particular interest in issues related to query performance. Supported Release Version Updates (RVUs) This manual supports HP Neoview Release 2.2.
ENTER RUN CODE ?123 CODE RECEIVED: 123.00 The user must press the Return key after typing the input. [ ] Brackets Brackets enclose optional syntax items. For example: DATETIME [start-field TO] end-field A group of items enclosed in brackets is a list from which you can choose one item or none. The items in the list can be arranged either vertically, with aligned brackets on each side of the list, or horizontally, enclosed in a pair of brackets and separated by vertical lines.
@script-file Quotation marks around a symbol such as a bracket or brace indicate the symbol is a required character that you must type as shown. For example: "{" module-name [, module-name]... "}" Item Spacing Spaces shown between items are required unless one of the items is a punctuation symbol such as a parenthesis or a comma. For example: DAY (datetime-expression) DAY(datetime-expression) If there is no space between two items, spaces are not permitted.
• • Neoview Query Guide Information about reviewing query execution plans and investigating query performance of Neoview databases. Visual Query Planner An application that allows you to graphically display query execution plans generated by the Neoview optimizer. Reference Neoview SQL Reference Manual Reference information about the syntax of SQL statements, functions, and other SQL language elements supported by the Neoview database software.
1 Using Explain A query execution plan represents the specific steps and actions that the Neoview database takes to execute a query. Query plans show the exact access paths to database structures and provide the estimated number of rows resulting from each step, as well as the relative cost. Query plans are composed of a set of preexisting functions or methods called operators that implement a particular task for a query. Operators and the operations they perform are discussed in Chapter 3 (page 31).
3. Populate the table. Populating the table is a two-step process: a. Prepare the query b. Select and insert into the new table NOTE: You might be curious about whether you can capture explain plans in VQP. You cannot use VQP to capture multiple explain plans or load the plans back into VQP. Also, you cannot load multiple plans into a single instance of VQP. Historical Explain Database You might want to maintain query plans over a period of time or generate the same query plans using different settings.
( VERSION_ID , VERSION_TIME , VERSION_DESC MODULE_NAME , STATEMENT_NAME , PLAN_ID , SEQ_NUM , OPERATOR , LEFT_CHILD_SEQ_NUM , RIGHT_CHILD_SEQ_NUM , TNAME , , , , CARDINALITY OPERATOR_COST TOTAL_COST DETAIL_COST , DESCRIPTION NUMERIC(4) NO DEFAULT NOT NULL TIMESTAMP(0) NO DEFAULT NOT NULL VARCHAR(32) NO DEFAULT NOT NULL CHAR(60) CHARACTER SET ISO88591 COLLATE DEFAULT NO DEFAULT CHAR(6) CHARACTER SET ISO88591 COLLATE DEFAULT NO DEFAULT NOT NULL LARGEINT NO DEFAULT INT NO DEFAULT CHAR(30) CHARACTER SET ISO8
3. Populate the table by preparing the query, and selecting and inserting it into the new table: -- PREPARE THE QUERY PREPARE q FROM SELECT * FROM a; -- INSERT THE PLAN INTO THE EXPLAIN TABLE INSERT INTO EXPLAIN_TAB SELECT 1, CURRENT_TIMESTAMP, 'R2.2 SUT22', * FROM TABLE (EXPLAIN(NULL, 'Q')); The prepared query in the SELECT statement must be uppercase. In the select list of the insert-select statement, column values are added to support versioning for your table.
SELECT SUM(CASE SUM(CASE SUM(CASE SUM(CASE SUM(CASE SUM(CASE WHEN WHEN WHEN WHEN WHEN WHEN NBR NBR NBR NBR NBR NBR < 1 THEN 1 ELSE 0 END) AS COST_L1, BETWEEN 1 AND 5 THEN 1 ELSE 0 END) AS COST_B1_5, BETWEEN 6 AND 10 THEN 1 ELSE 0 END) AS COST_B6_10, BETWEEN 11 AND 20 THEN 1 ELSE 0 END) AS COST_B11_20, BETWEEN 21 AND 50 THEN 1 ELSE 0 END) AS COST_B21_50, > 50 THEN 1 ELSE 0 END) AS COST_G50 FROM ( SELECT STATEMENT_NAME, TOTAL_COST AS NBR FROM EXPLAIN_TAB WHERE OPERATOR = 'ROOT' FOR READ UNCOMMITTED ACCESS
2 Using Visual Query Planner Visual Query Planner (VQP) is a GUI application that runs on a PC and enables you to extract and display query execution plans generated by the Neoview compiler for DML statements. VQP uses the EXPLAIN function internally to extract the information about the query plan. NOTE: Although VQP uses the EXPLAIN function to extract information about the query plan, some of the VQP headings for fields do not match the headings for the EXPLAIN statement.
Uninstalling VQP 1. Start the uninstall process: Start > Programs > NonStop SQL-MX > Remove Visual Query Planner 2. 3. 4. On the Welcome page, select Remove option and click Next. On the Select Features page, select Visual Query Planner and click Next. Click Finish to complete the removal of VQP. Using the VQP Interface VQP enables you to extract, display, and save query execution plans generated by the Neoview compiler for DML statements.
After you are connected to your data source, the status message along the bottom of the window displays the data source name. Also, the Connect to ODBC icon on the toolbar is dimmed, indicating that the connection has been made. 3. In the top pane of the Visual Query Planner window, enter your query: You must enter (or copy) the query rather than trying to execute a prepared query. VQP internally prepares the query and assigns it a statement name.
Figure 2-1 Visual Query Planner 5. Select File > Save to save your query execution plan. VQP does not automatically save plans. If you want to review the plans later, you must save them. The default name for the session appears in the Save dialog box. If you choose to provide a different name for the query execution plan, the new name appears on the title bar. You do not need to connect to the Neoview database or ODBC to open saved plans. In the query plan, each operator has an icon next to it.
Operator Icon Operator Group Operator Groupby HASH_GROUPBY HASH_PARTIAL_GROUPBY_LEAF HASH_PARTIAL_GROUPBY_ROOT SHORTCUT_SCALAR_AGGR SORT_GROUPBY SORT_PARTIAL_AGGR_LEAF SORT_PARTIAL_AGGR_ROOT SORT_PARTIAL_GROUPBY_LEAF SORT_PARTIAL_GROUPBY_ROOT SORT_SCALAR_AGGR Insert INSERT INSERT_VSBB Join HYBRID_HASH_ANTI_SEMI_JOIN HYBRID_HASH_JOIN HYBRID_HASH_SEMI_JOIN LEFT_HYBRID_HASH_JOIN LEFT_MERGE_JOIN LEFT_NESTED_JOIN LEFT_ORDERED_HASH_JOIN MERGE_ANTI_SEMI_JOIN MERGE_JOIN MERGE_SEMI_JOIN NESTED_ANTI_SEMI_JOIN
Click the toolbar buttons to: Create a new file Open an existing file Save a file Cut text within the edit window Copy text within the edit window Paste text within the edit window Connect to an ODBC data source Disconnect from the ODBC data source Get Explain Plan for the query Open help These tasks are also available from the menus. Accessing Additional Information About Operators To access additional information about each operator in the Properties dialog box, double-click an operator entry.
NOTE: Tree depth refers to the number of levels you want to display in the operator tree. A fully expanded operator tree appears when you select All Levels. The pushpin and ? icon appear in the upper left corner of the dialog box. You can pin the dialog box open by selecting the pushpin so that you can select another operator without having to reopen the Properties dialog box. Select the ? icon for context-sensitive help for the operator. The tabs in the Operator Properties dialog box are described next.
• • • • • • • • Node Name describes the operator type; in this case, INDEX_SCAN. Node Seq. Num. is 1, which indicates that the operator is first in the sequence. Left Child Seq. Num. is 0, which indicates that this operator has no left child. Right Child Seq. Num. is 0, which indicates that this operator has no right child. If both the left and right child sequence numbers are 0, then this is a leaf operator. Table Name provides the catalog.schema.tablename of the table scanned.
The token descriptions for each operator are described in Chapter 3 (page 31). Understanding the Query Plan in VQP Suppose you execute this query: SELECT * FROM edw_pro.cust_d1 A, edw_pro.cust_acct_hier_d B WHERE A.cust_ky = B.
VQP uses a binary tree structure for query plans. When you display the same query plan in VQP, the right (or inner) table is listed first in the plan. Figure 2-2 Simple Nested Join Plan With ESP Parallelism Regardless of the complexity of the query and resulting plan, the join plan contains right and left operators. The right or inner table is displayed first: Process Architecture For a Query Several processes are required to execute a query plan.
can execute in the master executor or ESP processes, and groupbys can execute in the master executor, ESP, or DAM processes. Certain scan operators always execute in the same process. For example, the scan operators, including FILE_SCAN and FILE_SCAN_UNIQUE, always execute in the DAM process. The ROOT operator always executes in the master executor process. VQP plans only show the operators that represent the process boundaries and indicate the number of processes used or accessed.
In this nested join plan, 128 ESPs are started to do the join in parallel. In this join, the inner and outer tables do not match. The ESPs still perform the joins independently of one another. However, some contention might exist on the inner table because all ESPs can access any of the inner table partitions at the same time, unlike the hybrid hash join plan shown previously. This potential contention is shown by the SPLIT_TOP operator, which is used with the PARTITION_ACCESS operator for the inner table.
3 Query Plan Operators Use the information in this section to understand the fields (called tokens) in the DESCRIPTION column when you use the EXPLAIN statement and Visual Query Planner to review and understand query execution plans. For information about the EXPLAIN statement, see the Neoview SQL Reference Manual. For information about using Visual Query Planner to analyze plans, see Chapter 2 (page 19).
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • “NESTED_ANTI_SEMI_JOIN Operator” (page 38) “NESTED_JOIN Operator” (page 37) “NESTED_SEMI_JOIN Operator” (page 37) “ORDER_CROSS_PRODUCT” (page 46) “ORDERED_HASH_ANTI_SEMI_JOIN” (page 45) “ORDERED_HASH_JOIN Operator” (page 44) “ORDERED_HASH_SEMI_JOIN Operator” (page 44) “PARTITION_ACCESS Operator” (page 35) “ROOT Operator” (page 33) “SEQUENCE Operator” (page 62) “SIDETREE_INSERT Operator” (page 48) “SHORTCUT_SCALAR_AGGR Operator” (page 58) “SORT Opera
It is important to be able to identify the process in which an operation occurs. Process boundaries are identified by these operators: • • • ROOT operator. This operator and all operators under it execute inside the master executor (also called root process) until another process boundary is reached. Operators that can execute within the master executor process include sort, groupby, and join operators. ESP_EXCHANGE operator.
Token Token Description Data Type upd_action_on_error Determines the type of statement atomicity chosen for a query: text XN_ROLLBACK: Transaction is rolled back if an error occurs. NO_XN_ROLLBACK: Upon error, query stops executing and error is returned. Transaction is NOT rolled back. Only appears if you request a WITH NO ROLLBACK type of transaction. RETURN: Query stops executing and error is returned without need for statement rollback.
Token Token Description Data Type parent_partitioning_function Type of top partitioning and contains summary information text about the parallel plan child_partitioning_function Type of bottom partitioning and contains summary information about the parallel plan text bottom_node_map Associates each process at the bottom to a CPU text merged_order Expression describing sort keys expr(text) bottom_partition_input_values No meaning; token to be removed in a future release PARTITION_ACCESS Opera
Token Token Description Data Type begin_part_no_expr Expression used to calculate the start partition number (appears expr(text) instead of begin_key_preds and begin_key_exclusion_expr) end_part_no_expr Expression used to calculate the end partition number (appears instead of end_key_preds and end_key_exclusion_expr) expr(text) begin_part_selection_expr Expression used by SPLIT_TOP or PARTITION_ACCESS to compute the begin_part_no_expr.
set). Although the steps that process the join might be quite complex, all joins work with two sides only. As joins are processed in the query execution plan, the join results flow from the join to the next operator, which can be in the same or a different process. A single process can include many joins, one supplying another with source rows. All joins can be processed in parallel by ESPs. Parallel joins can be against matching or nonmatching partitions of the table.
The NESTED_SEMI_JOIN operator has two child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor integer and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. parent_frag The fragment_id for the parent fragment of the current fragment. Value is (none) for master executor.
The LEFT_NESTED_JOIN has two child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor integer and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. parent_frag The fragment_id for the parent fragment of the current fragment. Value is (none) for master executor.
Merge Joins In a merge join, both tables are required to be sorted on the join column. A buffer of rows is read from the inner and outer tables, and a row from the outer table is used to match inner table rows in a match-merge pattern. MERGE_JOIN Operator The MERGE_JOIN operator describes a portion of an execution plan that involves a merge join. This operator joins the data from its two child operators. The data streams from both children must be in the same order.
MERGE_ANTI_SEMI_JOIN Operator The MERGE_ANTI_SEMI_JOIN operator returns rows only when no match occurs in the inner table. The operator discards all rows that have a match. Also see “MERGE_JOIN Operator” (page 40) and “MERGE_SEMI_JOIN Operator” (page 40). The MERGE_ANTI_SEMI_JOIN operator has two child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment.
in-memory hash table. If the inner table is too large, it is subject to overflow to disk, which is expensive and slow. The original row order is not guaranteed unless ordered hash joins are used. HYBRID_HASH_JOIN Operator The HYBRID_HASH_JOIN operator joins the data from two child tables. It creates a hash table for the inner table and joins the outer table by hashing each outer row and looking for matches in the hash table.
HYBRID_HASH_ANTI_SEMI_JOIN Operator The HYBRID_HASH_ANTI_SEMI_JOIN operator returns rows from the outer table where no match occurs. Also see “HYBRID_HASH_JOIN Operator” (page 42) and “HYBRID_HASH_SEMI_JOIN Operator” (page 42). The HYBRID_HASH_ANTI_SEMI_JOIN has two child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor integer and 1 is reserved for the Explain plan.
Token Token Description Data Type join_predicate Expression of the join predicate, specified in the ON clause. Used for semi and outer joins. expr(text) selection_predicates Expression of the WHERE clause that is not included in a hash_join_predicate expr(text) or one of the child scans Ordered Joins ORDERED_HASH_JOIN Operator The ORDERED_HASH_JOIN operator joins the data from two child tables. This operator preserves the order of the outer table and does not overflow to disk.
The ORDERED_HASH_SEMI_JOIN operator has two child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. integer parent_frag The fragment_id for the parent fragment of the current fragment. Value integer is (none) for master executor.
LEFT_ORDERED_HASH_JOIN Operator The LEFT_ORDERED_HASH_JOIN operator returns an unmatched outer row even when it does not find a match in the inner table. Null values are supplied for the missing inner rows. The LEFT_ORDERED_HASH_JOIN operator differs from the LEFT_HYBRID_HASH_JOIN in that it preserves the order of the outer table and does not overflow to disk. In addition, the reuse feature enables reuse of the hash table for subsequent requests within the same query.
Insert Operators INSERT Operator The INSERT operator describes the part of an execution plan that inserts a new row into a table. The INSERT operator has no child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor integer and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments.
Token Token Description Data Type part_key_predicate Predicate expression specified on the partitioning key. Displayed only if partitioning key differs from clustering key expr(text) check_constraint Displays check constraints on the insert table text SIDETREE_INSERT Operator The SIDETREE_INSERT operator describes that part of an execution plan that inserts entire blocks of rows into a table in DAM. This operator can only be used on empty tables when the table is unaudited.
Token Token Description Data Type olt_opt_lean Indicates for short, simple operations whether a further optimization that text reduces the physical size of the plan is used. iud_type Type of update followed by table or index name expr(text) partition_name Present only if partition name is specified in the UPDATE statement. Returns the name of the partition.
UNIQUE_UPDATE Operator The UNIQUE_UPDATE operator describes a portion of an execution plan that works on one row only; it updates zero or one row. The UNIQUE_UPDATE operator has no child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor integer and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments.
The CURSOR_DELETE operator has no child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor integer and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. parent_frag The fragment_id for the parent fragment of the current fragment. Value is integer (none) for master executor.
Token Token Description Data Type predicate Expression specified on WHERE clause expr(text) part_key_predicate Predicate expression specified on partitioning key.
Token Token Description Data Type index_end_key Expression of the end key predicates on the index expr(text) check_constraint Check constraint on the delete table text Scan Operators FILE_SCAN Operator The FILE_SCAN operator contains details about how a certain access path is scanned, such as lock_mode and scan_direction. The FILE_SCAN operator has no child operators.
FILE_SCAN_UNIQUE Operator The FILE_SCAN_UNIQUE operator describes a portion of an execution plan where you are scanning for a unique key value. It selects zero or one row. The FILE_SCAN_UNIQUE operator has no child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master integer executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments.
The INDEX_SCAN operator has no child operators. The description field for this operator contains Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. integer parent_frag The fragment_id for the parent fragment of the current fragment. Value integer is (none) for master executor.
The INDEX_SCAN_UNIQUE operator has no child operators. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master integer executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. parent_frag The fragment_id for the parent fragment of the current fragment. Value integer is (none) for master executor.
The HASH_GROUPBY operator has one child operator. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. integer parent_frag The fragment_id for the parent fragment of the current fragment. Value integer is (none) for master executor.
The HASH_PARTIAL_GROUPBY_ROOT operator has one child operator. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. integer parent_frag The fragment_id for the parent fragment of the current fragment. Value integer is (none) for master executor.
The SORT_GROUPBY operator has one child operator. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. integer parent_frag The fragment_id for the parent fragment of the current fragment. Value integer is (none) for master executor.
SORT_PARTIAL_GROUPBY_LEAF Operator The SORT_PARTIAL_GROUPBY_LEAF operator executes a partial group by as close to where the data is read as is cost effective. This strategy reduces the amount of data that must be redistributed for a query. The operator must always be accompanied by a SORT_PARTIAL_GROUPBY_ROOT operator above it in the tree, which finalizes the query. The SORT_PARTIAL_GROUPBY_LEAF operator has one child operator.
Token Token Description Data Type fragment_type master, ESP, or DAM text aggregates Expression of the aggregate function expr(text) selection_predicates Expression of the HAVING clause expr(text) TRANSPOSE Operator The TRANSPOSE operator occurs as a result of a TRANSPOSE clause. It can also occur due to an internally generated GROUPBY clause. You might see this operator if you have multiple distinct aggregates in the query. The TRANSPOSE operator has one child.
Miscellaneous Operators FIRSTN Operator The FIRSTN operator implements the first or any number of rows functionality. For example, SELECT [FIRST 2] * FROM T; the operator is used to return the first 2 (or n) rows returned by the child. This operator is also used to implement the last 0 functionality, which processes all rows and returns none. Token Token Description Data Type fragment_id A sequential number assigned to the fragment.
TUPLELIST Operator The TUPLELIST operator shows the values that you place in the query when the VALUES clause is used. This operator occurs when queries have a large in-list of literal values. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master integer executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments.
Operators Appearing Infrequently or Not At All COMPOUNDSTMT Operator The COMPOUNDSTMT operator describes a portion of an execution plan that involves a compound statement. It also can appear as a by-product of a triggers operation. A compound statement that has n-statements will have n-1 COMPOUNDSTMT operators. This operator enables bundling several statements together as one single atomic statement and allows data to flow from one child to the other.
The PACK operator has one child. The description field for this operator contains: Token Token Description Data Type fragment_id A sequential number assigned to the fragment. 0 is always master integer executor and 1 is reserved for the Explain plan. Numbers 2 to n will be ESP or DAM fragments. parent_frag The fragment_id for the parent fragment of the current fragment. Value is (none) for master executor.
Index Capturing query execution plans described, 13 example, 14 historical database, 14 COMPOUNDSTMT operator, 64 CURSOR_DELETE operator, 50 CURSOR_UPDATE operator, 48 LEFT_HYBRID_HASH_JOIN, 43 LEFT_ORDERED_HASH_JOIN , 46 ORDERED_HASH_ANTI_SEMI_JOIN , 45 ORDERED_HASH_JOIN, 44 ORDERED_HASH_SEMI_JOIN , 44 HASH_GROUPBY operator, 56 HASH_PARTIAL_GROUPBY_LEAF operator, 57 HASH_PARTIAL_GROUPBY_ROOT operator, 57 Help for VQP, 20 HYBRID_HASH_ANTI_SEMI_JOIN operator, 43 HYBRID_HASH_JOIN operator, 42 HYBRID_HASH_SE
NESTED_JOIN , 37 NESTED_SEMI_JOIN , 37 TUPLE_FLOW , 39 NESTED_ANTI_SEMI_JOIN operator, 38 NESTED_JOIN operator, 37 NESTED_SEMI_JOIN operator, 37 O Operators COMPOUNDSTMT , 64 CURSOR_DELETE, 50 CURSOR_UPDATE, 48 described, 31 ESP_EXCHANGE, 34 EXPLAIN, 64 FILE_SCAN, 53 FILE_SCAN_UNIQUE, 54 FIRSTN operator, 62 HASH_GROUPBY, 56 HASH_PARTIAL_GROUPBY_LEAF, 57 HASH_PARTIAL_GROUPBY_ROOT, 57 HYBRID_HASH_ANTI_SEMI_JOIN, 43 HYBRID_HASH_JOIN, 42 HYBRID_HASH_SEMI_JOIN, 42 INDEX_SCAN, 54 INDEX_SCAN_UNIQUE, 55 INSERT, 47
HASH_PARTIAL_GROUPBY_ROOT, 57 SHORTCUT_SCALAR_AGGR, 58 SORT, 58 SORT_GROUPBY, 58 SORT_PARTIAL_AGGR_LEAF, 59 SORT_PARTIAL_AGGR_ROOT, 59 SORT_PARTIAL_GROUPBY_LEAF, 60 SORT_PARTIAL_GROUPBY_ROOT, 60 TRANSPOSE, 61 SORT operator, 58 SORT_GROUPBY operator, 58 SORT_PARTIAL_AGGR_LEAF operator, 59 SORT_PARTIAL_AGGR_ROOT operator, 59 SORT_PARTIAL_GROUPBY_LEAF operator, 60 SORT_PARTIAL_GROUPBY_ROOT operator, 60 SORT_SCALAR_AGGR operator, 60 SPLIT_TOP operator, 29, 36 SUBSET_DELETE operator, 51 SUBSET_UPDATE operator, 4