The Decision Table operator, in loading a decision table, evaluates the expression in every cell of the table. This is done for two reasons. First, if any invalid expressions are present in the decision table, the load can be rejected and the previously loaded decision table, if any, can be retained. Second, the load-time evaluations populate an expression cache, increasing subsequent runtime performance by several orders of magnitude.
Expressions that appear more than once per column are evaluated just once. Thus, the total time to load a decision table depends upon the total number of unique expressions across all the table columns. For example, in a 100-row, 10-column table, if every cell in each column is unique, 1,000 expressions will be evaluated during loading. If, on the other hand, each column has only 20 unique values, only 200 expressions will be evaluated.
When a decision table is loaded, the Decision Table operator builds a decision tree, in which the root node holds the unique expressions in the first column of the decision table. The expressions in the root node point to second-level nodes holding expressions in the second column of the decision table, and so on. In processing an input tuple against the decision tree, all the expressions in the root node are evaluated, but only those second-level expressions whose parent expressions evaluated to true are evaluated, and so on. Thus, the total number of expressions evaluated in processing an input tuple against a "well-formed" decision tree is typically a small subset of the total set of expressions in the original decision table. A well-formed decision tree is one derived from a decision table containing many duplicate expressions, particularly in the left-most columns. Each expression that evaluates to false eliminates a large portion of the tree, so processing an input tuple typically requires evaluating a small number of expressions.