返回重写的 SELECT、UPDATE 或 DELETE 语句。
REWRITE( select-statement [, 'ANSI' ] )
select-statement 要应用重写优化以便生成该函数结果的 SQL 语句。
LONG VARCHAR
使用 REWRITE 函数时可以不带 ANSI 参数,这样可以帮助理解优化程序是如何为给定查询生成访问计划的。具体地讲,可以了解 SQL Anywhere 如何重写语句的 WHERE、ON 和 HAVING 子句中的条件,然后确定是否存在可用于缩短请求执行时间的适用索引。
REWRITE 返回的语句可能与原始语句的语义不匹配。这是因为一些重写优化引入了不能直接转换成 SQL 的内部机制。例如,服务器使用行标识符执行重复项消除就不能转换成 SQL。
REWRITE 函数重写的查询不是用来执行的。它是一种工具,用于通过显示重写阶段后传递给优化程序的内容来分析性能问题。
有些重写优化在 REWRITE 的输出中并未反映出来。它们包括 LIKE 优化、最小或最大函数的优化、上限/下限消除以及判定包容。
如果指定了 ANSI,则 REWRITE 返回语句的 ANSI 等效项。在这种情况下,将仅应用以下重写优化:
Transact-SQL 外连接被重写为 ANSI SQL 外连接。
消除重复的相关名。
KEY 和 NATURAL 连接被重写为 ANSI SQL 连接。
SQL/2003 服务商扩充。
在以下示例中,对查询执行了两个重写优化。第一个优化解除了对 Employees 与 SalesOrders 表之间连接进行的子查询的嵌套。第二个优化通过消除 Employees 与 SalesOrders 之间的主键 - 外键连接简化了查询。此重写优化的一部分用连接谓语 s.SalesRepresentative IS NOT NULL 替换谓语 e.EmployeeID=s.SalesRepresentative。
SELECT REWRITE( 'SELECT s.ID, s.OrderDate FROM SalesOrders s WHERE EXISTS ( SELECT * FROM Employees e WHERE e.EmployeeID = s.SalesRepresentative)' ) FROM dummy; |
查询返回包含重写后查询的单列结果集:
'SELECT s.ID, s.OrderDate FROM SalesOrders s WHERE s.SalesRepresentative IS NOT NULL' |
下一个 REWRITE 示例使用 ANSI 参数。
SELECT REWRITE( 'SELECT DISTINCT s.ID, s.OrderDate, e.GivenName, e.EmployeeID FROM SalesOrders s, Employees e WHERE e.EmployeeID *= s.SalesRepresentative', 'ANSI' ) FROM dummy; |
结果返回语句相应的 ANSI 形式。这种情况下,Transact-SQL 外连接转换为 ANSI 外连接。此查询返回一个单列结果集(该结果集已被分成几行以提高可读性):
'SELECT DISTINCT s.ID, s.OrderDate, e.GivenName, e.EmployeeID FROM Employees as e LEFT OUTER JOIN SalesOrders as s ON e.EmployeeID = s.SalesRepresentative'; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |