書き換えられた SELECT 文、UPDATE 文または DELETE 文を返します。
REWRITE( select-statement [, 'ANSI' ] )
select-statement 関数の結果を生成するために書き換えの最適化を適用する SQL 文。
LONG VARCHAR
ANSI 引数を指定せずに REWRITE 関数を使用すると、オプティマイザがどのように特定のクエリのアクセス・プランを生成したかを理解できます。特に、文の WHERE 句、ON 句、HAVING 句の条件が SQL Anywhere によってどのように書き換えられたかを確認して、要求の実行時間を改善するために適用できるインデックスの有無を特定することができます。
REWRITE から返された文は、元の文のセマンティックと一致しない場合があります。これは、一部のリライト最適化では、SQL に直接変換できない内部メカニズムが導入されるためです。たとえば、サーバではローの識別子を使用して重複を排除しますが、これは SQL に変換できません。
REWRITE 関数によって書き換えられたクエリは、実行するためのクエリではありません。リライト・フェーズの後に実際にオプティマイザに何が渡されるかを示すことで、パフォーマンス問題を分析するためのツールです。
REWRITE の出力に反映されないリライト最適化もあります。それらは、LIKE 最適化、minimum 関数または maximum 関数の最適化、上限/下限の排除、述部の仮定条件などです。
ANSI を指定すると、REWRITE は文に相当する ANSI を返します。この場合は、次のリライト最適化のみが適用されます。
Transact-SQL 外部ジョインが、ANSI SQL 外部ジョインに書き換えられる
重複した相関名が削除される
KEY ジョインと NATURAL ジョインが ANSI SQL ジョインに書き換えられる
SQL/2003 ベンダ拡張。
次の例は、クエリでリライト最適化を 2 回実行します。最初の最適化では、サブクエリのネストを解除して、Employees テーブルと SalesOrders テーブルをジョインします。2 回目の最適化では、Employees と SalesOrders の間のプライマリ・キーと外部キーのジョインを削除してクエリを簡素化します。このリライト最適化の一部では、ジョインの述部 e.EmployeeID=s.SalesRepresentative が述部 s.SalesRepresentative IS NOT NULL に置換されます。
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 |