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 関数 [その他]

書き換えられた 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';