dws
查询优化操作符
更新时间:2020/04/21 GMT+08:00
本节主要介绍Teradata查询优化操作符的迁移语法。迁移语法决定了关键字/特性的迁移方式。
可以使用inToExists参数来配置从IN/NOT IN的到EXISTS/NOT EXISTS的迁移行为。
该参数的值默认为FALSE。要使用查询优化功能,需将该参数值设为TRUE。
IN和NOT IN转换
迁移到GaussDB A 和 DWS的SQL查询时,包含IN/NOT IN参数的Teradata查询已经优化并转换为EXISTS/NOT EXISTS运算符。IN/NOT IN操作符可对单列或多列使用。只有当IN/NOT IN语句存在于WHERE或ON子句中时,DSC才会迁移该语句。接下来以IN到EXISTS的转换为例(同样适用于NOT IN到NOT EXISTS的转换)。
IN到EXISTS的简单转换
在如下示例中,输入文件中提供了关键词IN。为进行优化,该工具在迁移过程中将其替换为EXISTS关键词。

- 嵌套IN/NOT IN 的IN/NOT IN语句不支持迁移,迁移的脚本将失效。
1 2 3 4 5 6 7 8 9 10
UPDATE tab1 SET b = 123 WHERE b IN ('abc') AND b IN ( SELECT i FROM tab2 WHERE j NOT IN (SELECT m FROM tab3 ) ) ;
迁移包含子查询的IN/NOT IN语句时,不支持迁移IN/NOT IN操作符和子查询(见示例)之间的注释。
示例:
1 2 3 4 5 6 7
SELECT * FROM categories WHERE category_name IN --comment ( SELECT category_name FROM categories1 ) ORDER BY category_name;
- IN/NOT IN语句迁移,其中对象名称包含$和#
- 如果TABLE名称或TABLE ALIAS以$(美元符号)开头,则工具不会对查询进行迁移。
1 2 3
SELECT Customer_Name FROM Customer_t $A WHERE Customer_ID IN( SELECT Customer_ID FROM Customer_t );
- 如果COLUMN名称以#(hash)开头,则工具进行的查询迁移可能存在问题。
1 2 3
SELECT Customer_Name FROM Customer_t WHERE #Customer_ID IN( SELECT #Customer_ID FROM Customer_t );
- 如果TABLE名称或TABLE ALIAS以$(美元符号)开头,则工具不会对查询进行迁移。
输入:IN
1 2 3 4 | SELECT ...
FROM tab1 t
WHERE t.col1 IN (SELECT icol1 FROM tab2 e)
ORDER BY col1
|
输出
1 2 3 4 5 6 7 | SELECT ...
FROM tab1 t
WHERE EXISTS (SELECT icol1
FROM tab2 e
WHERE icol1 = t.col1
)
ORDER BY col1;
|
输入:IN,使用多列以及Aggregate函数
1 2 3 4 5 6 7 8 9 | SELECT deptno, job_id, empno, salary, bonus
FROM emp_t
WHERE ( deptno, job_id, CAST(salary AS NUMBER(10,2))+CAST(bonus AS NUMBER(10,2)) )
IN ( SELECT deptno, job_id,
MAX(CAST(salary AS NUMBER(10,2))+CAST(bonus AS NUMBER(10,2)))
FROM emp_t
WHERE hire_dt >= CAST( '20170101' AS DATE FORMAT 'YYYYMMDD' )
GROUP BY deptno, job_id )
AND hire_dt IS NOT NULL;
|
输出
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT deptno, job_id, empno, salary, bonus
FROM emp_t MAlias1
WHERE EXISTS ( SELECT deptno, job_id,
MAX(CAST(salary AS NUMBER(10,2))+CAST(bonus AS NUMBER(10,2)))
FROM emp_t
WHERE hire_dt >= CAST( '20170101' AS DATE)
AND deptno = MAlias1.deptno
AND job_id = MAlias1.job_id
GROUP BY deptno, job_id
HAVING MAX(CAST(salary AS NUMBER(10,2))+CAST(bonus AS NUMBER(10,2)))
= CAST(MAlias1.salary AS NUMBER(10,2))+CAST(MAlias1.bonus AS NUMBER(10,2)) )
AND hire_dt IS NOT NULL;
|
父主题: Teradata语法迁移
