インライン ビューが使用される理由..??
6 に答える
インライン ビューを使用する理由はさまざまです。インライン ビューがないとできないこともあります。次に例を示します。
1) 分析関数の結果のフィルタリング:
select ename from
( select ename, rank() over (order by sal desc) rnk
from emp
)
where rnk < 4;
2) 順序付けられた結果に ROWNUM を使用する:
select ename, ROWNUM from
( select ename
from emp
order by ename
);
また、作成したい SQL を簡単に記述できるようにするだけの場合もあります。
インライン ビューは、クエリがテーブル名であるかのように、SQL FROM, 句にクエリを配置できる Oracle SQL の構造です。
インライン ビューが提供する
- バインド変数をステートメント内に導入して、データを制限できます
- チューニングのより良い制御
- コードの可視性
Oracle Database Conceptsドキュメントから、インライン・ビューの概念定義があります。
インラインビューはスキーマオブジェクトではありません。これは、SQLステートメント内のビューのように使用できるエイリアス(相関名)を持つサブクエリです。
サブクエリについては、 『Oracle SQLリファレンス』マニュアルの「サブクエリの使用」を参照してください。それは非常に素晴らしい教育情報を持っています。
とにかく、今日は、インラインビューを使用するより強力な方法であるサブクエリファクタリング句を使用することが推奨されています。
すべて一緒の例として:
WITH
dept_costs AS (
SELECT department_name, SUM(salary) dept_total
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY department_name),
avg_cost AS
SELECT * FROM dept_costs
WHERE dept_total >
(SELECT avg FROM (SELECT SUM(dept_total)/COUNT(*) avg
FROM dept_costs)
)
ORDER BY department_name;
そこにあなたはすべての1つを見ることができます:
- インラインビュークエリ:
SELECT SUM...
- 相関サブクエリ:
SELECT avg FROM...
- サブクエリファクタリング:
dept_costs AS (...
それらは何のために使用されますか?:
- 中間ビューオブジェクトの作成を回避するには:
CREATE VIEW ...
- ビューが役に立たないいくつかのクエリを単純化するため。たとえば、ビューをメインクエリからフィルタリングする必要がある場合です。
インライン ビューは、何らかの方法で必要なデータ セットに寄与する中間結果セットと見なすことができます。場合によっては、完全にコードの保守性を向上させることが必要な場合もあれば、論理的に必要な場合もあります。
順序付けされた上位 N 行を取得します。
SELECT name, salary,
FROM (SELECT name, salary
FROM emp
ORDER BY salary DESC)
WHERE rownum <= 10;
多くの場合、インライン ビューを使用してクエリを論理的な部分に分割します。これにより、読みやすさが向上し、より複雑なクエリの記述が少し簡単になります。
Jva と Tony Andrews は、クエリを実行してその結果を順序付けてから、より大きなクエリの一部として使用し、それをフィードすることができるトップ N クエリやページネーション クエリなど、これが役立つ単純なケースの良い例をいくつか提供しました。他の処理を行うクエリで、これらの個々のクエリのロジックを単一のクエリで実現するのは困難です。
非常に便利なもう 1 つのケースは、さまざまなテーブルを結合し、一部のテーブルで集計を実行するクエリを作成している場合です。結合を実行する前に、グループ関数と処理を異なるインライン ビューに分離すると、カーディナリティの管理がはるかに簡単になります。 . いくつかの例が必要な場合は、より明確にするために喜んで提供します。
ファクタリングされたサブクエリ (クエリの最初の WITH 句にクエリをリストする場所) とインライン ビューも、多くの場合、パフォーマンス上の利点をもたらします。サブクエリの結果に複数回アクセスする必要がある場合は、一度実行するだけで、グローバル一時テーブルとして実体化できます (オプティマイザの動作は完全に白黒ではないため、ここでは説明しません)ただし、独自の調査を行うことができます。たとえば、http://jonathanlewis.wordpress.com/2007/07/26/subquery-factoring-2/を参照してください) 。