Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 函数 » SQL 函数 (P-Z)

 

REWRITE 函数 [Miscellaneous]

返回重写的 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';