JP2004509382A - データベースクエリーを自動的に発生するシステム及び方法 - Google Patents
データベースクエリーを自動的に発生するシステム及び方法 Download PDFInfo
- Publication number
- JP2004509382A JP2004509382A JP2002500250A JP2002500250A JP2004509382A JP 2004509382 A JP2004509382 A JP 2004509382A JP 2002500250 A JP2002500250 A JP 2002500250A JP 2002500250 A JP2002500250 A JP 2002500250A JP 2004509382 A JP2004509382 A JP 2004509382A
- Authority
- JP
- Japan
- Prior art keywords
- database query
- join
- user
- subquery
- query
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 49
- 238000005457 optimization Methods 0.000 claims abstract description 62
- 238000006243 chemical reaction Methods 0.000 claims description 40
- 238000003860 storage Methods 0.000 claims description 13
- 238000010586 diagram Methods 0.000 abstract description 12
- 230000009466 transformation Effects 0.000 description 45
- 230000002596 correlated effect Effects 0.000 description 39
- 230000006870 function Effects 0.000 description 13
- 230000000875 corresponding effect Effects 0.000 description 10
- 230000008569 process Effects 0.000 description 10
- 238000000844 transformation Methods 0.000 description 9
- 230000008859 change Effects 0.000 description 5
- 238000012360 testing method Methods 0.000 description 5
- 238000004422 calculation algorithm Methods 0.000 description 3
- 238000009826 distribution Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 238000012545 processing Methods 0.000 description 3
- 238000013515 script Methods 0.000 description 3
- 101100328886 Caenorhabditis elegans col-2 gene Proteins 0.000 description 2
- 101100328884 Caenorhabditis elegans sqt-3 gene Proteins 0.000 description 2
- 230000002776 aggregation Effects 0.000 description 2
- 238000004220 aggregation Methods 0.000 description 2
- 238000012937 correction Methods 0.000 description 2
- 238000005304 joining Methods 0.000 description 2
- XILIYVSXLSWUAI-UHFFFAOYSA-N 2-(diethylamino)ethyl n'-phenylcarbamimidothioate;dihydrobromide Chemical compound Br.Br.CCN(CC)CCSC(N)=NC1=CC=CC=C1 XILIYVSXLSWUAI-UHFFFAOYSA-N 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000001174 ascending effect Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008034 disappearance Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- 230000036541 health Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 238000005192 partition Methods 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000003449 preventive effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2453—Query optimisation
- G06F16/24534—Query rewriting; Transformation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/21—Design, administration or maintenance of databases
- G06F16/217—Database tuning
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
データベースクエリーをチューニングする方法が、データベースクエリーを選択し、該選択したデータベースクエリーをパースして該選択したデータベースクエリーの部分部分の間の関係を決定し、複数個の使用可能な最適化モードから1つの最適化モードを選択し、該決定した関係及び該選択した最適化モードに基づいて該選択したデータベースクエリーの少なくとも一部を修正することによって該選択したデータベースクエリーをチューニングし、且つ該修正したデータベースクエリーを表示することを包含している。
【選択図】図1
【選択図】図1
Description
【0001】
【発明の属する技術分野】
本発明はデータベースに関するものであって、更に詳細には、データベースクエリーを自動的に発生するシステム及び方法に関するものである。
【0002】
【従来の技術】
構造化問い合わせ言語 (SQL)はデータベースと対話するためのANSI標準言語である。SQLはデータベースからデータを検索するためにデータベースにおける多数の異なる組のレコード (テーブル)から情報をユーザが結合することを可能とさせる。然しながら、SQLの能力は幾つかの欠点を有している。例えば、ユーザはSQLクエリーにおいて異なるテーブルを結合させることが可能であるが、そのことはデータベースエンジンが解決することが不可能となる場合があるか又は著しい量のシステム資源を使用する場合があるクエリーを作成する場合がある。
【0003】
データベースシステムは、しばしば、性能調整 (チューニング)システム乃至は方法を有している。例えば、オラクル7は1つ又はそれ以上のレポートにおいてデータベースの動作状態を要約することにより性能チューニング即ち調整を助けるために使用することが可能な種々のスクリプト (例えば、UTILBSTAT及びUTLESTAT)を提供している。これらのスクリプトはシステムにわたってのデータベース性能統計のスナップショットを獲得し且つオペレータがデータベースの性能を最適化することを助けることが可能なレポートを発生するのに有用な1組のSQLスクリプトである。データベースオペレータはデータベースの性能の微調整及びデータベースの予防的メインテナンスのために該レポートを使用することが可能である。レポートは、例えば、ライブラリィキャッシュ、ディクショナリィキャッシュ、ラッチ利用、ファイルI/O及びロールバック統計を包含するデータベースメモリオブジェクトに関する情報を包含することが可能である。
【0004】
既存のシステムにおける問題は、最適な実行プランを発生するのにかかる時間をしばしば制限するということである。更に、オブジェクト統計が存在する場合には、知識を有するユーザはそのオブジェクト統計によって表わされるよりもデータに関してより多くの洞察を有する場合がある。既存のシステムは、しばしば、ユーザの知識を利用するものではない。更に、適切に調整され且つ分析される場合にはスタティスティックス即ち統計は有用なものである場合があるが、オブジェクトが未だに分析されていない場合には統計が全く存在しない場合があり、又統計が時代遅れのものである場合がある。データの分布に関しての洞察を与える特定の統計は特定のインスタンスにおいて存在しない場合がある。一方、ユーザはそうでない場合には使用可能なものでない場合があるデータベースクエリーをチューニング即ち調整するのに有用である場合のある直接的な知識を有している場合がある。例えば、ユーザは例えシステムが通常完全に使用されている場合であっても、例えばマルチCPU等のより多くの資源が使用可能である場合にそのクエリーが一度に実行されることを知っている場合がある。このような情報はデータベースクエリーチューニング (調整)処理期間中に非常に役立つものである場合がある。
【0005】
【課題を解決するための手段】
データベースクエリーをチューニング即ち調整する方法が、データベースクエリーを選択し、該選択したデータベースクエリーをパース即ち解析して該選択したデータベースクエリーの一部の間の関係を決定し、複数個の使用可能な最適化モードから1つの最適化モードを選択し、該決定した関係及び該選択した最適化モードに基づいて該選択したデータベースクエリーの少なくとも一部を修正することによって該選択したデータベースクエリーをチューニング即ち調整し、且つ該修正したデータベースクエリーを表示することを包含している。
【0006】
該パース即ち解析は、該データベースクエリー内のトークンを決定することが可能であり、トークンはデリミター即ち区切り記号によって分離されているワードである。該複数個の使用可能な最適なモードはコストベースモード即ちコストを基礎としたモード及びルールベースモード即ちルール (規則)を基礎としたモードを包含することが可能である。コストを基礎としたモードはFirst Rows (第一行)モード及びAll Rows(全行)モードを包含することが可能である。本方法は、更に、該調整したデータベースクエリーを使用することに関連するコストを決定することを包含することが可能である。本方法は、更に、該選択したデータベースクエリーを使用することに関連するコストと該調整したデータベースクエリーを使用することに関連するコストとを比較することを包含することが可能である。本方法は、更に、該データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つによってジョイン (join)されている少なくとも1つのサブクエリーを包含するか否かを決定するために該選択したデータベースクエリーをパース即ち解析することを包含することが可能である。本方法は、更に、該データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つを包含するか否かに基づいてチューニング即ち調整期間中に使用すべきお気に入りをユーザが選択することのプロンプトを与えることを包含することが可能である。
【0007】
該お気に入りは、NOT EXISTS演算子のNOT IN演算子への変換及び該選択したデータベースクエリーのアウタージョイン (outer join)への変換のうちの少なくとも1つをユーザが選択することを可能とするお気に入り書き直しを包含することが可能である。該お気に入りは、ALL演算子によってジョインされたサブクエリーをジョイン又はアウタージョインへ変換させることをユーザが選択することを可能とするお気に入り書き直しを包含することが可能である。該お気に入りは、NOT IN演算子によってジョインされているサブクエリーを変換するためにNOT EXISTS演算子及びアウタージョインのうちの少なくとも1つを使用するか否かをユーザが選択することを可能とするお気に入り書き直しを包含することが可能である。
【0008】
コンピュータ格納 (記憶)媒体が、データベースクエリーをチューニング即ち調整するためのコンピュータ実行可能コード、ユーザがデータベースクエリーを選択することを許容するコンピュータ実行可能コード、該選択したデータベースクエリーの一部の間の関係を決定するために該選択したデータベースクエリーをパース即ち解析するコンピュータ実行可能コード、複数個の使用可能な最適化モードから1つの最適化モードをユーザが選択することを許容するコンピュータ実行可能コード、該決定した関係及び該選択した最適化モードに基づいて該選択したデータベースクエリーの少なくとも一部を修正することによって該選択したデータベースクエリーをチューニング即ち調整するコンピュータ実行可能コード、及び該修正したデータベースクエリーを表示するコンピュータ実行可能コードを包含している。
【0009】
データベースクエリーをチューニング即ち調整するプログラムされているコンピュータシステムが、ユーザに対して少なくとも1つのデータベースクエリーを表示するディスプレイ、該表示されたデータベースクエリーの中からのデータベースクエリー及び複数個の使用可能な最適化モードからの最適化モードをユーザが選択することを許容するユーザ入力、該選択したデータベースクエリーの一部の間の関係を決定するために該選択したデータベースクエリーをパース即ち解析し且つ該決定した関係及び該選択した最適化モードに基づいて該選択した該データベースクエリーの少なくとも一部を修正することによって該選択したデータベースクエリーをチューニング即ち調整するためのプロセッサを有しており、該修正したデータベースクエリーが該ディスプレイを介してユーザへ表示される。
【0010】
【発明の実施の形態】
図面に示した本発明の開示の好適実施例を説明する上で、説明の便宜上特定の用語を使用する。然しながら、本開示はそのように選択された特定の用語に制限されるべく意図されているものではなく、各特定の要素は同様の態様で動作する全ての技術的均等物を包含するものとして理解すべきである。
【0011】
本開示は性能を向上させるためにデータベースクエリーを自動的に調整するシステム及び方法に関するものである。例えば、本システム及び方法は最適な実行プランを発生するために構造化問い合わせ言語 (SQL)ステートメント即ち文をチューニング即ち調整することが可能なデータベース管理システム (DBMS)の形態とすることが可能である。1つの側面においては、本開示はデータベース構造の文脈においてデータベースクエリーを分析し且つDBMS構造の文脈において実行することが可能であるように該クエリーを修正及び/又は再構成するシステム及び方法に関するものである。更に、本開示のシステム及び方法は、該クエリーによって使用されるDBMS資源を最小化させ且つ該クエリーが完成されることを確保するためにデータベース関係構造を使用することが可能である。
【0012】
これらの結果を達成するための1つの態様は、SQLステートメントの修正及び/又は再構成を可能とさせるカスタムデータ構造へSQLステートメントをパース即ち解析 (分解)することである。1例として、例えば、FROM句における各テーブルを、参照完全性に対してチェックし且つ、例えば、ユーザのWHERE条件に対して比較することが可能であり、且つWHERE条件は正しいアウタージョイン (outer join)仕様に対してチェックすることが可能である。
【0013】
本システムはSQLステートメントを解析し且つ各トークンを追跡し、どのようにしてテーブルがジョイン (join)されるか及びSQLステートメントの部分部分の間の関係を解析する。トークンはデリミター即ち区切り記号によって分離されたSQLステートメント内の任意のワードとすることが可能である。テーブル列名を表わすトークンはSQLステートメント内に存在するジョイン及びその他の関係を識別するために使用することが可能である。本システム及び方法は、例えば、ジョインの順番を変化させることが可能であり且つ最高の性能のためにSQLステートメントを調整するためにサブクエリーを移動することが可能である。本システム及び方法はメインフレーム、パソコン (PC)、ハンドヘルドコンピュータ等のコンピュータシステム上で稼動するソフトウエアアプリケーションの形態で実現することが可能である。該コンピュータシステムをデータベースへリンクさせることが可能である。そのリンクは、例えば、直接的なハードワイヤ又は無線接続等の直接的リンクを介して、例えばローカルエリアネットワーク等のネットワーク接続を介して、又はインターネットを介してのものとすることが可能である。
【0014】
本システム及び方法を実現することが可能なコンピュータシステムの1例を図9に示してある。大略システム200として示されるコンピュータシステムは、中央処理装置 (CPU)202、メモリ204、プリンタインターフェース206、ディスプレイユニット208、LAN (ローカルエリアネットワーク)データ送信制御器210、LANインターフェース212、ネットワーク制御器214、内部バス216及び例えばキーボード、マウス等の1個又はそれ以上の入力装置218を有することが可能である。図示した如く、システム200はリンク222を介してデータベース220へ接続することが可能である。
【0015】
図1は性能を向上させるためにSQLステートメントをチューニング即ち調整するための本開示の1実施例に基づく処理を示している。ユーザは、最初に、調整することを所望するSQLステートメントを選択する (ステップS2)。例えば、ディスプレイユニット208上に表示されるSQL編集ウインドウから、ユーザはSQLステートメントの始めにカーソルを配置させ、マウスを左クリックし且つSQLステートメントの終わりまでスクロールダウンし、次いでマウスボタンを解放させることによって調整することを所望するSQLステートメントをハイライトさせることが可能である。このことはSQLステートメントをハイライトさせる。次いで、ユーザは、例えば、適宜のボタンをクリックすることによってツールメニュー (不図示)からSQLチューナー (調整器)オプションを選択することが可能である。
【0016】
次いで、調整されるべきハイライトされたSQLステートメントは、図2に示した如く、SQLチューナーウインドウ1内に表示される (ステップS4)。次いで、ユーザはそれが調整することを所望するSQLステートメントであることを確認するために表示されているSQLステートメント2を観察することが可能である。次いで、ユーザはバック (戻り)ボタン3、次ぎへボタン4、終了ボタン5又はキャンセルボタン6をクリックするオプションを有している。戻りボタン3は前のウインドウへ戻り、ユーザが異なるSQLステートメントを選択することを可能とさせる。キャンセルボタン6は表示されているSQLステートメント2に対して何等変更をなすことなしにSQLチューナーウインドウ1から出る。次へボタン4は次のウインドウ (図3に示してある)へ移動し、後に説明するようにユーザが最適化モード設定を選択することを可能とさせる。終了ボタン5は現在の最適化モード設定を使用してSQLチューニング (調整)処理を稼動させる。
【0017】
本システムは幾つかの最適化モードを使用し、且つ幾つかの異なるお気に入り書き直しを使用して動作することが可能である。次へボタン4がユーザによってクリックされた後に、本システムはSQLステートメントをパース即ち解析 (分解)し (ステップS6)且つ図3に示したように最適化選択モードウインドウ11を表示する。SQLステートメントが、例えば、どのような演算子、機能等がそのステートメント内に存在するかを決定すべくチェックされる。本システムは、又、SQLステートメント内のサブクエリーがNOT EXISTS、NOT IN、ALL句によってジョインされているか否かを決定すべくチェックを行う。本システムは、又、テーブルスタティスティックス (統計)もチェックする。例えば、テーブルに関してANALYZEコマンドを実行する場合にオラクル等のシステムによって発生されるテーブルスタティスティックス (統計)をチェックすることが可能である。テーブルスタティスティックス (統計)は、行数 (NUM ROWS)、ハイウォーターマーク下側のデータブロック数 (例えば、現在データを包含しているか又は空であるかに拘わらずにデータを受取るべくフォーマットされているデータブロックの数)(BLOCKS)、使用されたことのないテーブルに割当てられているデータブロック数 (EMPTY BLOCKS)、バイトでの各データブロックにおける平均使用可能自由空間 (AVG SPACE)、チェーン化した行数 (CHAIN COUNT)、バイトでの行のオーバーヘッドを含む平均行長 (AVG ROW LEN)を包含することが可能である。
【0018】
充分な情報が存在する場合には (例えば、関連するデータに対するスタティスティックス即ち統計が存在する)、本システムは自動的に最適化モードを選択する。選択化された選択化モードはラジオボタン7−9によって表示される。例えば、コストを基礎とした最適化 (FIRST ROW又はALL ROWS)モードは、関連するテーブルに関してスタティスティックス即ち統計が存在する場合には良好な結果を発生するので、自動的に選択され得る。ステップS8において、本システムが最適化モードを自動的に選択するためにテーブルスタティスティックス (統計)において不充分な情報が存在しているか又はユーザが本システムによって自動的になされる最適化モード設定を変更することを所望する場合には、ユーザは、図3に示したように、最適化選択モードウインドウ11におけるラジオボタン7−9のうちの1つをクリックすることによって最適化モードを手作業により選択することが可能である。ユーザは、又、お気に入りボタン10をクリックすることによって、後に詳細に説明するように、ウインドウ11からお気に入り書き直し設定を修正することが可能である。
【0019】
1つのコストを基礎とした最適化モードはALL ROWSモードと呼称される。ALL ROWSモードは、SQLステートメントにおいて参照されているテーブルのうちの少なくとも1つに関してスタティスティックス即ち統計が存在している場合に、本システムによってデフォルトとして自動的に選択される。ALL ROWSモードはバッチ処理に対して高速のスループットを提供する。次いで、ユーザは、SQLステートメントがセットされた演算子 (例えば、UNION、INTERSECT、MINUS、UNION ALL)、GROUP BY句、FOR UPDATE句、集合 (aggregate)機能、又はDISTINCT演算子を包含するものでない限り、ラジオボタン8をクリックすることによってFIRST ROWSモードを選択するオプションを有している。SQLステートメントがセットされたオペレータ (例えば、UNION、INTERSECT、MINUS、UNION ALL)、GROUP BY句、FOR UPDATE句、集合機能、又はDISTINCT演算子を包含している場合には、ユーザ2はFIRST ROWSモードを選択するオプションは与えられない。ユーザがラジオボタン7をクリックすることによってもALL ROWSモードを手作業によって選択することが可能である。
【0020】
本システムがそのセッションに対して使用するための最適化モードをその他の態様で決定することが不可能である場合には、本システムによってFIRST ROWSモードを自動的に選択することが可能である。ライン処理に対する高速の応答時間が所望される場合には、FIRST ROWSモードを手作業によって選択することが可能である。
【0021】
別のモードは規則を基礎としたモードと呼称される。規則を基礎としたモードは、参照されたテーブルのいずれに関してもスタティスティックス即ち統計が存在しない場合に、本システムによって自動的に選択される。規則を基礎としたモードはラジオボタン9をクリックすることによって手作業により選択することが可能である。
【0022】
SQLステートメントがNOT EXISTS、NOT IN又はALL句によってジョインされたサブクエリーを包含していることがパース処理期間中に判別された場合に (ステップS6)、お気に入りボタン10がウインドウ11においてアクティブ即ち活性状態とされる (図3)。お気に入りボタン10をクリックすることは、NOT IN演算子、NOT EXISTS演算子、及びALL演算子によってジョインされているサブクリエィを書き直しためにユーザがお気に入り書き直しを使用することを特定することを可能とする。
【0023】
例えば、NOT EXISTS演算子に対するお気に入り書き直しを特定することが可能であり、その場合にユーザがNOT EXISTS演算子のNOT IN演算子への変換及び/又は該ステートメントのアウタージョインへの変化を選択することを可能とする。ALL演算子に対するお気に入り書き直しを特定することが可能であり、その場合にユーザが該ステートメントのジョイン又はアウタージョインへの変換を選択することを可能とする。NOT IN演算子に対するお気に入り書き直しを特定することが可能であり、その場合にユーザがNOT IN演算子のNOT EXISTSへの変換又は該ステートメントのアウタージョインへの変換を選択することを可能とする。
【0024】
周辺のインターフェース列がNOT NULLとして定義されているインスタンスへの変換を制限するオプションを選択することによって書き直しに対しユーザによりお気に入りを更に定義することが可能である。
【0025】
本システムが、常に、必要である場合に該ステートメントに対してIS NOT NULL基準を変換及び付加することをユーザが特定することも可能である。
【0026】
お気に入りボタン10がユーザによってクリックされると、図4に示したようにお気に入りウインドウ50が表示される。次いで、チューナータブ51をクリックすることによってSQLチューナーお気に入り頁52を表示させることが可能である。このウインドウにおけるオプションは、演算子ALL、NOT IN、NOT EXISTSによってジョインされているサブクエリーに対して上述したようにお気に入り書き直しをユーザが設定することを可能とする。
【0027】
図4において示した例においては、NOT EXISTS演算子に対するお気に入り書き直しを設定するために、ユーザはプルダウンメニュー53からNOT EXISTS演算子を選択する。これはNOT EXISTS演算子に対して使用可能なオプションのリストを表示する。例えば、次いで、ユーザは、「NOT EXISTS演算子を介してジョインされているサブクエリーをNOT INへ変換」(チェックボックス55)「NOT EXISTS演算子を介してジョインされているサブクエリーをアウタージョインへ変換」(チェックボックス56)のオプションに対する適宜のチェックボックスを選択するか又は選択しないことによりNOT EXISTS演算子によってジョインされているサブクエリーを変換するためにNOT IN及び/又はアウタージョインを本システムが使用することを可能とするか否かを特定することが可能である。「NOT EXISTSを介してジョインされているサブクエリーのNOT INへの変換」(チェックボックス55)オプションが選択されると、オプションボックス57及び58がアクティブとなる。オプションボックス57はユーザが「アウタークエリーにおけるジョインされた列に関するNOT NULL条件に対するチェック」オプションを選択することを可能とし、且つオプションボックス58はユーザが「サブクエリー内のジョインされた列に関しNOT NULL条件に対するチェック」オプションをユーザが選択することを可能とする。ユーザは、チェックボックス59及び60を夫々選択するか又は選択しないことによりこれらのオプションの一方又は両方を選択することが可能である。次いで、各選択されたオプションボックスに対して変換オプションがアクティブとなる。例えば、ラジオボタン61及び63を夫々クリックすることによって「列がNOT NULLとして定義されている場合にのみ変換」をアウタークエリー及びサブクエリーに対して選択することが可能であり、且つラジオボタン62及び64を夫々クリックすることによって「常に変換及び必要な場合に「IS NOT NULL」を付加」を選択することが可能である。次いで、ユーザは、特定したお気に入りを保存し且つお気に入りウインドウから出るために「OK」ボタン54をクリックすることが可能である。キャンセルボタン66を選択することは、お気に入りに対してなされた変更に保存することなしにウインドウ52から出る。ヘルプボタン65を選択すると、ユーザに対してヘルプメニューを表示する。
【0028】
同様の態様で、ALL演算子に対するお気に入り書き直しを設定するために、ユーザはプルダウンメニュー53から「ALL演算子」を選択してオプションのリストを表示する。次いで、「ALL演算子を介してジョインされているサブクエリーをジョイン又はアウタージョインへ変換」オプションを選択するか又は選択しないことにより本システムがALL演算子によってジョインされているサブクエリーをジョイン又はアウタージョインへ変換することを可能とするか否かを特定するオプションがユーザに提示される。
【0029】
ユーザがこのオプションを選択すると、次いで、「アウタークエリーにおけるジョインされた列に関するNOT NULL条件に対するチェック」及び「サブクエリーにおけるジョインされた列に関するNOT NULL条件に対するチェック」に対するオプションがユーザに提示される。次いで、ユーザはこれらのオプションのうちの一方又は両方を選択することが可能である。選択されたこれらのオプションの各々に対して、次いで、「列がNOT NULLとして定義されている場合にのみ変換」及び「常に変換及び必要な場合に「IS NOT NULL」を付加」の2つの変換オプションがユーザに提示される。
【0030】
次いで、ユーザは「OK」ボタンをクリックして特定したお気に入りを保存し且つお気に入りウインドウから出ることが可能である。
【0031】
NOT IN演算子に対するお気に入り書き直しを設定するために、ユーザはプルダウンメニュー53からNOT IN演算子を選択してオプションのリストを表示する。次いで、ユーザは、「NOT IN演算子によってジョインされたサブクエリーをNOT EXISTSへ変換」及び「NOT IN演算子を介してジョインされたサブクエリーをアウタージョインへ変換」のオプションを選択するか又は選択しないことによりNOT IN演算子によってジョインされたサブクリエィを変換するために本システムがNOT EXISTS演算子及び/又はアウタージョインを使用することを可能とするか否かを特定することが可能である。
【0032】
選択された各オプションに対して、次いで、アウタークエリーにおけるジョインされた列に関するNOT NULL条件に対してチェックし且つサブクエリーに対するジョインされた列に関してNOT NULL条件をチェックするためのオプションがユーザに提示される。ユーザはこれらのオプションのうちの1つ又は両方を選択することが可能である。次いで、各選択されたオプションに対して変換オプションがアクティブとなる。即ち、列がNOT NULLとして定義されている場合にのみ変換すること又は常に変換し且つ必要である場合に「IS NOT NULL」を付加することのオプションがユーザに与えられる。従って、アウタークエリー及び/又はサブクエリーに関してジョインされた列に対する変換オプションをユーザが選択することが可能である。ユーザは「OK」ボタン54をクリックして特定したお気に入りを保存し且つお気に入りウインドウから出る。お気に入りウインドウから出ると、ディスプレイは最適化モード選択ウインドウ11 (図3)ヘ戻る。ステップS8が完了し且つユーザが最適化モード及びお気に入り選択に満足した後に、本処理は次へボタン8をクリックすることによって継続して行うことが可能である。
【0033】
ステップS10において、本システムは参照完全性、アウタージョイン及び/又はNULL論理問題に対してSQLステートメントをチェックする。エラー又は非効率性が見つかると、その問題を矯正するためにSQLステートメントを変更する特定の提案が表示される。例えば、無効な結果組を発生することが可能な無効なアウタージョインに対して提案を表示することが可能である。無効な結果組を発生するNULL論理問題、HAVING句の正しくない使用、カーテシアン (cartesian)プロダクト即ち直積、より良いインデックスの利用のためのジョイン基準における表現、より良いインデックスの利用に対する非ジョイン基準における表現、及びインデックスされていないフォーリン (foreigen)キー即ち外部キー等に対して提案を表示することも可能である。
【0034】
ステップS12において、図5に示したようなSQLチェックウインドウ70がユーザに対して表示される。ウインドウ部分73はそのステートメントにおける各サブクエリーのダイアグラムを表示する。SQLステートメントにおける各テーブルはテーブル名及びエイリアスを包含するヘッダーを具備するボックスとして表示される。プライマリィ (primary)キー、フォーリンキー及びユニークキーも各テーブルに対して表示される。
【0035】
テーブル間の緑色の線は正しいジョインを表わす。赤色の線がテーブルを接続する場合には、そのジョインがエラーを包含している (例えば、参照完全性侵害又は不適切なアウタージョイン)。青色の線がテーブルを接続する場合には、そのジョインは参照完全性を欠如するために非効率的である。
【0036】
SQLステートメントに対して提案された補正がウインドウ部分71内に表示される。ウインドウ部分のいずれかに包含される情報の全てを見るために所望によりユーザによってSQLチェックウインドウ70の寸法を変更することが可能である。
【0037】
「次のSQLモジュール」ボタン72及び「前のSQLモジュール」ボタン74をクリックするとSQLステートメントにおける個々のサブクエリーを青色でハイライトし且つハイライトされたサブクエリーの関連するダイアグラムのみを表示する。
【0038】
次いで、ユーザはオリジナルのステートメントか又は固定されたステートメントのいずれかのSQLステートメントを調整するかを決定することが可能である (ステップS14)。例えば、「オリジナルのSQLを調整」ボタン76をクリックするとSQLチェックウインドウ70の底部におけるフィールド75内に表示されるオリジナルのSQLステートメントを調整する。「固定したSQLを調整」ボタン78をクリックすると、SQLチェックウインドウ71の右側におけるフィールド71内に表示される提案された補正を実施し、次いで、補正したSQLステートメントを調整する。
【0039】
ステップS16において、そのステートメントを最適化させるために1つ又はそれ以上のステップを実施することによって選択されたSQLステートメントを調整する。例えば、本システムはジョイン基準において推移的変化を行うことが可能であり、全てのサブクエリー変換 (トランスフォーメーション)を決定することが可能であり、必要である場合には非ジョイン基準において推移性を決定することが可能であり、且つジョイン順番を決定することが可能である。本システムは幾つかの変換したSQLステートメントを発生することが可能である。次いで、本システムは変換したSQLステートメントのうちでどれが最善の性能を有しているかを決定することが可能でありその結果得られるSQLステートメントをソートすることが可能である。
【0040】
SQLステートメント (チューニング)又は変換する場合に、本システムは周りのクエリーの列が同一のテーブルに属するか否かを判別するためにチェックし、必要である場合には推移的変化を行うことが可能である。それが同一のテーブルに属するものでない場合には、本システムは、ジョイン基準のどれかがそのサブクエリーをインターフェースする列を参照するか否かを判別するためにチェックし且つその等価な列を識別する。本システムはそのサブクエリーとインターフェースする各列に対してこのことを行い、次いで、遷移的特性を使用して列の全てが同一のテーブルに属するセット即ち組を見つけようとして等価な列の順列を発生する。本システムは、NOT IN演算子を介してジョインされた非相関型サブクエリー及びNOT IN、NOT EXISTS、又はALL演算子でインターフェースされた相関型サブクエリーに対して推移的変化を行うことが可能である。
【0041】
本システムは、又、各サブクエリーを評価し且つそのトランスフォーメーション即ち変換の各々に対してランクを割当てることによってSQLシンタックスに対して実施することが可能な全てのサブクエリー変換 (トランスフォーメーション)を決定することが可能である。トランスフォーメーション即ち変換は強制的 (常にそうであるか又はそうでない)又はオプションとすることが可能である。次いで、この情報を使用して種々の代替的SQLバージョンを発生する。例えば、SQLステートメントが4個のサブクエリーを包含している場合には、本システムはサブクエリーのどれにも「常に変換 (always transform)」とはせず、1つを「決して変換せず(never transform)」とし、且つ3個を「オプション(option)」としてランク付けを行い可能な代替的SQLステートメントを発生することが可能である。
【0042】
即ち、トランスフォーメーション即ち変換のタイプが、その変換が常に行われるべきであるか、決して行われるべきでないか、又はオプションによって行われるべきであるかを決定する。例えば、変換が行われた場合にはオプティマイザー (最適化器)がより良いプランを使用するのでいつくかの変換が望ましい場合がある。この場合には、その変換は常に行われるべきである。従って、その変換には最も高いランクが割当てられる。変換が行われた場合にはオプティマイザー即ち最適化器がより効率の悪いプランを使用するのである変換は望ましいものでない場合がある。この場合には、その変換は行われるべきではない。従って、その変換には最も低いランクが割当てられる。ある変換はその他のファクターにも依存する場合があるので、より良い最適化プランが選択されることとなる場合とならない場合とがある。この場合には、その変換はオプションによって行うことが可能である。従って、その変換には中間のランクが割当てられる。
【0043】
サブクエリー (subquery)変換を実施した後に、本システムは互いに置換させることが可能な非ジョイン基準 (non−join criteria)における等価な列を識別し且つ置換を行う。このことはデータベース (例えば、オラクル等)が連結したキーインデックスを利用することを可能とするためにSQLステートメントを本システムが書き直すことを可能とする。
【0044】
例えば、以下のSQLステートメントにおいて、DEPENDENTSのサブクエリーに関するe.emp seq基準はa.emp seq又はt.emp seqへインターフェースさせることが可能である。
【0045】
【表1】
【0046】
以下に示すようにe.emp seqをe.emp seqへスイッチすること (行5)は、データベースがASSIGNMENTSに関して連結されたキーインデックスを使用することを可能とする。
【0047】
【表2】
【0048】
列を等価させる等価ジョイン基準が存在する場合には、種々の列は別の列を置換させることが可能である。然しながら、本システムは、又、ジョイン基準とAND処理される非ジョイン基準に対する推移性を使用することが可能である。非ジョイン基準がジョイン基準とOR処理される場合には、その結果発生する推移性は使用すべきではない。
【0049】
マルチ列オペランド (被演算子)が推移性 (transitivities)を有している場合には、本システムはその列をオペランドへ付加し、且つ選択リスト上に対応する列を複製する。全てのマルチ列推移性がオリジナルのステートメントを除いて、各変換して使用される。そのオペランドがアウタージョイン型基準を介して別の列と等価である場合には、その等価な列を使用することは不可能である。
【0050】
FROM句が、GROUP BYシンタックス又は集合体を有することのない入れ子選択ステートメントを有しており且つメインクエリーがそのメインクエリーと入れ子選択の間のジョイン列のうちの1つを参照する非ジョイン基準を有している場合には、本システムはオリジナルを包含するSQLステートメントの全てのコピーにおいて入れ子選択ステートメントにおける非ジョイン基準を複製する。
【0051】
本システムはジョインの順番を決定するためにORDEREDヒントを使用することが可能である。ORDEREDヒントは、SQLステートメントにおけるFROM句においてそれらが表われる順番にオプティマイザーをして強制的にテーブルをジョインさせる。このことは、特定の順番でFROM句において参照されるテーブルをジョインするようにSQLステートメントが書かれることを可能とする。本システムは、最初に、ORDEREDヒントなしでSQLステートメントをテストする。次いで、本システムは、特定のジョイン順番を強制するための異なるドライビングテーブルでORDEREDヒントを使用して付加的な順列を作成し、尚ドライビングテーブルは、例えば、入れ子ループジョイン操作におけるペアレントテーブルである。ドライビングテーブルからの各行は、ジョイン操作を完了するためにジョインさせたテーブルにおけるマッチングする行を見つけるために使用することが可能である。
【0052】
変換したSQLステートメントのデフォルトのジョインがオリジナルのSQLステートメントよりも良好なコスト/行値を有している場合には、ORDEREDヒントがより効率的なプランを発生する蓋然性が最も高いが、デフォルトのジョイン順番での初期的な変換よりもより高いコスト/行である。本システムは可能な最善の解決としてORDERED変換を表示することが可能である。
【0053】
作成された代替的SQLステートメントの各々の中から最善の性能を決定するために、本システムはオリジナルのSQL及び書き直し処理によって発生されたSQLステートメントの各々に対してコストスタティスティック (費用統計)を発生する。そのSQLと関連するプランを作成した後にコストが決定される。例えば、オラクルのEXPLAIN PLANステーメントは、オプティマイザー (最適化器)がそのSQLステートメントを実行するために使用するプランを発生するために使用することが可能である。そのEXPLAIN PLANステートメントはオプティマイザー (最適化器)がそのSQLステートメントを実行するために使用する計画であるステップを記述する実行プランを得るためにSQLステートメント上で稼動させることが可能である。オラクルは、又、そのプランにおける各ステップに対する数 (例えば、コスト)を提供する。そのコストはそのプランにおけるステップを実行するための相対的な利用数である。そのプランに対する全体的なコストに到達するためにそのプランにおけるステップの全てに対してコストを加算することが可能である。本システムはデータベースによって計算されたコストを行数によって割算してSQLステートメントの各々に対してコスト/行の値を発生することが可能である。コストは、又、そのプランによって必要とされる論理的読取数によって決定することが可能である。コストを決定した後に本システムは昇順で (最低コストから最高のコストへ)SQLステートメントをソートする。
【0054】
ステップ (S18)において、本システムは図6に示したような結果ダイアログウインドウ90内に最低のコストを有するSQLステートメント及びオリジナルのSQLステートメントを表示する。オリジナルのSQLステートメントはウインドウ部分92内に表示され且つ提案された代替的SQLステートメントはウインドウ部分94内に表示される。次いで、ユーザは提案された代替的SQLステートメントをオリジナルのSQLステートメントと比較し、その違いを検査し、次いでオリジナルのSQLステートメントを調整したSQLステートメントで置換することを所望するか否かを選択することが可能である。
【0055】
次いで、置換SQLボタン100をクリックすると、オリジナルのSQLステートメントをウインドウ94内に示されている提案された代替的SQLステートメントと置換させる。本システムは、図7に示したように、コメントを付加し且つ調整したSQLステートメントを編集即ちチューニング (調整用)ウインドウ104内に表示する。図7に示したように、該コメントはデータスタンプ、そのステートメントがチューニング即ち調整されたことを表わし且つ使用した最適化モード (この例においてはALL−ROWS)を識別する情報を包含することが可能である。戻りボタン96をクリックすると前のウインドウへ戻る。より詳細ボタン98をクリックすると図8に示したように詳細結果ウインドウ106が開かれる。調整されたSQLステートメントがウインドウ部分108内に表示される。行110はオリジナルのSQLステートメントに対するコストスタティスティックス即ち費用統計を表示し且つ1個又はそれ以上の行112が調整した代替的SQLステートメントに対するコストスタティスティックス即ち費用統計を表示する。これらのスタティスティックス即ち統計は、SQLを実行するのに必要とされる時間の量 (秒単位)である経過時間114、SQLを実行するのに必要とされる毎秒CPUサイクル数であるCPU時間116、SQLを実行するのに必要とされる論理的読取数であるLog読取118、SQLを実行するのに必要とされる物理的読取数である物理的読取120、を包含することが可能であり、行122はSQLがリターンする行数であり且つコスト/行124はデータベースとのコストを行数で割算したものである。
【0056】
詳細結果ウインドウ106はユーザがその必要性に最も適したSQLを選択することを助けるために各ステートメントに対するコストスタティスティックス (費用統計)をユーザが見ることを可能とする。ユーザは、又、更なる編集のためのエディター機能を包含するシステムにおいてその調整したステートメントを開くことを選択することが可能である。
【0057】
そのSQLにおいてバインド変数が存在している場合には、「Bind (バインド)」ボタン126をクリックすると、そのSQLステートメントを実行する前にその変数に対する値をユーザが特定することが可能なダイアログが表示される。「実行」ボタン128をクリックすると、その選択したステートメントに対するスタティスティックス即ち統計を発生する。「全て実行」ボタン130をクリックすると、リストされている全てのSQLステートメントに対するスタティスティックス (統計)が発生される。ユーザは「印刷」ボタン132をクリックして現在ウインドウ内に表示されている情報を印刷させることが可能である。ユーザは「保存」ボタン134をクリックしてこのウインドウ内の情報を将来の参照のためにテキストファイルとして保存することが可能である。ユーザは該テーブル内の代替的SQLエントリを選択し且つそのコードをプランナーウインドウ内に表示させるために「PAFO」 (オラクル用プランアナライザー)ボタン138をクリックすることが可能である。
【0058】
「SQL置換」ボタン140をクリックすると、オリジナルのSQLが調整されたSQLで置換される。「戻り」ボタン136をクリックすると結果ウインドウ90 (図6)ヘリターンする。「キャンセル」ボタン144をクリックすると、オリジナルのSQLを変化させることなしに本システムから抜け出る。
【0059】
以下の記載部分は、SQLステートメントをチューニング即ち調整するために本システムによって使用される概念の幾つか及びSQLステートメントのパーツ又は属性を参照するために本明細書全体にわたって使用される種々の用語をリストし且つ説明している。これらの用語はSQLステートメントを調整するために本システムによって使用されるアルゴリズムを説明する本明細書全体にわたって使用されている。
【0060】
A.ブランチ及びネスティングのレベル
クエリー (query)がサブクエリー (subquery)を有している場合には、上部 (メインクエリー)から底部へのパス (path)即ち経路は「ブランチ (branch)」である。「ネスティング (nesting)のレベル」はそのブランチにおけるサブクエリーの数である。メインクエリーは「レベル」=1において考えられるものである。そのすぐ下側のサブクエリーは「レベル」=2にあり、以下同様である。以下のSQLについて検討する。引用を容易にするために行番号が付加されている。
【0061】
【表3】
【0062】
ブランチはメインクエリーLEVEL=1 (行1で開始)からLEVEL=2 (行3で開始)へ、且つLEVEL=3最後のサブクエリー (行7で開始)へ延在している。この例における「ネスティングのレベル」は2である。何故ならば、メインクエリーは1個のサブクエリーを有しており且つそのサブクエリーは1個のサブクエリーを有しているからである。以下のSQLステートメントは2個のランチを包含している。
【0063】
【表4】
【0064】
このSQLステートメントにおける最初のブランチは前の例におけるものと同じである。然しながら、このSQLステートメントは2番目のブランチを有している。メインクエリー (それは行1上で開始)はレベル1である。レベル2は行11上で開始している。この2番目のブランチは1に等しいネスティングのレベルを有している。
【0065】
B.最上のペアレントブール演算子
OR演算子がWHERE句内に存在する場合には、サブクエリーをFROM句内にマージ又は移動する前に注意すべきである。そのORがペアレントブール演算子である場合には、そのマージ又は移動が行われるべきではない。以下の例がこの点を例示している。
【0066】
SQLステートメントに対し
【表5】
【0067】
このOR演算子を考慮しなかった場合には、サブクエリーは以下の如くにマージされる場合がある。
【0068】
【表6】
【0069】
然しながら、そのサブクエリー内にジョイン用の行が存在しない場合には、そのジョイン (join)はカーテシアンプロダクト (Cartesian product)即ち直積となる。例えば、基準「e.emp seq=x.emp seq」がFALSE (偽)に評価されるが非ジョイン基準がTRUE (真)に評価されると、そのサブクエリーからの行はとにかくジョインされる。その特定のEMPLOYEES行に対して、そのサブクエリーからのどの行がジョインされるかに拘わらず、非ジョイン基準は常にTRUE (真)に評価する。このことはカーテシアンプロダクト即ち直積を形成する。
【0070】
以下の例は、NOTが基準に先行する場合にはこの問題が更に困難なものとなる場合があることを例示している。
【0071】
例えば、以下のSQLステートメントが与えられると、
【表7】
【0072】
ドモルガンの定理を使用して、該NOTは包含されているブール及び関係演算子を逆転させる。然しながら、本システムはドモルガンの定理を使用することによってこのNOT演算子を取除くことが可能であり、その結果以下のSQLとなる。
【0073】
【表8】
【0074】
逆転されたブール及び関係演算子は下線を付けてある。この逆転を最初に行うことは処理を簡単化させる場合がある。
【0075】
C.マルチSQLモジュールに対する相関
相関型サブクエリーは以下の例に示したように1つを超えるSQLモジュールに対して相関させることが可能である。
【0076】
【表9】
【0077】
TIME SHEETS (行6)に関するサブクエリーは周囲の即ち取囲むクエリー (ASSIGNMENTSに関し)且つEMPLOYEESに関するメインクエリー (行8を介し)の両方に対して相関されている (行7を介し)。
【0078】
D.相関基準
上のSQLステートメントにおいて、行7及び8に関する基準は「相関基準(correlation criteria)」と呼ばれる。これらの基準は「ジョイン基準 (join criteria)」ではないが、サブクエリーが実行される場合にそのクエリーの外側の参照 (例えば、「e.emp seq」又は「a.proj seq」)が定数であるような意味においてより「非ジョイン基準」のようなものである。
【0079】
相関基準は、等値演算子を使用することを確保するためにルーチンにおいてチェックすることが可能である。然しながら、このようにしてチェックされるべき相関基準は、独特のインデックスを有する列に対応するものであることに注意すべきである。例えば、以下のクエリーはそのサブクエリーにおいて2つの相関基準を有している。然しながら、問題となるものはPROJ SEQに関するものに過ぎない。何故ならば、これが独特のインデックスを有する列だからである。
【0080】
【表10】
【0081】
E.非ジョイン基準
SQLステートメントにおいて、その下側のコードが非ジョイン基準を参照する場合には、関係演算子が「=」である基準を探しており、且つその他の演算子は定数か又はサブクエリーのいずれかである。そのサブクエリーに関する仮定は、ユーザが関係演算子として「=」を特定したので、そのサブクエリーは高々単一の行をリターンせねばならず、それは定数を意味している。
【0082】
以下のものは無効なWHERE句の例である。
【0083】
WHEREcol1=10+col2
WHEREcol1>10
以下のものは有効なWHERE句の例である。
【0084】
WHEREcol1=10
WHEREcol1=(select col2 from tab1)
WHEREcol1=:Bind Variable
F.ジョイン基準
ジョイン基準を以下に参照する。各場合において、関係演算子は「=」とすべきであり、且つ該基準の各側は単一列名とすべきであって表現とすべきではない。
【0085】
G.サブクエリーインターフェース
周囲のクエリーとサブクエリーとの間のインターフェースは、典型的に、例えば「in」、「=」、「not exists」等の少なくとも1個の「関係演算子」を包含している。EXISTS及びNOT EXISTS関係演算子を除き全てに先行するものは1つ又はそれ以上の列である。該演算子に先行する列は「インターフェース列」と呼ばれる。サブクエリーの対応するSELECTリスト内の列も「インターフェース列」と呼ばれる。これら2つのタイプの「インターフェース列」はそれらが周囲クエリーか又はサブクエリーに対するインターフェース列であるか否かによって区別することが可能である。
【0086】
該列がそのサブクエリー内のオブジェクトに属するものでなく且つ、以下に例示したように、そのサブクエリー内のテーブルに属する列のいずれとも相関するものでない場合がある。
【0087】
【表11】
【0088】
列「e.hiredete」 (行4)はサブクエリー (ASSIGNMENTSテーブル)に属するものではなく且つASSIGNMENTS内の列のいずれとも相関するものではない。この文書は周囲クエリーのこれらの列を「フォーリン (foreign)」即ち外部として言及する。1つの列がフォーリン即ち外部である場合には、本システムはそれを非相関型サブクエリーとマージ又はそれへ変換しようと試みる。然しながら、本システムはそのサブクエリーを移動させようとはしない。
【0089】
H.お気に入り (Preferences)
SQLステートメントを変換する場合にヌル (NULL)論理は多数の問題を提起する場合がある。ある列が周囲クエリーにおいてヌルとなることが可能である場合には、変換された場合に異なる結果組が表われる場合がある。その変換は、性能の点では小さなコストが存在する場合があるが、このことが発生しないことを確保するために修正することが可能である。その修正は基準をAND処理することであり、その列がヌルとなることが不可能であることを特定する (例えば、col is not null)。その基準はオリジナルの基準を満足する各行に対して有効なものとされねばならないので、僅かなコストが存在する。一方、ある場合においては、例えばオラクルのオプティマイザー等のオプティマイザー即ち最適化器がアンチジョイン (anti−join)即ち逆結合を実施することが可能であるので、性能が改善する場合がある。これらのプリファランス (preferences)即ちお気に入りが以下のアルゴリズムにおいて参照される。
【0090】
I.エイリアス
サブクエリーがFROM句マージ又は移動されると、周囲クリエィにおける基準が、例えば、以下の例を参照することにより示されるように、エイリアスを介して完全に識別すべきである。
【0091】
【表12】
【0092】
この例においては、エイリアスをEMPLOYEESに対して付加すべきであり、且つそのエイリアスはそのテーブルに関連する全ての列に先行すべきである。さらに、そのサブクエリーにエイリアスが与えられるべきである。EMPLOYEESに対して「e」エイリアスを付加すると、その変換は以下の如くである。
【0093】
【表13】
【0094】
サブクエリーが集合体 (aggregate)を包含している場合には、FROM句内へ移動される前にエイリアスが与えられるべきである。例えば、以下のSQLステートメントはそのサブクエリーにおいて「max」集合体関数を包含している (行3)。
【0095】
【表14】
【0096】
従って、以下の如くに集合体「MAX(EFFECTIVE DATE)」にエイリアスを与えるためにSQLステートメントを変換すべきである。
【0097】
【表15】
【0098】
暗示的な知識を介して独特なセット (組)をリターンすることが知られているサブクエリーにユーザがフラッグを立てることを可能とするか否かの問題が発生する。例えば、
【表16】
【0099】
は以下の如くに変換することが可能であり、
【表17】
【0100】
又は、以下の如くに変換することが可能である。
【0101】
【表18】
【0102】
両方の場合が可能である。何故ならば、該サブクエリーにおける低レベルテーブルはPROJ SEQ及びEMP SEQに関しPKを有しているからである。UNQインデックスも有しているNAMEに関する等値性のために、推移性はPROJ SEQに関して等値性が存在していると言うことを可能とする。従って、該サブクエリーはEMPLOYEES行当たり1つの行を発生することが保証され、そのことはマージが可能であることを意味する。
【0103】
本システムによって使用される用語及び概念の幾つかにおいて説明したので、以下の例はSQLステートメントを変換するために本システムによって使用することが可能なアルゴリズムを説明する場合の助けとなる。例が相関型及び非相関型サブクエリーに対して示されており且つそのようなものとして識別される。非相関型サブクエリーは、メインクエリーに対して相関されていないサブクエリーである。即ち、非相関型サブクエリーは、メインクエリーによっていずれかの行が検査される前に、論理的に実行させることが可能である。換言すると、サブクエリーはメインクエリーとは独立的であり且つ独立して1つのクエリーとして存在することが可能である。一方、相関型サブクエリーはメインクエリーによって検査される行に依存する。
【0104】
1.以下のSQLステートメントは相関型サブクエリーと非相関型サブクエリーとの混合したものである。以下のSQLステートメントにおいては、最後のサブクエリーはスカラーサブクエリーであり、且つ周囲サブクエリーはPROJ SEQ及びRTP DATEに関して等値基準を有しており且つEMP SEQ列は選択リスト上にあるので、そのサブクエリーは、SAL HISTORY上のサブクエリーが不可能な場合であっても、マージさせることが可能である。これはFROM句における入れ子 (ネスト型)クエリーがスカラーとして正確に識別されたか否かの良好なテストである。
【0105】
【表19】
【0106】
は以下の如くに変換されるべきである。
【0107】
【表20】
【0108】
2.以下の例は非相関型であり且つすぐ前の例とは僅かに異なっている。基本的な差異はSAL HISTORYに関するサブクエリーである。この場合には、サブクエリーは、初期的に、潜在的に複数個の行をリターンするものと決定される。このことは、オリジナルのクエリーにおいてはランタイムエラーが発生する可能性があることを意味する。このことは該サブクエリーをマージ又は移動することを阻止する。即ち、SAL HISTORYに関するサブクエリーはそのまま残存すべきである。然しながら、RPT DATEに関する基準は等値演算子を有しているので、該サブクエリーとTIME SHEETSとのマージは未だに発生することが可能であり、且つそれは未だに同一のランタイムエラーに遭遇する蓋然性がある。還元すると、SAL HISTORYに関するサブクエリーは移動されることはない。何故ならば、それはスカラーセット (組)を発生することを保証することが不可能だからである。然しながら、そうである場合には、それは「rpt date= 」基準に対し単一の定数値となる。本システムは該サブクエリーを定数と等価であるとして認識し、周囲クエリーがその周囲のクエリーとマージし且つ入れ子 (ネスト型)選択を続行することを可能とする。
【0109】
例えば、以下のSQLステートメント、
【表21】
【0110】
は以下のものへ変換すべきである。
【0111】
【表22】
【0112】
3.以下の例は相関型であり且つALL演算子を取扱う。サブクエリーがいずれの行もリターンするものでない場合には、該基準はTRUE (真)と評価することが可能である。このことは、サブクエリーが移動されるだけであり且つアウタージョインとして行われるべきであることを意味し、その場合にアウタージョインシンタックスのみが初期的相関基準に対して適用されるに過ぎない。比較されるオリジナルの列はジョインマッチなしを考慮に入れるものでなければならない。付加される最終的な基準はアウタージョインが行われた後に評価される。
【0113】
例えば、以下のSQLステートメント、
【表23】
【0114】
は以下のものへ変換することが可能である。
【0115】
【表24】
【0116】
本システムは、新たにアウタージョインした基準のいずれかが何かとOR処理されるか否かを決定すべくチェックすべきである。何故ならば、それはパースエラーを発生するからである。その変換が行われるべきであったか否かを判別するためにデータベースをしてその中間解をパース即ち解析させることが望ましい場合がある。それが行われるべきでなかった場合には、そのサブクエリーについて何も行われるべきではない。
【0117】
4.以下のクエリーは非相関型であり且つGROUP BYシンタックスを有するサブクエリーを取扱う。該サブクエリーはGROUP BY句を有するものであっても、SELECTリストはGROUP BYリスト上の列の各々を包含するものではない。このことは、DISTINCTキーワードが該サブクエリーのSELECTリストに付加されない限り、複製に対しての可能性が存在することを意味している。
【0118】
例えば、以下のSQLステートメント、
【表25】
【0119】
は以下のものへ変換することが可能である。
【0120】
【表26】
【0121】
5.SQLステートメントは集合体のみを包含するが、GROUP BY句を包含するものでない場合がある。従って、それはDISTINCTキーワードを必要とすることはない。この例は非相関型である。
【0122】
以下のSQLステートメント、
【表27】
【0123】
は以下のものに変換することが可能である。
【0124】
【表28】
【0125】
6.以下の例は非相関型であり且つ周囲クエリーを移動する場合にNOT IN演算子を取扱う場合を例示している。基本的な点は、本システムがアウタージョインへ変換し、次いで、「アウタージョインされた行」である行を探し出すことである (例えば、サブクエリーIS NULLの選択リスト上のヌル不可能な列 (以下の「x.col1 is null」基準参照))。解決は例えば1等の定数を選択リストへ付加することである。何故ならば、それはサブクエリーがGROUP BYシンタックスを有しているか否かに拘わらずに動作するからである。
【0126】
例えば、以下のSQLステートメント、
【表29】
【0127】
は以下のものへ変換することが可能である。
【0128】
【表30】
【0129】
7.以下の例は上の例6と同様であり、且つ、非相関型である。然しながら、この例においては、複数個の列がサブクエリーに対してインターフェースされる。更に、該列は周囲クエリーにおける複数個のテーブルを表わしている。この例においては、変換がパースするものではないので問題に遭遇する場合がある。エラーメッセージが発生される場合があり、即ち「ORA−01417:テーブルが高々他の1つのテーブルへアウタージョインされた可能性がある」。その理由は、XがEMPLOYEES及びDEPENDENTSへアウタージョインされるからである。従って、この変換は、関係演算子がアウタージョインを必要とするが、そのサブクエリーとインターフェースする列が複数個のテーブルからのものである場合に、行われるべきではない。
【0130】
例えば以下のSQLステートメント、
【表31】
【0131】
は誤って以下のものに変換される場合がある。
【0132】
【表32】
【0133】
8.以下の非相関型の例は興味があるがおかしな状態を与える。この状態は滅多に見られるものではないが、理論的には、発生することが可能である。その理由は以下のサブクエリーは非相関型であるが、EXISTS演算子で周囲クエリーとインターフェースされているからである。EXISTS演算子は、通常、相関型サブクエリーと共に使用されるに過ぎない。いずれの場合においても、この変換は簡単であり、単にそれをジョイン句なしで周囲クエリーへ移動し、且つ以下に示した如く基準「ROW NUM=1」を該サブクエリー内に付加するに過ぎない。
【0134】
例えば、以下のSQLステートメント、
【表33】
【0135】
は以下のものへ変換することが可能である。
【0136】
【表34】
【0137】
性能はオリジナルのSQLステートメントの場合よりも変換したSQLステートメントの場合に著しく良好である。何故ならば、そのサブクエリーは、オリジナルのSQLステートメントにおいて実施されるように行毎に一度ではなく単に一度実行されるに過ぎないからである。
【0138】
9.以下の例は非相関型であり、且つ該サブクエリーは同一の名前で1つを超える列名を包含しているのでリストしてある。列名がテーブルエイリアスによって先行されている場合であっても、列名にはエイリアスが与えられるべきである。又、周囲 (外部)クエリーのSELECTリスト上のアステリスクは周囲 (外部)クエリーにおける各テーブルに対して複製されるべきである。下に示した変換において下線を付けた項目に注意。
【0139】
SQLステートメント、
【表35】
【0140】
を以下のものへ変換することが可能である。
【0141】
【表36】
【0142】
10.以下の例は非相関型であり且つスカラーサブクエリー及びNOT IN演算子を例示している。サブクエリーはスカラーであるので、それはアウタージョインとして周囲のものとマージさせることが可能である。そのキーは「アウタージョインした」行のみを維持することである。このことは、IS NULL演算子及び該サブクエリーにおけるテーブルのヌルでない列を有する基準とAND処理することによって達成することが可能である。より良好な解決法は、ROWIDを使用することである場合がある (以下の2番目の変換参照)。
【0143】
例えば、
【表37】
【0144】
を以下のものへ変換することが可能であり、
【表38】
【0145】
又は以下のものへ変換することが可能である。
【0146】
【表39】
【0147】
11.以下の相関型の例は相関基準及び非ジョイン基準の両方を包含している。サブクエリーは独自性を保証するので、サブクエリーをマージすることが可能である。
【0148】
例えば、SQLステートメント、
【表40】
【0149】
は以下のものへ変換することが可能である。
【0150】
【表41】
【0151】
12.以下の相関型の例は異なるものである。何故ならば、SELECTリストは周囲 (外部)クエリーへリターンすることのない列を包含している(実際に、すぐ前の例11におけるクエリーが選択リスト上の項目を有している場合には、その変換は、未だに、全く同一のものである。注意すべきことであるが、すぐ前の例11においては、サブクエリー選択リスト上のアステリスクは問題ではなかった)。
【0152】
例えば、
【表42】
【0153】
を以下のものへ変換することが可能である。
【0154】
【表43】
【0155】
13.この相関型の例はすぐ前の例とは異なっている。何故ならば、SELECTリスト列は周囲 (外部)クエリーにおいて対応する列を有しているからである。
【0156】
例えば、
【表44】
【0157】
を以下のものへ変換することが可能である。
【0158】
【表45】
【0159】
14.以下の非相関型の例はNOT EXISTS演算子を介してインターフェースされた非相関型サブクエリーを例示している。
【0160】
例えば、
【表46】
【0161】
を以下のものへ変換することが可能である。
【0162】
【表47】
【0163】
注意すべきことであるが、オリジナルのサブクエリーのSELECTリストは「COUNT(*)」へ変更されており、且つ「ROWUNM=1」基準がサブクリエィへ付加されている。
【0164】
15.以下の非相関型の例は、サブクエリーがGROUP BYを包含していることを除いて、すぐ前の例14と同様である。この変換はすぐ前の例14と同様である。
【0165】
例えば、
【表48】
【0166】
を以下のものへ変換することが可能である。
【0167】
【表49】
【0168】
サブクエリーのSELECTリスト上に何があろうと「COUNT (*)」とスワップされる。
【0169】
16.以下のものはNOT EXISTS演算子を使用した相関型の例である。例えば、
【表50】
【0170】
を以下のものへ変換することが可能である。
【0171】
【表51】
【0172】
17.以下の相関型の例はIN演算子とインターフェースされたセット (組)サブクエリーを例示している。例えば、
【表52】
【0173】
を以下のものへ変換することが可能である。
【0174】
【表53】
【0175】
18.以下の非相関型の例は<ALL演算子を例示している。例えば、
【表54】
【0176】
を以下のものへ変換することが可能である。
【0177】
【表55】
【0178】
この変換において「x.col1 is null」を使用していることに注意すべきである。ポイントは、どの行もその基準に資格を与えるものでない場合でも集合体関数は常に値をリターンするということである。サブクエリーが空のセットとなる場合にALL演算子は常にTRUE (真)と評価するので、本システムは、未だに、周囲 (外部)クエリーにおける行をリターンすべきである。
【0179】
19.以下の非相関型の例はすぐ前の例18と類似している。然しながら、この例においては、>ALL演算子が<ALLの代わりに使用される。
【0180】
例えば、
【表56】
【0181】
を以下のものへ変換することが可能である。
【0182】
【表57】
【0183】
20.以下の非相関型の例はマージ可能なセットサブクエリーを有している。例えば、
【表58】
【0184】
を以下のものへ変換することが可能である。
【0185】
【表59】
【0186】
21.以下の相関型の例は相関されていることを除いて、すぐ前の例20に類似している。この例は、相関基準に対してどのようにしてアウタージョインシンタックスを付加するかを例示している。例えば、
【表60】
【0187】
を以下のものへ変換することが可能である。
【0188】
【表61】
【0189】
22.以下の非相関型の例はすぐ前の例21に類似している。然しながら、この例においては、サブクエリーは複数個のテーブルを有している。以下の例は、周囲 (外部)クエリーとマージされる場合にサブクエリー内のジョイン基準上にどのようにしてアウタージョインシンタックスを配置させるかを例示している。
【0190】
例えば、
【表62】
【0191】
を以下のものへ変換することが可能である。
【0192】
【表63】
【0193】
このサブクエリーにおいて、中間的にジョインされたテーブルの独自性が保証されている (この場合においては、p.nameが独自的であるのでエイリアス「p」)。ジョイン順番における高々1つの再開レベルチャイルドが独自的でない場合があり、この場合にはエイリアス「a」である。ジョイン順番はエイリアス「s」、次いで「p」、次いで「a」である。
【0194】
23.次の相関型の例はむしろ複雑なものとなる場合がある。それは、NOT IN演算子のためにアウタージョインとすべきである。然しながら、問題は、両方のエイリアス「e」、及び「a」がサブクエリーと相関しているということである。サブクエリーは単に1つのテーブルを包含するに過ぎないのでサブクエリーはマージ可能とすべきであり、従ってユニークネス即ち独自性を保証することは必要ではない。
【0195】
例えば、
【表64】
【0196】
である。
【0197】
相関基準のためにサブクエリーはマージすることも移動することも不可能である。サブクエリーの相関基準及びインターフェース列が周囲 (外部)クエリーにおける1つを超えるテーブルを参照する場合には、サブクエリーをスキップすることが可能である。この場合には、1つの相関基準がエイリアス「a.」を参照し且つ周囲即ち外部クエリーのインターフェースが「e.emp seq」を参照する。本システムがサブクエリーを変換すべき場合には、その変換はTIME SHEETSが1個を超えるテーブルとアウタージョインされることとなり、そのことは有効ではない。
【0198】
従って、上のSQLステートメントは誤って以下の如くにマージされ、
【表65】
【0199】
且つ誤って以下の如くに移動される。
【0200】
【表66】
【0201】
これら両方の場合は違法なアウタージョインとなり回避すべきである。
【0202】
24.この相関型の例はすぐ上の例23と同様に類似している。推移性を介して、本システムは例23に示したようなオリジナルのステートメントを以下のオリジナルのステートメントへ変換することが可能であり、次いで、その変換を実施し、従って例23において遭遇される制限を取除いている。
【0203】
例えば、例23におけるオリジナルのステートメントを以下のものへ変換することが可能であり、
【表67】
【0204】
それは、以下のものへ変換することが可能である。
【0205】
【表68】
【0206】
25.以下の相関型の例はスカラー演算子「=」を取扱う。この例は、サブクエリーがスカラーであることを決定するためにサブクエリーにおいて推移性をどのようにして使用することが可能であるかを示しており、例えば「e.emp seq=t.emp seq=a.emp seq」である。
【0207】
例えば、
【表69】
【0208】
を以下のものへ変換することが可能である。
【0209】
【表70】
【0210】
26.以下の相関型の例は集合演算子「IN」を取扱う。例えば、
【表71】
【0211】
を以下のものへ変換することが可能である。
【0212】
【表72】
【0213】
27.以下の相関型の例は、相関基準がサブクエリー内のテーブルの1つを超えるものが関与するものであるが、マージが可能である場合を示している。この場合においては、「t.」はサブクエリーのインターフェースを介して「e.」へインターフェースし、次いで「t.」はPROJ SEQ列を介して「a.」と相関する。推移性を適用することが可能であり、従って「t」はPROJ SEQ及びEMP SEQの両方の列を介して「a」と相関する。更に、ジョインされた場合に「e」及び「a」に関してユニークネス即ち独自性が保証される。
【0214】
例えば、
【表73】
【0215】
を以下のものへ変換することが可能である。
【0216】
【表74】
【0217】
「a」及び「e」は別々に「t」へジョインされるので、本システムは各テーブルのヌル不可能な列に対してIS NULLを付加し、それらを一体的にOR処理することが必要である。
【0218】
28.以下の相関型の例はGROUP BY句を有するサブクエリーのSELECTリストに関する集合体を例示している。
【0219】
例えば、
【表75】
【0220】
を以下のものへ変換することが可能である。
【0221】
【表76】
【0222】
29.以下の非相関型の例は、サブクエリーが移動される場合に、集合体を集合体の集合体へ変換する場合を例示している。
【0223】
例えば、
【表77】
【0224】
を以下のものへ変換することが可能である。
【0225】
【表78】
【0226】
30.以下の相関型の例は、「<ANY」のような演算子を介してインターフェースされたサブクエリーを変換することが不可能である場合を例示している。例えば、
【表79】
【0227】
を誤って以下のものへ変換させる場合がある。
【0228】
【表80】
【0229】
この変換は正しくない。何故ならば、サブクエリーは未だにセットであり、要求されるようにスカラーでないからである。例えば、EMP SEQに関して、PROJ SEQによるグルーピングに起因して未だに多数のMIN (rtp date)値が存在する可能性がある。サブクエリーがGROUP BY句を有するものでなかった場合であっても、その変換は未だに容易に可能なものではない。何故ならば、その変換は、相関列をSELECTリスト上に配置させ且つ集合体、及び集合体の集合体を形成することを必要とするからである。そのことは、スカラー及び集合体の集合体のシンタックス違反となる。
【0230】
オリジナルのGROUP BY列はHAVING句と相関しておらず且つその一部ではないが、本システムはそれを取除くことは不可能である。
【0231】
例えば、クエリーは誤って以下のものへ変換される場合がある。
【0232】
【表81】
【0233】
上の変換は正しくない。何故ならば、同一のPROJ SEQで、e.hiredateより小さなrpt dateが存在するがe.hiredateより大きな別のrpt dateが存在するからである。オリジナルのクエリーにおいて、MIN(rpt date)を有するクエリーは行のうちの1つとして第一データをリターンする。然しながら、上のクエリーにおいては、サブクエリーは最大をリターンする。
【0234】
31.以下の相関型の例は、「=」演算子の代わりに「<」演算子を使用する相関基準のためにサブクエリーを移動することが不可能な場合の優れた例である。
【0235】
例えば、
【表82】
【0236】
を誤って以下のものへ変換させる場合がある。
【0237】
【表83】
【0238】
正しい変換を行う1つの方法は、不等相関に関与するテーブルを以下の如くにしてサブクエリー内に移動させることである。
【0239】
【表84】
【0240】
その解決法はEMPLOYEESテーブルをサブクエリー内に移動させ、次いでそのサブクエリーを移動させることである。
【0241】
32.以下の相関型の例は集合体のないスカラーサブクエリーである。
【0242】
例えば、
【表85】
【0243】
を以下のものへ変換することが可能である。
【0244】
【表86】
【0245】
33.以下の相関型の例はすぐ前の例32と類似している。然しながら、この例においては、ユニーク即ち独特なキーの一部ではない列に関し付加的な相関基準が存在している。このことは、相関型サブクリエィを取扱う場合に重要である場合があり、即ち、サブクエリーのPK又はUNQキーに関しての相関基準は「=」演算子を使用すべきであり、且つ付加的な相関基準に対して使用される演算子は問題ではない。この場合には、相関基準「t.rtp date>=a.start date」はユニーク即ち独特なキーの一部ではない。
【0246】
例えば、
【表87】
【0247】
を以下のものへ変換することが可能である。
【0248】
【表88】
【0249】
34.以下の相関型の例は、スカラーサブクエリーをインターフェースするためにスカラー演算子を使用し、該サブクエリーは集合体及びGROUP BY句でないためにスカラーである。
【0250】
例えば、
【表89】
【0251】
を以下のものへ変換することが可能である。
【0252】
【表90】
【0253】
35.以下の相関型の例はHAVING句における相関を例示している。その解決方法は、HAVING句は周囲即ち外部クエリーにおける基準となり、且つ相関型基準において比較されたローカルな項目はそのサブクエリーはSELECTリスト内に表われるべきである。注意すべきことであるが、チェックする別のシンタックスは、サブクエリーがGROUP BYを有するものでないがHAVING句を有する場合である。
【0254】
例えば、
【表91】
【0255】
を以下のものへ変換することが可能である。
【0256】
【表92】
【0257】
36.以下のものは相関型の例であり、その場合に演算子はNOT IN演算子であり且つ不等相関基準が存在している。本システムは、既にそこに存在しているのでEMP SEQ列の別のコピーをGROUP BY句上へ移動させることは必要ではないことに気が付くべきである。
【0258】
例えば、
【表93】
【0259】
を以下のものへ変換することが可能である。
【0260】
【表94】
【0261】
37.この相関型の例は、例30においてはサブクエリーが集合体を有するものでないということを除いて、上の例30に類似している。このクエリーは実際的なものではないかも知れないが、この例はANY、SOME又はALL演算子のいずれに対してもGROUP BYを有するサブクエリーを何故移動すべきではないかを例示するために使用される。例えば、
【表95】
【0262】
は誤って次のものへ変換されることがある。
【0263】
【表96】
【0264】
問題は、既にRPT BATEによるグルーピングが存在しており、且つ周囲即ち外部のクエリーに対してのジョイン基準が存在しないということである。従って、スカラーを必要とする場合にEMP SEQについてのジョイン当たりのセット即ち組となる。
【0265】
38.以下の相関型の例は、不等相関基準に起因してANY、SOME又はALLサブクエリーを移動させることが不可能である場合を例示している。移動させるためには、高々1つの行がオリジナルの周囲即ち外部クエリーと比較されることを最終的な変換が確保すべきである。然しながら、この変換における不等ジョイン基準の場合には、複数個の行がジョインされる場合がある。
【0266】
例えば、
【表97】
【0267】
は誤って次のものへ変換される場合がある。
【0268】
【表98】
【0269】
39.以下のものは「>ALL」演算子を有する相関型の例である。この例は、MIN関数の代わりにMAX関数を使用することを除いて、上の例と類似している。
【0270】
例えば、
【表99】
【0271】
を以下のものへ変換することが可能である。
【0272】
【表100】
40.以下の相関型の例は「<ANY」演算子を例示している。<ANYと「ANY」演算子との間の唯一の差異は、MAXがMINとなることである。
【0273】
例えば、
【表101】
を以下のものへ変換することが可能である。
【0274】
【表102】
41.以下の相関型の例はスカラー演算子「=」を例示している。例えば、
【表103】
を以下のものへ変換することが可能である。
【0275】
【表104】
42.以下の相関型の例はEXISTS演算子を例示しており、その場合にサブクエリーはHAVING句を包含しているがGROUP BY又は集合体を包含していない。ここでのポイントは、HAVING句の前にGROUP BY句を付加することである。
【0276】
例えば、
【表105】
を以下のものへ変換することが可能である。
【0277】
【表106】
43.この相関型の例はすぐ前の例42と類似しており、尚HAVING句が存在している。然しながら、この例においては、GROUPも存在している。
【0278】
例えば、
【表107】
を以下のものへ変換することが可能である。
【0279】
【表108】
44.以下の非相関型の例は、EXISTS演算子に対してサブクエリーを移動させることが不可能な場合を例示している。この場合の理由は、その解決方法がサブクエリーに対して「ROWNUM=1」基準を付加することだからである。然しながら、HAVING句は検索された唯一の行を資格剥奪することが可能である。この例においては、少なくとも2つの資格がある行が存在すべきであり、そうでない場合には、サブクエリーは空のセットをリターンする。
【0280】
例えば、
【表109】
は誤って以下のものへ変換される場合がある。
【0281】
【表110】
45.次の相関型の例は上の複数個のレベルに相関されたサブクエリーを例示している。この例は、上のセクションにおいては、「制限」がこれらのタイプの相関型サブクエリーを変換しようとすべきではないことを表わすものであるために包含されている。その理由は、それらは以下に示すように可能なものであるが比較的複雑なものであるからである。
【0282】
例えば、
【表111】
を以下のものへ最初に変換することが可能であり、
【表112】
次に、以下のものに変換することが可能である。
【0283】
【表113】
最初の変換は比較的簡単である。サブクエリーをマージすることは不可能であり、従ってそれは移動されている。このことはSELECTリストにおけるDISTINCTキーワード及びSELECTリストへ移動されるべき相関基準の一部であったローカルな列を必要としている。更に、相関型基準は周囲即ち外部クエリーへ移動されている。
【0284】
2番目の変換はより複雑なものである。何故ならば、この場合には、同一の名前を有しているが周囲即ち外部クエリーに相関されていたサブクエリーの異なるローカルなテーブルからの2つの列が存在しているからである。そのことは、SELECTリストへ移動される場合にユニークなエイリアスが該列に対して与えられねばならないことを意味している。従って、本システムは相関型基準を周囲即ち外部のクエリーを移動させねばならないに過ぎない。
【0285】
これをより最適化するために、本システムは、移動の前に、基準の推移性に注意すべきである。例えば、「a.emp seq=e.emp seq」及び「xl.emp seq=e.emp seq」を持っていた。これは、「a.emp seq=xl.emp seq」というのと等価である。このことを認識することは、サブクエリーにおけるジョインをより効率的なものとさせ且つ次のような結果となる。
【0286】
【表114】
46.OR演算子はサブクエリーのペアレント即ち親と考えられる。以下の例は、ジョインへの変換が誤った答えを発生する場合を例示している。
【0287】
例えば、
【表115】
ORを無視した場合には、変換は以下のようになる。
【0288】
【表116】
この問題を見る1つの方法は、以下のようにしてORをしてUNION ALLへ変換することである。
【0289】
【表117】
47.以下の例はOR処理した相関基準を取扱う。相関基準がOR処理されると、アウタージョインへの変換は不可能であり、且つNOT INへの変換は複雑である。例えば、
【表118】
NOTへの変換が実施された場合に、本システムは以下のことを行うべきである。
【0290】
【表119】
パース不可能なシンタックスを発生するためにアウタージョインへの変換が不可能である場合には次の通りである。
【0291】
【表120】
48.以下の例は、オリジナルのサブクエリーが空のセットを発生することが可能である場合のNOT INからNOT EXISTSを例示している。サブクエリーはデモの目的のために人工的に空のセットを強制的に発生させた。例えば、
【表121】
は、同一の結果が発生されることを確保するために以下の如くに変換すべきである。
【0292】
【表122】
然しながら、この解の問題は、再度オリジナルへ戻るということである。
【0293】
49.以下の相関型の例は、周囲即ち外部のクエリーへ相関されている集合体を有するHAVING句を例示している。例えば、
【表123】
この変換は、以下のようにして、集合体及び相関列をSELECTリストへ移動させることを必要とする場合がある。
【0294】
【表124】
50.以下の相関型の例はNOT INを有するマージを示している。注意すべきであるが、この変換において付加されている基準は周囲即ち外部のクエリーへインターフェースされているサブクエリーテーブルのROWIDを包含している。「t」はジョイン順番における再開レベルのチャイルド (子)であり、「e」は「a」に対してアウタージョインされており、「a」は「t」ヘアウタージョインされているので、「a」ではなくエイリアス「t」のROWIDを使用することが重要である。
【0295】
例えば、
【表125】
は次のように変換することが可能である。
【0296】
【表126】
51.以下の相関型の例は、クエリーのインターフェース列がサブクエリーにおける相関テーブルと同一ではないということを除いて、すぐ前の例50と同様である。たとえば、START DATEはASSIGNMENTSに属しているが、T.EMP SEQは相関されているが異なるテーブルに属している。推移性が使用される場合には、TとAとの間のジョイン基準のためにT.EMP SEQをA.EMP SEQへスイッチさせることが可能である。
【0297】
例えば、
【表127】
最初に、推移性を付加すると次のものが得られ、
【表128】
従って、前の例50におけるのと同一のクエリーを有しており、それは同一の変換が発生したことを意味している。
【0298】
52.この相関型の例は例50に類似しているが、インターフェース列に対応するこのサブクエリーにおけるテーブルはTIME SHEETSである。唯一の差異は、EMPLOYEESがTIME SHEETSへアウタージョインされており、従ってTIME SHEETSがASSIGNMENTSへアウタージョインされていることである。従って、付加された基準は例50におけるようにTIME SHEETSテーブルではなくASSIGNMENTSテーブルのROWIDを使用する。
【0299】
例えば、
【表129】
は以下のものへ変換することが可能である。
【0300】
【表130】
53.以下の相関型の例は、集合体の集合体は可能な変換ではないことを例示している。例えば、
【表131】
は誤って次のように変換されることとなる。
【0301】
【表132】
然しながら、このようなSQLはコンパイルすることがなく従って回避すべきである。
【0302】
54.以下の相関型の例は、不等相関基準及び集合体は可能な変換ではないことを例示している。例えば、
【表133】
は誤って以下のように変換される。
【0303】
【表134】
ここでの問題は、不等基準「a.start date>t.rpt date」のために、GROUP BYのみならずt.rtp dateがSELECTリストへ移動されねばならないことである。然しながら、集合体は誤ったグループを包含しているので、SELECTリストへ移動させることは不可能である。実際に、MAXはRTP DATEに等しくなる。
【0304】
55.以下の相関型の例も、集合体の集合体は可能な変換ではないことを例示している。例えば、
【表135】
は誤って以下のように変換される。
【0305】
【表136】
問題は、SELECTリストに関してスカラー及び集合体を持つことを不可能であるということである。
【0306】
最適化
以下のものは、更に、システム又はユーザによって最適化モードが選択された後に、代替的SQLステートメントを発生することによってSQLステートメントを最適化するために本システムが使用する態様をリストしている。最適化目標のためのヒントは、各SQLステートメント変換内に包含されるべきである。本システムはノンジョイン (non−join)即ち非ジョイン基準における全ての推移性を決定し、全てのジョイン順番を決定し、全ての種々のサブクエリー変換を決定する。
【0307】
ノンジョイン推移性
簡単に、以下のクエリーを見てみる。
【0308】
【表137】
この例においては、DEPENDENTSのサブクエリーに関する基準は「e.emp seq」であるオリジナルのみならず、「a.emp」又は「t.emp seq」へインターフェースさせることが可能である。他のシステムはこのことを認識するものではない。「a.emp seq」へスイッチすることによって、本システムは、データベースがASSIGNMENTSに関する連結されたキーインデックスを使用することを可能とする。
【0309】
代替的な変換は、以下のようにして「a.emp seq」を「a.emp seq」 (行5)ヘ変化させる。
【0310】
【表138】
オペランド「e.emp seq」は2つの他の値と置換することが可能であるので、SQLは3つの態様で書くことが可能である (オリジナルに対して1つ及び「e.emp seq」を置換することが可能な異なる値の数に対して2つ)。
【0311】
マルチ非ジョイン推移性
以下のものは、本システムがどのようにしてマルチ非ジョイン推移性を取扱うかを説明する。例えば、以下のSQLステートメントが与えられたものとする。
【0312】
【表139】
2つの異なる非ジョイン基準における2つのオペランド「a.proj seq」(行5)及び「e.emp seq」 (行7)は等価な列で置換することが可能である。他のシステムではこのことを認識するものではない。然しながら、本システムは、「e.emp seq」 (行7)を「a.emp seq」へスイッチすることによって、データベースがASSIGNMENTSに関する連結されたキーインデックスを使用することを可能とする。「e.emp seq」についての基準は最後の例と同じである。本システムは、又、「a.proj seq」 (行5)を「t.proj seq」で置換することが可能である。このことは、使用することが可能な潜在的に6個 (2×3)異なるSQLステートメントが存在していることを意味している (このことはオリジナルの値を包含することに注意)。
【0313】
マルチ列オペランド
複数個の列を包含するオペランドに関してはどうであろうか?例えば、
【表140】
基準「s.emp seq,s.effective date」(行3)は非ジョイン基準を表わしており、推移性を適用することが可能である。このジョイン句は「e.emp seq」と言っており且つ「s.emp seq」は等価であるので、非ジョイン基準オペランドに対して2つのオプションが存在している。最初のものはオリジナルであり且つ2番目のものは「s.emp seq」を「e.emp seq」で置換させることである。
【0314】
問題は、このことを行うべきかどうかと言うことである。その問題の理由は、オペランドにおける両方の列は同一のテーブルを参照し、且つ両方の列に関して連結されたインデックスが存在しているからである。単一の列のみが存在する場合であっても、両方の列に関するインデックスが存在している。
【0315】
その答えは心配することではなく単にオペランドに他の列を付加し、且つ以下のようにして対応する列をSELECTリストへ付加することである。
【0316】
【表141】
このことは、決定を簡単化させ且つデータベースがどれを使用するかを決定させる。
【0317】
OR処理された非ジョイン基準
OR処理された基準がクエリー内に存在する場合はどうであろうか?非ジョイン基準がジョイン基準のうちのいずれかに対してOR処理された場合には、OR処理されたジョイン基準に起因する推移性を使用することは不可能である。使用することが可能な唯一の推移性はAND処理されたものである。
【0318】
以下のSQLはORを有するクエリーを例示しているが、ジョイン基準の全ては非ジョイン基準に対してAND処理されていることに注意すべきである。
【0319】
【表142】
以下のSQLは基準の優先性を特定するために括弧を使用するものではない。ORの前にANDが処理されると言うデフォルトが使用される。
【0320】
【表143】
この場合には、非ジョイン基準に対してAND処理される唯一のジョイン基準は行5及び6においてである。「e.emp seq=a.emp seq」である推移性を使用することは不可能である。非ジョイン基準に対してAND処理されるジョイン基準のどれもが「e.emp seq」を参照するものではないので、推移的値は存在しない。
【0321】
アウタージョイン
非ジョイン基準は存在しないがクエリー内にアウタージョイン(outer−join)が存在する場合はどうであろうか?その例が次のことを例示している。
【0322】
【表144】
問題の非ジョイン基準は「e.emp seq」に関するオペランドを有しており、且つ等価な列が非アウタージョインテーブルからのものであるジョイン基準は存在しないので、推移的値は存在しない。
【0323】
以下の例は前のものとは僅かに異なっている。
【0324】
【表145】
この例においては、TIME SHEETSは唯一のアウタージョインテーブルである。従って、この例においては、推移性「e.emp seq=a.emp seq」は使用することが可能であるが、「e.emp seq」は「t.emp seq」と等値させることは不可能である。
【0325】
簡単な非ジョイン基準の推移性
以下のクエリーはこの概念を説明するために使用する。
【0326】
【表146】
非ジョイン基準は「d.emp seq=1001」(行3)である。ジョイン基準に基づいた推移性に起因して、このクエリーは次の通りに書き直すことが可能である。
【0327】
【表147】
従って、非ジョイン基準はEMPLOYEESテーブル上にある。
【0328】
これは、2つの可能な値を有する推移性を具備する単一列オペランドと考えるべきである。
【0329】
非ジョイン基準及び入れ子選択の推移性
これは非常に有益的な場合がある単一列推移性の1つのエリアである。入れ子即ちネストされた選択が選択リストにおいてGROUP BYシンタックス又は集合体を有するものではなく、且つジョイン列の1つを参照するメインクエリーにおいて非ジョイン基準が存在しない場合には、非ジョイン基準は入れ子即ちネストされた選択へ移動させることが可能である。
【0330】
例えば、非ジョイン基準は「e.emp seqBETWEEN1001and1010」(行4)である。
【0331】
【表148】
ジョイン基準及び推移性のために、このクエリーは以下のように書き直すことが可能である。
【0332】
【表149】
ポインタは、これを複数個の値を取ることが可能な単一列オペランドと考えるのではなく、単に入れ子即ちネストされた選択における基準を複製させることである。
【0333】
ドライビングテーブル
インデックスされていない非ジョイン基準を有するクエリーが存在する場合がある。例えば、インデックスサーチがクエリーをスタートさせる方法は存在しない。インデックスされた非ジョイン基準を有するクエリーが存在する場合がある。最後に、非ジョイン基準を有することのないクエリーが存在する場合がある。別の重要な考慮事項は、ジョイン基準が両側でインデックスされているか否かである。これら全ては最適化モードが何であるかと共に考慮されねばならない。
【0334】
以下に参照する非ジョイン基準は1つのオペランドがサブクエリーであるものを包含していることに注意すべきである。又、メインクエリーのみならず1つを超えるテーブルを有する全てのサブクエリーに対して可能なドライビングテーブルを決定すべきであることにも注意すべきである。
【0335】
非ジョイン基準が存在する場合
ドライビングテーブルを決定することは使用されている最適化モードに基づいている。
【0336】
FIRST ROWS
最適化モードがFIRST ROWSに設定されている場合には、FROM句におけるテーブル/ビュー又は入れ子即ちネストされている選択に対して(それはアウタージョインテーブルではない)、インデックスされている非ジョイン基準及びインデックスされていない非ジョイン基準の数をカウントする。そのテーブルが何等かのインデックスされている非ジョイン基準を有している場合には、そのテーブルはクエリーをドライブするために使用することが可能である。該テーブルのどれもがインデックスされている非ジョイン基準を有するものでない場合には、可能なドライビングテーブルはいずれかのインデックスされていない非ジョイン基準を有するものである。
【0337】
ALL ROWS
最適化モードがALL ROWSに設定されている場合には、FROM句におけるテーブル/ビュー又は入れ子即ちネストされている選択に対して(それはアウタージョインテーブルではない)、インデックスされているか否かに拘わらず非ジョイン基準の数を単にカウントする。可能なドライビングテーブルは非ジョイン基準を有するものである(そのカウントはジョイン順番を決定する場合に後に使用される)。
【0338】
以下のSQLステートメントは、両方の最適化モード変換を例示するために使用する。
【0339】
【表150】
上のSQLの場合、最適化モードがFIRST ROWSである場合には、LNAMEに関するインデックスされている非ジョイン基準のために、EMPLOYEESがドライビングテーブルとなることが可能である(LNAMEは連結されたインデックスの一部であるという事実を忘れることが可能である)。RELATIONに関する非ジョイン基準はインデックスされておらず、従ってDEPENDENTSはドライビングテーブルとなることは不可能である。更に、ASSIGNMENTSに関して非ジョイン基準は存在していない。従って、唯一の可能なドライビングテーブルはEMPLOYEESである。
【0340】
上のSQLの場合、最適化モードがALL ROWSである場合には、EMPLOYEES及びDEPENDENTSの両方がドライビングテーブルとなることが可能である。何故ならば、それらは両方共非ジョイン基準を有しているからである。この場合も、ASSIGNMENTSは何等非ジョイン基準を有するものではなく、従ってドライビングテーブルとなることは不可能である。
【0341】
非ジョイン基準でない場合
絶対的に非ジョイン基準が存在することはなく且つ参照完全性を介してか又はユーザのジョインを介してのいずれかによりヒエラルキー即ち階層を知得している場合(ユニークなインデックスを使用する側がペアレント(親)側であり、且つユニークでないインデックスを有する側がチャイルド(子)側である)、ドライビングテーブルは最上のペアレント(親)とすべきである。それはFIRST ROWS及びALL ROWS最適化モードの両方に対してそうすべきである。
【0342】
例えば、以下の例において参照完全性が存在しないものと仮定する。
【0343】
【表151】
EMPLOYEES及びBEPENDENTSの間のジョインはEMPLOYEES側においてユニークなインデックスを使用し且つDEPENDENTS側においてユニークでないものを使用する。従って、EMPLOYEESはペアレント即ち親であると考えられ、DEPENDENTSはチャイルド即ち子であると考えられる。EMPLOYEES及びASSIGNMENTSの間のジョインはEMPLOYEES側のユニークなインデックスを使用する。然しながら、ASSIGNMENTS側にはインデックスは存在しない(EMP SEQを包含するインデックスが存在するが前端の列としてではない)。次のセクション「If Un−Indexed Join Criteria」はこのことの意味を説明する。
【0344】
従って、上の例の場合には、EMPLOYEESはクエリーをドライビングするための唯一の候補者である(然しながら、次のセクションにおいては、ジョインインデックスの欠如に起因してASSIGNMENTSも可能なドライバとして考えることが可能である)。
【0345】
1つを超えるテーブルが最上テーブルと考えることが可能なクエリーに関してはどうであろうか?以下のSQLが例示している。
【0346】
【表152】
この場合には、EMPLOYEES及びDEPARTMENTSの両方がDEPE HISTORYのペアレントである。従って、両方がドライビングテーブルとしてテストすることが可能である。
【0347】
非インデックス型ジョイン基準
テーブルのジョインがインデックスされていない場合には、最適化モードがALL ROWSである場合には、そのテーブルはクエリーをドライビング即ち駆動するための候補者である。注意すべきことであるが、そのテーブルが何等非ジョイン基準を有するものでなく、一方他のテーブルが有する場合であっても、ALL ROWSクエリーをドライブすることが可能である。最適化モードがFIRST ROWSである場合には、そのテーブルに関して非ジョイン基準が存在しない限り、このようなテーブルは考慮されない。例えば、インデックスされている基準を有するテーブルに対して優先性を与える前のルール(規則)を使用する。以下の例が例示している。
【0348】
【表153】
上のクエリーにおけるASSIGNMENTSは「t.proj seq」に関するインデックスを有するものではない。従って、ASSIGNMENTSは、又,ALL ROWS最適化モードにおいて該クエリーをドライブする候補者である。
【0349】
アウタージョイン
テーブルがアウタージョインされている場合には、それはドライビングテーブルとして使用されるべきではない。従って、以下の例に例示されるように、DEPENDENTSに関して非ジョイン基準が存在する場合であっても、DEPENDENTSはいまだに該クエリーを駆動するために使用することは不可能である。
【0350】
【表154】
FROM句入れ子型選択
以下のクエリーは、アウタージョインの場合の問題を例示している。入れ子型即ちネストされた選択は非ジョイン基準においてサブクエリーとして作用するので、サブクエリーは常にドライビングテーブルとすべきである。実際に、アウタージョインされていない全ての入れ子型即ちネストされているSELECTSは、それらが非ジョイン基準を有するか否かに拘わらずに最初にジョインされる。
【0351】
以下のクエリーにおいては、サブクエリーが最初にジョインされる場合に最善のプランが発生し、それにより履歴レコードの選択をより効率的にドライブ即ち駆動する。このことは以下のORDEREDヒントセクションにおいて更に説明する。
【0352】
【表155】
ビュー
理想的に,本システムはビュー(view)を包含するクエリーのみならず非ジョイン基準に対してビュー定義それ自身をチェックすべきである。ビュー定義が1つのビューを包含している場合には、該ビューを反復的にチェックすることはしない。1つのレベルで充分であり、且つ、しばしば、それが必要とされる全てである。又、ビューは複数個のテーブルのジョインである場合であることに注意すべきである。
【0353】
本プロセスを簡単化するために、ビューを潜在的なドライビングテーブルとして考慮する。
【0354】
ジョイン順番
ジョイン順番に関して決定をする前に、本システムはどこからスタートするかを知ることを必要とする。例えば、FROM句における潜在的なドライビングテーブル/ビュー又は入れ子型選択は何であるか。(上のドライビングテーブル参照)
ORDEREDヒントはジョイン順番を特定するために使用される。
【0355】
最初に、ジョイン順番を特定するSQLステートメントの場合、ORDEREDヒントなしでそれをテストする。例えば、これはテストされる最初の順列(ORDEREDヒント無し)である。他の順列は決定された種々のドライビングテーブルに基づいている。SQLステートメントがクエリーをドライブすることが可能な2つのテーブルを有している場合には、少なくとも3個の順列が存在しており、即ちオリジナル及び異なるドライビングテーブルを有するORDEREDヒントを使用する2つである。
【0356】
ドライビングテーブルのうちの1つを選択する。FROM句におけるオブジェクト間のヒエラルキー即ち階層を見て、どのジョイン経路が「最高の(MOST)」非ジョイン基準と遭遇するかをチェックする(その場合に、FIRST ROWSは存在する場合にインデックスされている非ジョイン基準を創作し、そうでない場合にはインデックスされていない非ジョイン基準を創作し、且つALL ROWSは、インデックスされているかに拘わらず、最高の非ジョイン基準のみを創作する)。全てのオブジェクトが非ジョイン基準とジョインされた後に、他のジョインは問題ではなく、従ってこれらのテーブルの変形例を作成することはない。
【0357】
以下の例が例示している。
【0358】
例1
以下の例はALL ROWS最適化モードの場合である。
【0359】
【表156】
PROJECTSに関して1つの非ジョイン基準が存在しており且つ入れ子型即ちネストされた選択に対して1つ存在している。この例に対するヒエラルキー即ち階層は図10に示してある。図10に示したように、このヒエラルキーは入れ子型選択をEMPLOYEESのチャイルド(子)として図示している。これは、SAL HISTORYがEMPLOYEESのチャイルドであることを既知であるのでこの場合にうまく行く。点線は以下に更に詳細に説明するようにその関係が推移性を介してのものであることを示している。
【0360】
推移性のために、PROJECTSがドライビングテーブルとして選択される場合には、最高の非ジョイン基準の方向にジョインすることを所望する。それは可及的速やかに入れ子型即ちネストされている選択へ到達することを所望することを意味している。従って、ジョインは以下のようにすべきである。
【0361】
【表157】
入れ子型選択がドライバとして選択される場合には、ジョインは以下のようにすべきである。
【0362】
【表158】
それは前のSQLにおける非ジョイン基準の全てがインデックスされていたことになり,従って同一のジョイン順番が使用される。
【0363】
例2
以下の例はFIRST ROWS及びALL ROWS最適化モードの場合である。
【0364】
【表159】
EMPLOYEESと入れ子型選択との間のジョイン基準は両側においてインデックスされている。然しながら、非ジョイン基準はネスト型選択において複製されるべきであるので(推移性に関する上のセクションを想起)、両方のオブジェクトがクエリーをドライブすることが可能である。
【0365】
例3
このクエリーはFIRST ROWS最適化モードの場合に使用されることが意図されている。これは使用されるスタンダードの履歴データクエリーである。ここでのポイントは各規準におけるオペランドのうちの1つがサブクエリーである場合の非ジョイン基準である。各場合における他のオペランドはインデックスされているので、これらはインデックスされている非ジョイン基準と考えられる。
【0366】
【表160】
この例に対するヒエラルキーを図11に示してある。点線は推移的ジョインを表わしている。履歴テーブルの各々はインデックスされた非ジョイン基準を有しているので、それらは直接的にジョインさせることが可能である。従って、履歴テーブルのうちの何れもドライビングテーブルとなることが可能である。デフォルト以外の異なるジョイン順番は以下の如くである。
【0367】
【表161】
又は、
【表162】
又は、
【表163】
又は、
【表164】
又は、
【表165】
又は、
【表166】
例4
さて、例3におけるサブクエリーがFROM句へ移動された場合はどうであろうか?この場合は、入れ子型選択が多分クエリーをドライブすることが可能である。これらALL ROWS最適化モードであると仮定する。
【0368】
【表167】
この例に対するヒエラルキーを図12に示してある。注意すべきであるが、EMP SEQの推移性のために履歴テーブルの間には推移的ジョイン基準が存在している。例えば、「s.emp seq=x1.emp seq」、及び「s.emp seq=e.emp seq」、「e.emp seq=j.emp seq」、「j.emp seq=x2.emp seq」であるので、「x1.emp seq=x2.emp seq」である。
【0369】
更に、注意すべきことであるが、履歴テーブルに対して非ジョイン基準は存在しておらず、単に入れ子型選択のみである。従って、履歴テーブルのいずれもがクエリーをドライブすることは不可能である。いずれの場合においても、ドライビングテーブルに関して上述したようにFROM句における入れ子型サブクエリーは常にドライバとなることが可能である。
【0370】
更に、可能なジョイン順番が存在している。それを見ることをより容易なものとさせるために、ネスト型選択に対してエイリアスが与えられ、即ち、SAL HISTORYに関する入れ子型選択に対してS.N.であり、DEPT HISTORYに関する入れ子型選択に対してDNである等である。更に、前述したように、本システムは非ジョイン基準を有することのないオブジェクトの並べ替えに関しては問題にすることはない。
【0371】
【表168】
【表169】
【表170】
【表171】
【表172】
【表173】
注意すべきであるが、後のテーブルはそれらの順番が一定である。初期的な順番は変化させることが可能であるが、種々のジョイント順番に対してそれは常に一定に止まる。
【0372】
クラスター型テーブル
テーブルがクエリー内の他のテーブルのうちの1つに対してクラスターされているすなわち寄せ集められている場合には、これらのテーブルは他のテーブルの中間的ジョイン無しで一体的にジョインされるべきである。例えば、ASSIGNMENTS、PROJECTS、TIME SHEETSは同一のハッシュクラスター(hash cluster)内にある。以下のクエリーが例示している。
【0373】
【表174】
この例に対するヒエラルキーを図13に示してある。遷移的ジョイン関係は点線によって図13に示してある。TIME SHEETSのみが非ジョイン基準を有している。従って、TIME SHEETSは唯一のドライバである。このクラスター構成及びその他においての非ジョイン基準の欠如のために、全てのクラスターされているテーブルは以下の如くにして次にジョインされるべきである。
【0374】
【表175】
ORDEREDヒント
ORDEREDヒントは常に動作する。然しながら、ジョイン基準がジョインの順番を可能とさせる場合に本システムはより効率的なものとなる。しばしば、このことは、現在のジョイン基準における推移性に対応するジョイン基準を付加することを意味する。
【0375】
ジョイン順番を選択する場合に、本システムは、明示的なジョイン基準が存在するか否かをチェックせねばならない。そうでない場合には、本システムは推移性を介してどこでジョイン基準が暗示されるかをチェックすべきである。そうである場合には、暗示されたジョイン基準が存在し、その基準はテストの前にクエリーに付加すべきである。パラメータは既にORDEREDヒント内に内蔵されているので、暗示されたジョイン基準はORDEREDヒント内に継続して内蔵されるべきである。本システムがこれらにおけるジョイン順番を取扱うのは、ユーザがORDEREDヒントを手作業で使用することを可能とさせる場合である。何故ならば、他の最適化モードに対してSQLテストを修正することは望ましくないからである。
【0376】
以下の例の場合には、テーブルX1とX2との間に明示的なジョイン基準は存在しないが、推移性を介してジョインが存在する。チェックする方法は、X1からX2へのジョイン経路に追従することである。例えば、X1からSへ、ジョインは「x1.emp seq=s.emp seq and x1.col1=s.effective date」である。SからEへのジョインはEMP SEQに関してである。このことは暗示的に「x1.emp seq=e.emp seq」を与える。継続してX2へのジョイン経路を追従して、EMP SEQを介してEからDへ移行する。従って、「x1.emp seq=d.emp seq」ということが可能である。最後に、その経路は「d.emp seq=x2.emp seq and d.effective date=x2.col1」」を介してDからX2へ移行する。従って、該経路は、最終的に、「x1.emp seq=x2.emp seq」である。ORDEREDヒントはX1をX2へジョインさせることを望むものであり、且つ暗示的なジョイン基準「x1.emp seq=x2.emp seq」が存在するので、その基準はORDEREDに対するパラメータとして付加されるべきである。
【0377】
同一の処理を、X2とX3との間の推移的ジョイン基準を得るために実施することが可能である。例えば、「x2.emp seq=x3.emp seq」である。X3は明示的にEにジョインされるものではないので、本システムはジョイン基準「x3.emp seq=e.emp seq」を包含すべきである。
【0378】
暗示的ジョイン基準を有するORDEREDヒントの提案されるフォーマットは以下の通りである。
【0379】
【表176】
FROM句における入れ子型選択
入れ子型即ちネストされた選択がFROM句内に存在しており且つ非ジョイン基準がメインSQLモジュールにおいてそれを参照する場合には、本システムはその基準を入れ子型SELECTのWHERE句へ移動させることをチェックする。例えば、以下のSQLステートメント、
【表177】
を以下のものへ変換することが可能である。
【0380】
【表178】
この場合には、非ジョイン基準がサブクエリーへ移動されてジョインの後に後にフィルタする前に資格が与えられる行数を減少させる。
【0381】
注意すべきことであるが、幾つかのデータベースは既にこのことを考慮する場合があるが、該基準をWHERE句へ移動させることは有益的であり且つ早期にヒントを特定させることを可能とする。
【0382】
NOT処理した論理
NOT処理した基準は、通常、最適化と言う観点においてここで考慮されることはない。何故ならば、それは関係ないからである。即ち、データベースは、典型的に、NOT処理された基準の置き換えを自動的に取り扱う。
【0383】
NVL関数
この関数に対するデフォルトパラメータがオペランド定数と等しくない場合には、WHERE NVL(cost,0)=10はNULLがリターンされる場合にWHERE 0=10と評価する。従って、デフォルト(0)は10に等しくないので、NVL関数を落とすことが可能であり、従って基準がインデックスを使用することを可能とさせる。基準がインデックスを使用することが可能でない場合には、何もなされない。その列がNULLable即ちヌル化可能でない場合には、NVL関数に対する理由は全く存在しないので、行うことはない。
【0384】
WHERE NVL(cost,0)=0は、他のインデックスされている基準が存在していない限り、おきかえられるべきではない。例えば、これが発生しなかった場合には、本システムはWHERE cost=0 or cost is nullへ置き換えねばならない。それは他のインデックスされている基準なしで完全なテーブルスキャンを必要とする。例えば、下の例を見てみる。
【0385】
【表179】
は以下のように変換することが可能であり、
【表180】
従って、これは更に次のように変換することが可能である。
【0386】
【表181】
各SQLモジュール(例えば、各入れ子型クエリー)を別々に最適化することがより可能となる。更に、注意すべきことであるが、その変換は底部モジュールにおいてスタンダードの不等式を包含するものではない。ORが同一の列にあるのでその必要性はない。OR処理された基準は以下に更に詳細に説明する。
【0387】
OR処理された基準
以下の例は、どのようにして本システムがOR処理された基準を取扱うかを説明する。例えば、以下のSQLステートメント、
【表182】
は以下のように書き直すことが可能である。
【0388】
【表183】
列A及びBがヌル化可能である場合には、そのアプローチは以下の通りである。
【0389】
【表184】
以下のように書かれるWHERE句は、
【表185】
は以下の通りに書き直すことが可能である。
【0390】
【表186】
「IS NOT NULL」は、列がヌル化可能である場合に付加すべきである。
【0391】
新たなプラン演算
ビットマップキー反復
これは、サブクリエーが複数個の値を出力する場合に発生し、次いでビットマップインデックスへ移行する。IN等の場合にも発生するかをチェックする。以前に、BITMAP ORはビットマップインデックス上でIN演算子で複数個の値を取扱かっている。
【0392】
その他のヒント
データウエアハウス処理において、該データウエアハウスにおける主要な情報を包含する1つ又はそれ以上の非常に大きな事実テーブル及び各々が事実テーブルにおける特定の属性に対するエントリに関する情報を包含している多数のより小さなディメンジョンテーブル(例えば、ルックアップテーブル)を描写するためにスタースキーマー(star schema)を使用することが可能である。
【0393】
スタークエリー(star query)は事実テーブルと多数のルックアップテーブルとの間のジョインである。各ルックアップテーブルは、プライマリーキー(primary−key)対フォーリンキー(foreign−key)ジョインを使用して事実テーブルに対してジョインされる。然しながら、ルックアップテーブルは互いにジョインされることはない。
【0394】
スター変換はスタークエリーを効率的に実行することを目標にしたコストベース即ちコストを基礎としたクエリー変換である。スターオプティマイゼーションは少数のディメンジョン及び稠密事実テーブルを有するスキーマーに対して良好に働く場合があるが、スター変換は以下のうちのいずれかが真である場合に代替物として考えることが可能である。例えば、ディメンジョンの数が大きいか又は事実テーブルがまばらである場合にはスター変換が有用である場合がある。更に、全てのディメンジョンテーブルが拘束用プレディケート即ち述語を有するものでないクエリーが存在する場合にスター変換が有用である場合がある。スター変換はディメンジョンテーブルのカーテシアンプロダクト即ち直積を計算することに依存するものではなく、そのことは、事実テーブルがまばらであること及び/又は多数のディメンジョンが事実テーブルにおける実際のマッチを有する行を殆ど有することのない大きなカーテシアンプロダクト即ち直積となる場合にそれをより適切なものとさせる。更に、連結されたインデックスに依存する代わりに、スター変換は個々の事実テーブルの列に関するビットマップインデックスを結合することに基づいている。従って、該変換は拘束されたディメンジョンに対して精密に対応するインデックスを結合させることが可能である。異なる列順番が異なるクエリーにおける拘束されたディメンジョンの異なるパターンとマッチする場合に多数の連結されたインデックスを作成することは必要ではない。
【0395】
「STAR TRANSFORMATION」は、本システムを変換が使用される最善のプランを使用させる。このことは事実テーブル内にビットマップインデックスが存在しておりディメンジョンテーブルに関して充分な基準が存在している場合に発生する。
【0396】
スター変換はある特性を有するテーブルに対してサポートされることはない。例えば、以下の特性を有するテーブルはサポートされない。ビットマップアクセス経路と適合性のないテーブルヒントを有するテーブル、ビットマップインデックスが少な過ぎるテーブル(サブクエリーを発生することを考慮するためにオプティマイザーに対し事実テーブル列に関するビットマップインデックスが存在すべきである)、遠隔したテーブル(然しながら、遠隔ディメンジョンテーブルは発生されるサブクエリーにおいて許容される)、アンチジョイン型テーブル、サブクエリーにおいて既にディメンジョンテーブルとして使用されたテーブル、ビューのパーテションではなく実際にマージされなかったビューであるテーブル、良好な単一テーブルアクセス経路を具備するテーブル、及び変換が価値あるものであるためには小さ過ぎるテーブル等である。
【0397】
以下の例はクエリーにおいて早期に入れ子型選択の結果を減少させることを例示している。例えば、ユーザがFROM句内の入れ子型選択で以下のクエリーをエンターした場合。
【0398】
【表187】
ユーザは、以下に示したように、入れ子型選択で該基準を設定すべきである。そのようにして、入れ子型選択の結果は早期に減少させることが可能である。
【0399】
【表188】
OBJECT INSTANCE
最適化期間中にテーブルがアクセスされない場合には、本システムはSQLステートメント内にどのテーブルが存在しているかを見分けることが不可能である。例えば、以下のSQLステートメントにおいて、ASSIGNMENTS及びPROJECTSの両方はそれらのインデックスアクセスによってALL ROWSモードにおいて表わされるのみである。即ち、テーブルへアクセスすることは必要ではない。従って、ユーザがASSIGNMENTSに対するインデックス操作に関してクリックする場合に、SQLにおいてプランとSQLとの間の関係を識別するために何もハイライトされることはない。
【0400】
【表189】
本システムは、少なくとも、そのテーブルが全体的なSQLステートメントにおいてユニーク即ち独特のものであるか否かをチェックすべきである。そうである場合には、本システムは、ユーザがそのインデックス操作に関してクリックした場合にそのテーブルをハイライトすべきである。
【0401】
オブジェクトインスタンス
FROM句内に入れ子型即ちネストされた選択が存在している場合には、本システムは入れ子型選択内側のオブジェクトに対して与えられているOBJECT INSTANCE値のみならず入れ子型選択に与えられているOBJECT INSTANCE値を考慮することはない。
【0402】
代替的SQL
ユーザがFIRST ROWSモードを所望する場合には、一般的にはサブクエリーをFROM句へ移動させることは意味がない。マージは常に良好であるが、必ずしも移動に対してはそうではない。例えば、履歴データクエリーの例をチェックとすると良い。実際に、相関されているサブクエリーをそのままにさせるか、又は相関されていないものを相関されたものへ変換させることが意味がある場合がある。
【0403】
オリジナルのSQLが特定したもの以外のジョイン順番を要求するORDEREDヒントが付加される場合には、本システムはFROM句を並べ替え且つそれをデータベースへパスする。然しながら、本システムが並べ替える場合には、それは、未だに、パラメータと共にオリジナルのORDEREDヒントを示している。該パラメータは実際のヒントシンタックスの一部ではないので本システムはSQLに対するHINTSモードを表示する場合にそのORDEREDヒントに対するパラメータを落とす。例えば、EDITウインドウ内のオリジナルのSQLが以下のものである場合、
【表190】
このことはキーワードHINTS1の消滅及びFROM句の変化と一貫している。即ち、特定のモードに対するSQLウインドウはデータベースへパスされたものを正確に表示すべきである。これは、ジョイン基準がORDEREDヒントへ付加される場合になされるべきである。
【0404】
レポート
有用なレポートは、どの「インデックスされた列(単一列インデックス)」がヒストグラムを作成することから利点が得られる場合があるかを推薦するものである。ヒストグラムは正規分布を有するものではない列に関して構成されるに過ぎないので、正規分布を有することのない列を探すことが必要である。
【0405】
“HINTS”:ALL ROWSの場合、「テーブルへジョイン」インデックスがそのテーブルより大きい場合には、FULLとさせる。
【0406】
SQLチェック
サブクエリーが関係演算子、NOT IN又はALLのいずれかの形式とインターフェースされる場合には、本システムは以下のメッセージを表示し、且つ、可能である場合にはサブクエリーをハイライトすることが可能である。
【0407】
“サブクエリーが行をリターンしない場合(空のセット)、そのサブクエリーを包含する基準はTRUEへ評価し、即ち、それは、そのサブクエリーが1つの行をリターンしない場合にNOT EXISTSと全く同じに機能する。”
代替的SQL
サブクエリーが同一のテーブルを参照する基準内に供給する列をリターンする場合には、そのサブクエリーの選択リストはその代わりにROWIDを包含すべく変更されるべきである。例えば、以下の履歴クエリーを見てみると、
【表191】
は以下のものへ変換することが可能である。
【0408】
【表192】
ヒント
ヒントが適用される場合には、ユーザはヒントが影響を与えたか否かを判別せねばならない。本システムは、ヒントが所望の影響を及ぼさなかったことをユーザに知らせるためのフィードバックを提供することが可能である。例えば、本システムは、OREDEDヒントが特定した順番でジョインされたか否かをユーザへ知らせることが可能である。
【0409】
NOT IN又はNOT EXISTSサブクエリーを包含するクエリーの場合、推移性を適用することが可能であり、従って周囲即ち外部クエリーにおけるインターフェース列は同一のテーブルに属する。このことはNOT IN及びNOT EXISTSサブクエリーをマージさせる。何故ならば、テーブルは1つを超えるテーブルへアウタージョインさせることは不可能だからである。例えば、以下のSQLステートメント、
【表193】
は以下のものへ変換することが可能であり、
【表194】
次いで、以下のものへ変換することが可能である。
【0410】
【表195】
以下の例は、NOT IN及びNOT EXISTSサブクエリーをマージさせてジョインすることを例示している。例えば、以下のSQLステートメント、
【表196】
は以下のものへ変換され、
【表197】
然しながら、サブクエリーは以下のようにしてマージされるべきである。
【0411】
【表198】
本システムは、周囲即ち取囲みインターフェース列内の定数をサブクエリーへ移動させることにより、以下のようにして、SQL4をSQL5へ変換し次いでSQL6へ変換することが可能である。例えば、オリジナルのSQLステートメント、
【表199】
は以下のものへ変換することが可能であり、
【表200】
それは以下のものへ変換することが可能である。
【0412】
【表201】
以下のクエリーは、サブクエリーテーブルがマージされた場合にテーブルヘアウタージョインされねばならないので、変換することは不可能である。サブクエリーはそれ自身で定数へアウタージョインさせることは不可能である。
【0413】
【表202】
サブクエリーインターフェース列が定数である場合には、ジョインされた場合に全てのテーブルがユニーク即ち独特なものである場合には、マージを実施することが可能である。サブクエリーをマージする場合には、定数Θが対応する周囲即ち取囲みインターフェース列に対するNOT EQUALSへセットされ且つ「<child>.ROWID IS NULL」とOR処理される。例えば、SQLステートメント、
【表203】
は次のものへ変換することが可能である。
【0414】
【表204】
SQLステートメンを変換しようとする場合に注意をせねばならない。例えば、以下のSQLステートメント、
【表205】
を以下のものへ変換させようとすることが可能である。
【0415】
【表206】
然しながら、このことは正しいことではない。何故ならば、ここでオリジナルのSQLをアウタークエリーへマージさせることは不可能だからである。このことは正しくない変換となる。
【0416】
本システムが任意のテーブルで「ROWID IS NULL」句を付加しようとする場合に別の問題が発生する場合がある。例えば、時々、本システムはプロジェクトテーブルを選択し且つ、時々、それは、FROM句における順番に依存して、アサイメントテーブルを選択する場合がある。このことは正しいことではない。再開レベルのチャイルドテーブルがヌルであることを確かめるための注意を払うべきである(例えば、プロジェクトテーブル)。そうでない場合には、チャイルドテーブル(この場合にはプロジェクト)に対するジョイン基準は問題はない。
【0417】
以下のルール(規則)及びガイドラインは変換期間中に従われるべきである。
【0418】
A)本システムは以下の場合にのみ変換すべきである、
i)ジョイン順番における全ての中間テーブルはユニークネス即ち独自性を保証するためにジョインされるべきである
ii)1つを超えるブランチが存在する場合がある。然しながら、高々1つの再開レベルのチャイルドテーブルは非ユニークとすることが可能である。その他の全てのテーブルは順番にジョインされた場合にユニークとすべきである。換言すると、上のSQLをチェックする場合に、アサイメントテーブルはインターフェースしたサブクエリー列を具備するテーブルである。それは再開レベルのチャイルドではないので(プロジェクトテーブルがそれにジョインされている)、その選択リストにおける又はWHERE句におけるその列は定数とジョインし、オペレーターはユニークなキーを形成せねばならない。然しながら、emp seqはユニークな列ではない。従って、このサブクエリーはマージさせることが不可能である。然しながら、以下の例のSQL10は、プロジェクト名がユニークな列である場合に変換させることが可能である
iii)クエリーインターフェース列のうちの1つが定数である場合には、ユニーク性を保証するために全てのテーブルをジョインすべきである
iv)集合体関数は存在しない(GROUP BY、DISTINCT、HAVINGは集合体が存在しない限りオーケーである。マージされた場合に、GROUP BY及びDISTINCTを無視し且つHAVING基準をWHERE句へ移動させる)
v)CONNECT BYシンタックスは存在しない
vi)集合演算は存在しない(例えば、UNION、MINUS)
vii)サブクエリーはアウタージョインを包含することはない
B)各より低いレベルのチャイルドに対して、「<child>.ROWID IS NULL」を付加し且つそれらを一体的にOR処理する。
【0419】
C)周囲のインターフェース列内に定数が存在しており且つ他のインターフェース列が存在している場合には、それをサブクエリーWHERE句に対する等値基準へ変化させる。
【0420】
D)サブクエリーインターフェース列内の定数内に定数が存在する場合には、その定数を対応する周囲のインターフェース列に対するNOT EQUALSに対する定数に設定し且つそれを「<child>.ROWID IS NULL」とOR処理する。
【0421】
【表207】
アウタージョインが発生する場合があるかを決定する場合に相関型サブクエリーが問題を提起する場合がある。特に、NOT IN演算子が相関型サブクエリーとインターフェースする場合には、周囲(外部)クエリーにおけるインターフェース列はそのサブクエリーと相関しているテーブルと同一のテーブルに属するものでなければならない。例えば、すぐ下のSQLステートメントを参照すると良い。このサブクエリーにおけるインターフェース列はそのサブクエリーと相関されているテーブルと同一のテーブルに属すべきである。以下の例において、HIREDATE列は相関基準のうちの1つのみならず「e.」に属しているが、その他の相関基準は「a.」を参照する。従って、マージは不可能である。
【0422】
【表208】
上述したルール/ガイドラインA)i)及びA)ii)が真である限り、「[NOT IN]サブクエリー内のインターフェース列はそのサブクエリーと相関しているテーブルと同一のテーブルに属するものでなければならない」は必要ではない。然しながら、周囲の即ち外部のクエリーにおける対応するインターフェース列は、アウタージョインのために、同一のテーブルに属するべきである。変換された場合に、アサイメントテーブルはtime sheets及びemployeesの両方へアウタージョインすることを必要とする。このことは不法なことではない。然しながら、上に示したSQL11ステートメントを以下に示すSQL12へ変換させるために推移性を適用することが可能である。次いで、SQL12を以下に示したようにSQL13へマージさせることが可能である。このマージは、employees及びassignmentsの両方がインターフェース列上のユニークなインデックスを有するものであるので可能である。
【0423】
【表209】
注意すべきことであるが、NOT EXISTS OR NOT INサブクエリーをサブクエリー選択句内の非列(定数、関数等)とマージさせることは不可能である。例えば、以下のSQL14をSQL15へ変換する試みがなされる場合がある。然しながら、SQL15は、t.rpt date=‘22−FEB−94’のためにSQL14と同一の結果セットを発生することはない。該基準はt.rtp date<>‘22−FEB−94’ヘ変化させることが可能である。然しながら、少なくとも1つの行オリジナルのサブクエリーリターンを保証することが必要である。このことは変換の目的を台無しにする。何故ならばそのサブクエリーを維持せねばならないからである。
【0424】
【表210】
Set NOT IN NOT EXISTS Subquery Can Be Query
演算子がNOT IN又はNOT EXISTSである場合には、サブクエリーをジョインへ変換する試みをすべきか否かを決定するために以下のルーチンを呼ぶことが可能である。
【0425】
【表211】
【表212】
【表213】
WHERE句基準がFROM句内の入れ子型即ちネストされている選択内のテーブルを参照するに過ぎない場合には、それを入れ子型即ちネストされている選択へ移動させる。例えば、以下のSQL
【表214】
を以下のものへ変換することが可能である。
【0426】
【表215】
HAVING句基準がグループ関数を関与するものでない場合には、それはWEHRE句へ移動させることが可能である。例えば、以下のSQLステートメント
【表216】
を以下のものへ変換することが可能である。
【0427】
【表217】
本開示は1つ又はそれ以上の従来の汎用デジタルコンピュータを使用して実現することが可能であり及び/又は本明細書の示唆に従ってプログラムすることに役立つ。適宜のソフトウエアコーディングは本開示の示唆に基づいて容易に調整することが可能である。
【0428】
更に、上の説明は特定のデータベースシステム(例えば、オラクル)を参照するものであるが、本開示は任意の特定のデータベース又はデータベースシステムのタイプへ制限されるものとして理解すべきではない。
【0429】
本開示の多数の付加的な修正及び変形例が上の示唆に鑑み可能である。従って、添付の請求の範囲内において、本開示をここに特定的に記載したものとは別に実施することが可能であることを理解すべきである。
【図面の簡単な説明】
【図1】1実施例に基づくデータベースクエリーチューニングプロセスを示したブロック図。
【図2】SQLステートメントを包含するダイアログディスプレイを示した概略図。
【図3】選択最適化モードダイアログディスプレイを示した概略図。
【図4】お気に入りウインドウディスプレイを示した概略図。
【図5】SQLチェックダイアログディスプレイを示した概略図。
【図6】結果ウインドウディスプレイを示した概略図。
【図7】編集又はチューニングウインドウディスプレイを示した概略図。
【図8】詳細結果ウインドウディスプレイを示した概略図。
【図9】本システム及び方法を適用することが可能なコンピュータシステムを示したブロック図。
【図10】種々のSQLステートメントにおけるテーブルに対するヒエラルキーを示したチャート。
【図11】種々のSQLステートメントにおけるテーブルに対するヒエラルキーを示したチャート。
【図12】種々のSQLステートメントにおけるテーブルに対するヒエラルキーを示したチャート。
【図13】種々のSQLステートメントにおけるテーブルに対するヒエラルキーを示したチャート。
【発明の属する技術分野】
本発明はデータベースに関するものであって、更に詳細には、データベースクエリーを自動的に発生するシステム及び方法に関するものである。
【0002】
【従来の技術】
構造化問い合わせ言語 (SQL)はデータベースと対話するためのANSI標準言語である。SQLはデータベースからデータを検索するためにデータベースにおける多数の異なる組のレコード (テーブル)から情報をユーザが結合することを可能とさせる。然しながら、SQLの能力は幾つかの欠点を有している。例えば、ユーザはSQLクエリーにおいて異なるテーブルを結合させることが可能であるが、そのことはデータベースエンジンが解決することが不可能となる場合があるか又は著しい量のシステム資源を使用する場合があるクエリーを作成する場合がある。
【0003】
データベースシステムは、しばしば、性能調整 (チューニング)システム乃至は方法を有している。例えば、オラクル7は1つ又はそれ以上のレポートにおいてデータベースの動作状態を要約することにより性能チューニング即ち調整を助けるために使用することが可能な種々のスクリプト (例えば、UTILBSTAT及びUTLESTAT)を提供している。これらのスクリプトはシステムにわたってのデータベース性能統計のスナップショットを獲得し且つオペレータがデータベースの性能を最適化することを助けることが可能なレポートを発生するのに有用な1組のSQLスクリプトである。データベースオペレータはデータベースの性能の微調整及びデータベースの予防的メインテナンスのために該レポートを使用することが可能である。レポートは、例えば、ライブラリィキャッシュ、ディクショナリィキャッシュ、ラッチ利用、ファイルI/O及びロールバック統計を包含するデータベースメモリオブジェクトに関する情報を包含することが可能である。
【0004】
既存のシステムにおける問題は、最適な実行プランを発生するのにかかる時間をしばしば制限するということである。更に、オブジェクト統計が存在する場合には、知識を有するユーザはそのオブジェクト統計によって表わされるよりもデータに関してより多くの洞察を有する場合がある。既存のシステムは、しばしば、ユーザの知識を利用するものではない。更に、適切に調整され且つ分析される場合にはスタティスティックス即ち統計は有用なものである場合があるが、オブジェクトが未だに分析されていない場合には統計が全く存在しない場合があり、又統計が時代遅れのものである場合がある。データの分布に関しての洞察を与える特定の統計は特定のインスタンスにおいて存在しない場合がある。一方、ユーザはそうでない場合には使用可能なものでない場合があるデータベースクエリーをチューニング即ち調整するのに有用である場合のある直接的な知識を有している場合がある。例えば、ユーザは例えシステムが通常完全に使用されている場合であっても、例えばマルチCPU等のより多くの資源が使用可能である場合にそのクエリーが一度に実行されることを知っている場合がある。このような情報はデータベースクエリーチューニング (調整)処理期間中に非常に役立つものである場合がある。
【0005】
【課題を解決するための手段】
データベースクエリーをチューニング即ち調整する方法が、データベースクエリーを選択し、該選択したデータベースクエリーをパース即ち解析して該選択したデータベースクエリーの一部の間の関係を決定し、複数個の使用可能な最適化モードから1つの最適化モードを選択し、該決定した関係及び該選択した最適化モードに基づいて該選択したデータベースクエリーの少なくとも一部を修正することによって該選択したデータベースクエリーをチューニング即ち調整し、且つ該修正したデータベースクエリーを表示することを包含している。
【0006】
該パース即ち解析は、該データベースクエリー内のトークンを決定することが可能であり、トークンはデリミター即ち区切り記号によって分離されているワードである。該複数個の使用可能な最適なモードはコストベースモード即ちコストを基礎としたモード及びルールベースモード即ちルール (規則)を基礎としたモードを包含することが可能である。コストを基礎としたモードはFirst Rows (第一行)モード及びAll Rows(全行)モードを包含することが可能である。本方法は、更に、該調整したデータベースクエリーを使用することに関連するコストを決定することを包含することが可能である。本方法は、更に、該選択したデータベースクエリーを使用することに関連するコストと該調整したデータベースクエリーを使用することに関連するコストとを比較することを包含することが可能である。本方法は、更に、該データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つによってジョイン (join)されている少なくとも1つのサブクエリーを包含するか否かを決定するために該選択したデータベースクエリーをパース即ち解析することを包含することが可能である。本方法は、更に、該データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つを包含するか否かに基づいてチューニング即ち調整期間中に使用すべきお気に入りをユーザが選択することのプロンプトを与えることを包含することが可能である。
【0007】
該お気に入りは、NOT EXISTS演算子のNOT IN演算子への変換及び該選択したデータベースクエリーのアウタージョイン (outer join)への変換のうちの少なくとも1つをユーザが選択することを可能とするお気に入り書き直しを包含することが可能である。該お気に入りは、ALL演算子によってジョインされたサブクエリーをジョイン又はアウタージョインへ変換させることをユーザが選択することを可能とするお気に入り書き直しを包含することが可能である。該お気に入りは、NOT IN演算子によってジョインされているサブクエリーを変換するためにNOT EXISTS演算子及びアウタージョインのうちの少なくとも1つを使用するか否かをユーザが選択することを可能とするお気に入り書き直しを包含することが可能である。
【0008】
コンピュータ格納 (記憶)媒体が、データベースクエリーをチューニング即ち調整するためのコンピュータ実行可能コード、ユーザがデータベースクエリーを選択することを許容するコンピュータ実行可能コード、該選択したデータベースクエリーの一部の間の関係を決定するために該選択したデータベースクエリーをパース即ち解析するコンピュータ実行可能コード、複数個の使用可能な最適化モードから1つの最適化モードをユーザが選択することを許容するコンピュータ実行可能コード、該決定した関係及び該選択した最適化モードに基づいて該選択したデータベースクエリーの少なくとも一部を修正することによって該選択したデータベースクエリーをチューニング即ち調整するコンピュータ実行可能コード、及び該修正したデータベースクエリーを表示するコンピュータ実行可能コードを包含している。
【0009】
データベースクエリーをチューニング即ち調整するプログラムされているコンピュータシステムが、ユーザに対して少なくとも1つのデータベースクエリーを表示するディスプレイ、該表示されたデータベースクエリーの中からのデータベースクエリー及び複数個の使用可能な最適化モードからの最適化モードをユーザが選択することを許容するユーザ入力、該選択したデータベースクエリーの一部の間の関係を決定するために該選択したデータベースクエリーをパース即ち解析し且つ該決定した関係及び該選択した最適化モードに基づいて該選択した該データベースクエリーの少なくとも一部を修正することによって該選択したデータベースクエリーをチューニング即ち調整するためのプロセッサを有しており、該修正したデータベースクエリーが該ディスプレイを介してユーザへ表示される。
【0010】
【発明の実施の形態】
図面に示した本発明の開示の好適実施例を説明する上で、説明の便宜上特定の用語を使用する。然しながら、本開示はそのように選択された特定の用語に制限されるべく意図されているものではなく、各特定の要素は同様の態様で動作する全ての技術的均等物を包含するものとして理解すべきである。
【0011】
本開示は性能を向上させるためにデータベースクエリーを自動的に調整するシステム及び方法に関するものである。例えば、本システム及び方法は最適な実行プランを発生するために構造化問い合わせ言語 (SQL)ステートメント即ち文をチューニング即ち調整することが可能なデータベース管理システム (DBMS)の形態とすることが可能である。1つの側面においては、本開示はデータベース構造の文脈においてデータベースクエリーを分析し且つDBMS構造の文脈において実行することが可能であるように該クエリーを修正及び/又は再構成するシステム及び方法に関するものである。更に、本開示のシステム及び方法は、該クエリーによって使用されるDBMS資源を最小化させ且つ該クエリーが完成されることを確保するためにデータベース関係構造を使用することが可能である。
【0012】
これらの結果を達成するための1つの態様は、SQLステートメントの修正及び/又は再構成を可能とさせるカスタムデータ構造へSQLステートメントをパース即ち解析 (分解)することである。1例として、例えば、FROM句における各テーブルを、参照完全性に対してチェックし且つ、例えば、ユーザのWHERE条件に対して比較することが可能であり、且つWHERE条件は正しいアウタージョイン (outer join)仕様に対してチェックすることが可能である。
【0013】
本システムはSQLステートメントを解析し且つ各トークンを追跡し、どのようにしてテーブルがジョイン (join)されるか及びSQLステートメントの部分部分の間の関係を解析する。トークンはデリミター即ち区切り記号によって分離されたSQLステートメント内の任意のワードとすることが可能である。テーブル列名を表わすトークンはSQLステートメント内に存在するジョイン及びその他の関係を識別するために使用することが可能である。本システム及び方法は、例えば、ジョインの順番を変化させることが可能であり且つ最高の性能のためにSQLステートメントを調整するためにサブクエリーを移動することが可能である。本システム及び方法はメインフレーム、パソコン (PC)、ハンドヘルドコンピュータ等のコンピュータシステム上で稼動するソフトウエアアプリケーションの形態で実現することが可能である。該コンピュータシステムをデータベースへリンクさせることが可能である。そのリンクは、例えば、直接的なハードワイヤ又は無線接続等の直接的リンクを介して、例えばローカルエリアネットワーク等のネットワーク接続を介して、又はインターネットを介してのものとすることが可能である。
【0014】
本システム及び方法を実現することが可能なコンピュータシステムの1例を図9に示してある。大略システム200として示されるコンピュータシステムは、中央処理装置 (CPU)202、メモリ204、プリンタインターフェース206、ディスプレイユニット208、LAN (ローカルエリアネットワーク)データ送信制御器210、LANインターフェース212、ネットワーク制御器214、内部バス216及び例えばキーボード、マウス等の1個又はそれ以上の入力装置218を有することが可能である。図示した如く、システム200はリンク222を介してデータベース220へ接続することが可能である。
【0015】
図1は性能を向上させるためにSQLステートメントをチューニング即ち調整するための本開示の1実施例に基づく処理を示している。ユーザは、最初に、調整することを所望するSQLステートメントを選択する (ステップS2)。例えば、ディスプレイユニット208上に表示されるSQL編集ウインドウから、ユーザはSQLステートメントの始めにカーソルを配置させ、マウスを左クリックし且つSQLステートメントの終わりまでスクロールダウンし、次いでマウスボタンを解放させることによって調整することを所望するSQLステートメントをハイライトさせることが可能である。このことはSQLステートメントをハイライトさせる。次いで、ユーザは、例えば、適宜のボタンをクリックすることによってツールメニュー (不図示)からSQLチューナー (調整器)オプションを選択することが可能である。
【0016】
次いで、調整されるべきハイライトされたSQLステートメントは、図2に示した如く、SQLチューナーウインドウ1内に表示される (ステップS4)。次いで、ユーザはそれが調整することを所望するSQLステートメントであることを確認するために表示されているSQLステートメント2を観察することが可能である。次いで、ユーザはバック (戻り)ボタン3、次ぎへボタン4、終了ボタン5又はキャンセルボタン6をクリックするオプションを有している。戻りボタン3は前のウインドウへ戻り、ユーザが異なるSQLステートメントを選択することを可能とさせる。キャンセルボタン6は表示されているSQLステートメント2に対して何等変更をなすことなしにSQLチューナーウインドウ1から出る。次へボタン4は次のウインドウ (図3に示してある)へ移動し、後に説明するようにユーザが最適化モード設定を選択することを可能とさせる。終了ボタン5は現在の最適化モード設定を使用してSQLチューニング (調整)処理を稼動させる。
【0017】
本システムは幾つかの最適化モードを使用し、且つ幾つかの異なるお気に入り書き直しを使用して動作することが可能である。次へボタン4がユーザによってクリックされた後に、本システムはSQLステートメントをパース即ち解析 (分解)し (ステップS6)且つ図3に示したように最適化選択モードウインドウ11を表示する。SQLステートメントが、例えば、どのような演算子、機能等がそのステートメント内に存在するかを決定すべくチェックされる。本システムは、又、SQLステートメント内のサブクエリーがNOT EXISTS、NOT IN、ALL句によってジョインされているか否かを決定すべくチェックを行う。本システムは、又、テーブルスタティスティックス (統計)もチェックする。例えば、テーブルに関してANALYZEコマンドを実行する場合にオラクル等のシステムによって発生されるテーブルスタティスティックス (統計)をチェックすることが可能である。テーブルスタティスティックス (統計)は、行数 (NUM ROWS)、ハイウォーターマーク下側のデータブロック数 (例えば、現在データを包含しているか又は空であるかに拘わらずにデータを受取るべくフォーマットされているデータブロックの数)(BLOCKS)、使用されたことのないテーブルに割当てられているデータブロック数 (EMPTY BLOCKS)、バイトでの各データブロックにおける平均使用可能自由空間 (AVG SPACE)、チェーン化した行数 (CHAIN COUNT)、バイトでの行のオーバーヘッドを含む平均行長 (AVG ROW LEN)を包含することが可能である。
【0018】
充分な情報が存在する場合には (例えば、関連するデータに対するスタティスティックス即ち統計が存在する)、本システムは自動的に最適化モードを選択する。選択化された選択化モードはラジオボタン7−9によって表示される。例えば、コストを基礎とした最適化 (FIRST ROW又はALL ROWS)モードは、関連するテーブルに関してスタティスティックス即ち統計が存在する場合には良好な結果を発生するので、自動的に選択され得る。ステップS8において、本システムが最適化モードを自動的に選択するためにテーブルスタティスティックス (統計)において不充分な情報が存在しているか又はユーザが本システムによって自動的になされる最適化モード設定を変更することを所望する場合には、ユーザは、図3に示したように、最適化選択モードウインドウ11におけるラジオボタン7−9のうちの1つをクリックすることによって最適化モードを手作業により選択することが可能である。ユーザは、又、お気に入りボタン10をクリックすることによって、後に詳細に説明するように、ウインドウ11からお気に入り書き直し設定を修正することが可能である。
【0019】
1つのコストを基礎とした最適化モードはALL ROWSモードと呼称される。ALL ROWSモードは、SQLステートメントにおいて参照されているテーブルのうちの少なくとも1つに関してスタティスティックス即ち統計が存在している場合に、本システムによってデフォルトとして自動的に選択される。ALL ROWSモードはバッチ処理に対して高速のスループットを提供する。次いで、ユーザは、SQLステートメントがセットされた演算子 (例えば、UNION、INTERSECT、MINUS、UNION ALL)、GROUP BY句、FOR UPDATE句、集合 (aggregate)機能、又はDISTINCT演算子を包含するものでない限り、ラジオボタン8をクリックすることによってFIRST ROWSモードを選択するオプションを有している。SQLステートメントがセットされたオペレータ (例えば、UNION、INTERSECT、MINUS、UNION ALL)、GROUP BY句、FOR UPDATE句、集合機能、又はDISTINCT演算子を包含している場合には、ユーザ2はFIRST ROWSモードを選択するオプションは与えられない。ユーザがラジオボタン7をクリックすることによってもALL ROWSモードを手作業によって選択することが可能である。
【0020】
本システムがそのセッションに対して使用するための最適化モードをその他の態様で決定することが不可能である場合には、本システムによってFIRST ROWSモードを自動的に選択することが可能である。ライン処理に対する高速の応答時間が所望される場合には、FIRST ROWSモードを手作業によって選択することが可能である。
【0021】
別のモードは規則を基礎としたモードと呼称される。規則を基礎としたモードは、参照されたテーブルのいずれに関してもスタティスティックス即ち統計が存在しない場合に、本システムによって自動的に選択される。規則を基礎としたモードはラジオボタン9をクリックすることによって手作業により選択することが可能である。
【0022】
SQLステートメントがNOT EXISTS、NOT IN又はALL句によってジョインされたサブクエリーを包含していることがパース処理期間中に判別された場合に (ステップS6)、お気に入りボタン10がウインドウ11においてアクティブ即ち活性状態とされる (図3)。お気に入りボタン10をクリックすることは、NOT IN演算子、NOT EXISTS演算子、及びALL演算子によってジョインされているサブクリエィを書き直しためにユーザがお気に入り書き直しを使用することを特定することを可能とする。
【0023】
例えば、NOT EXISTS演算子に対するお気に入り書き直しを特定することが可能であり、その場合にユーザがNOT EXISTS演算子のNOT IN演算子への変換及び/又は該ステートメントのアウタージョインへの変化を選択することを可能とする。ALL演算子に対するお気に入り書き直しを特定することが可能であり、その場合にユーザが該ステートメントのジョイン又はアウタージョインへの変換を選択することを可能とする。NOT IN演算子に対するお気に入り書き直しを特定することが可能であり、その場合にユーザがNOT IN演算子のNOT EXISTSへの変換又は該ステートメントのアウタージョインへの変換を選択することを可能とする。
【0024】
周辺のインターフェース列がNOT NULLとして定義されているインスタンスへの変換を制限するオプションを選択することによって書き直しに対しユーザによりお気に入りを更に定義することが可能である。
【0025】
本システムが、常に、必要である場合に該ステートメントに対してIS NOT NULL基準を変換及び付加することをユーザが特定することも可能である。
【0026】
お気に入りボタン10がユーザによってクリックされると、図4に示したようにお気に入りウインドウ50が表示される。次いで、チューナータブ51をクリックすることによってSQLチューナーお気に入り頁52を表示させることが可能である。このウインドウにおけるオプションは、演算子ALL、NOT IN、NOT EXISTSによってジョインされているサブクエリーに対して上述したようにお気に入り書き直しをユーザが設定することを可能とする。
【0027】
図4において示した例においては、NOT EXISTS演算子に対するお気に入り書き直しを設定するために、ユーザはプルダウンメニュー53からNOT EXISTS演算子を選択する。これはNOT EXISTS演算子に対して使用可能なオプションのリストを表示する。例えば、次いで、ユーザは、「NOT EXISTS演算子を介してジョインされているサブクエリーをNOT INへ変換」(チェックボックス55)「NOT EXISTS演算子を介してジョインされているサブクエリーをアウタージョインへ変換」(チェックボックス56)のオプションに対する適宜のチェックボックスを選択するか又は選択しないことによりNOT EXISTS演算子によってジョインされているサブクエリーを変換するためにNOT IN及び/又はアウタージョインを本システムが使用することを可能とするか否かを特定することが可能である。「NOT EXISTSを介してジョインされているサブクエリーのNOT INへの変換」(チェックボックス55)オプションが選択されると、オプションボックス57及び58がアクティブとなる。オプションボックス57はユーザが「アウタークエリーにおけるジョインされた列に関するNOT NULL条件に対するチェック」オプションを選択することを可能とし、且つオプションボックス58はユーザが「サブクエリー内のジョインされた列に関しNOT NULL条件に対するチェック」オプションをユーザが選択することを可能とする。ユーザは、チェックボックス59及び60を夫々選択するか又は選択しないことによりこれらのオプションの一方又は両方を選択することが可能である。次いで、各選択されたオプションボックスに対して変換オプションがアクティブとなる。例えば、ラジオボタン61及び63を夫々クリックすることによって「列がNOT NULLとして定義されている場合にのみ変換」をアウタークエリー及びサブクエリーに対して選択することが可能であり、且つラジオボタン62及び64を夫々クリックすることによって「常に変換及び必要な場合に「IS NOT NULL」を付加」を選択することが可能である。次いで、ユーザは、特定したお気に入りを保存し且つお気に入りウインドウから出るために「OK」ボタン54をクリックすることが可能である。キャンセルボタン66を選択することは、お気に入りに対してなされた変更に保存することなしにウインドウ52から出る。ヘルプボタン65を選択すると、ユーザに対してヘルプメニューを表示する。
【0028】
同様の態様で、ALL演算子に対するお気に入り書き直しを設定するために、ユーザはプルダウンメニュー53から「ALL演算子」を選択してオプションのリストを表示する。次いで、「ALL演算子を介してジョインされているサブクエリーをジョイン又はアウタージョインへ変換」オプションを選択するか又は選択しないことにより本システムがALL演算子によってジョインされているサブクエリーをジョイン又はアウタージョインへ変換することを可能とするか否かを特定するオプションがユーザに提示される。
【0029】
ユーザがこのオプションを選択すると、次いで、「アウタークエリーにおけるジョインされた列に関するNOT NULL条件に対するチェック」及び「サブクエリーにおけるジョインされた列に関するNOT NULL条件に対するチェック」に対するオプションがユーザに提示される。次いで、ユーザはこれらのオプションのうちの一方又は両方を選択することが可能である。選択されたこれらのオプションの各々に対して、次いで、「列がNOT NULLとして定義されている場合にのみ変換」及び「常に変換及び必要な場合に「IS NOT NULL」を付加」の2つの変換オプションがユーザに提示される。
【0030】
次いで、ユーザは「OK」ボタンをクリックして特定したお気に入りを保存し且つお気に入りウインドウから出ることが可能である。
【0031】
NOT IN演算子に対するお気に入り書き直しを設定するために、ユーザはプルダウンメニュー53からNOT IN演算子を選択してオプションのリストを表示する。次いで、ユーザは、「NOT IN演算子によってジョインされたサブクエリーをNOT EXISTSへ変換」及び「NOT IN演算子を介してジョインされたサブクエリーをアウタージョインへ変換」のオプションを選択するか又は選択しないことによりNOT IN演算子によってジョインされたサブクリエィを変換するために本システムがNOT EXISTS演算子及び/又はアウタージョインを使用することを可能とするか否かを特定することが可能である。
【0032】
選択された各オプションに対して、次いで、アウタークエリーにおけるジョインされた列に関するNOT NULL条件に対してチェックし且つサブクエリーに対するジョインされた列に関してNOT NULL条件をチェックするためのオプションがユーザに提示される。ユーザはこれらのオプションのうちの1つ又は両方を選択することが可能である。次いで、各選択されたオプションに対して変換オプションがアクティブとなる。即ち、列がNOT NULLとして定義されている場合にのみ変換すること又は常に変換し且つ必要である場合に「IS NOT NULL」を付加することのオプションがユーザに与えられる。従って、アウタークエリー及び/又はサブクエリーに関してジョインされた列に対する変換オプションをユーザが選択することが可能である。ユーザは「OK」ボタン54をクリックして特定したお気に入りを保存し且つお気に入りウインドウから出る。お気に入りウインドウから出ると、ディスプレイは最適化モード選択ウインドウ11 (図3)ヘ戻る。ステップS8が完了し且つユーザが最適化モード及びお気に入り選択に満足した後に、本処理は次へボタン8をクリックすることによって継続して行うことが可能である。
【0033】
ステップS10において、本システムは参照完全性、アウタージョイン及び/又はNULL論理問題に対してSQLステートメントをチェックする。エラー又は非効率性が見つかると、その問題を矯正するためにSQLステートメントを変更する特定の提案が表示される。例えば、無効な結果組を発生することが可能な無効なアウタージョインに対して提案を表示することが可能である。無効な結果組を発生するNULL論理問題、HAVING句の正しくない使用、カーテシアン (cartesian)プロダクト即ち直積、より良いインデックスの利用のためのジョイン基準における表現、より良いインデックスの利用に対する非ジョイン基準における表現、及びインデックスされていないフォーリン (foreigen)キー即ち外部キー等に対して提案を表示することも可能である。
【0034】
ステップS12において、図5に示したようなSQLチェックウインドウ70がユーザに対して表示される。ウインドウ部分73はそのステートメントにおける各サブクエリーのダイアグラムを表示する。SQLステートメントにおける各テーブルはテーブル名及びエイリアスを包含するヘッダーを具備するボックスとして表示される。プライマリィ (primary)キー、フォーリンキー及びユニークキーも各テーブルに対して表示される。
【0035】
テーブル間の緑色の線は正しいジョインを表わす。赤色の線がテーブルを接続する場合には、そのジョインがエラーを包含している (例えば、参照完全性侵害又は不適切なアウタージョイン)。青色の線がテーブルを接続する場合には、そのジョインは参照完全性を欠如するために非効率的である。
【0036】
SQLステートメントに対して提案された補正がウインドウ部分71内に表示される。ウインドウ部分のいずれかに包含される情報の全てを見るために所望によりユーザによってSQLチェックウインドウ70の寸法を変更することが可能である。
【0037】
「次のSQLモジュール」ボタン72及び「前のSQLモジュール」ボタン74をクリックするとSQLステートメントにおける個々のサブクエリーを青色でハイライトし且つハイライトされたサブクエリーの関連するダイアグラムのみを表示する。
【0038】
次いで、ユーザはオリジナルのステートメントか又は固定されたステートメントのいずれかのSQLステートメントを調整するかを決定することが可能である (ステップS14)。例えば、「オリジナルのSQLを調整」ボタン76をクリックするとSQLチェックウインドウ70の底部におけるフィールド75内に表示されるオリジナルのSQLステートメントを調整する。「固定したSQLを調整」ボタン78をクリックすると、SQLチェックウインドウ71の右側におけるフィールド71内に表示される提案された補正を実施し、次いで、補正したSQLステートメントを調整する。
【0039】
ステップS16において、そのステートメントを最適化させるために1つ又はそれ以上のステップを実施することによって選択されたSQLステートメントを調整する。例えば、本システムはジョイン基準において推移的変化を行うことが可能であり、全てのサブクエリー変換 (トランスフォーメーション)を決定することが可能であり、必要である場合には非ジョイン基準において推移性を決定することが可能であり、且つジョイン順番を決定することが可能である。本システムは幾つかの変換したSQLステートメントを発生することが可能である。次いで、本システムは変換したSQLステートメントのうちでどれが最善の性能を有しているかを決定することが可能でありその結果得られるSQLステートメントをソートすることが可能である。
【0040】
SQLステートメント (チューニング)又は変換する場合に、本システムは周りのクエリーの列が同一のテーブルに属するか否かを判別するためにチェックし、必要である場合には推移的変化を行うことが可能である。それが同一のテーブルに属するものでない場合には、本システムは、ジョイン基準のどれかがそのサブクエリーをインターフェースする列を参照するか否かを判別するためにチェックし且つその等価な列を識別する。本システムはそのサブクエリーとインターフェースする各列に対してこのことを行い、次いで、遷移的特性を使用して列の全てが同一のテーブルに属するセット即ち組を見つけようとして等価な列の順列を発生する。本システムは、NOT IN演算子を介してジョインされた非相関型サブクエリー及びNOT IN、NOT EXISTS、又はALL演算子でインターフェースされた相関型サブクエリーに対して推移的変化を行うことが可能である。
【0041】
本システムは、又、各サブクエリーを評価し且つそのトランスフォーメーション即ち変換の各々に対してランクを割当てることによってSQLシンタックスに対して実施することが可能な全てのサブクエリー変換 (トランスフォーメーション)を決定することが可能である。トランスフォーメーション即ち変換は強制的 (常にそうであるか又はそうでない)又はオプションとすることが可能である。次いで、この情報を使用して種々の代替的SQLバージョンを発生する。例えば、SQLステートメントが4個のサブクエリーを包含している場合には、本システムはサブクエリーのどれにも「常に変換 (always transform)」とはせず、1つを「決して変換せず(never transform)」とし、且つ3個を「オプション(option)」としてランク付けを行い可能な代替的SQLステートメントを発生することが可能である。
【0042】
即ち、トランスフォーメーション即ち変換のタイプが、その変換が常に行われるべきであるか、決して行われるべきでないか、又はオプションによって行われるべきであるかを決定する。例えば、変換が行われた場合にはオプティマイザー (最適化器)がより良いプランを使用するのでいつくかの変換が望ましい場合がある。この場合には、その変換は常に行われるべきである。従って、その変換には最も高いランクが割当てられる。変換が行われた場合にはオプティマイザー即ち最適化器がより効率の悪いプランを使用するのである変換は望ましいものでない場合がある。この場合には、その変換は行われるべきではない。従って、その変換には最も低いランクが割当てられる。ある変換はその他のファクターにも依存する場合があるので、より良い最適化プランが選択されることとなる場合とならない場合とがある。この場合には、その変換はオプションによって行うことが可能である。従って、その変換には中間のランクが割当てられる。
【0043】
サブクエリー (subquery)変換を実施した後に、本システムは互いに置換させることが可能な非ジョイン基準 (non−join criteria)における等価な列を識別し且つ置換を行う。このことはデータベース (例えば、オラクル等)が連結したキーインデックスを利用することを可能とするためにSQLステートメントを本システムが書き直すことを可能とする。
【0044】
例えば、以下のSQLステートメントにおいて、DEPENDENTSのサブクエリーに関するe.emp seq基準はa.emp seq又はt.emp seqへインターフェースさせることが可能である。
【0045】
【表1】
【0046】
以下に示すようにe.emp seqをe.emp seqへスイッチすること (行5)は、データベースがASSIGNMENTSに関して連結されたキーインデックスを使用することを可能とする。
【0047】
【表2】
【0048】
列を等価させる等価ジョイン基準が存在する場合には、種々の列は別の列を置換させることが可能である。然しながら、本システムは、又、ジョイン基準とAND処理される非ジョイン基準に対する推移性を使用することが可能である。非ジョイン基準がジョイン基準とOR処理される場合には、その結果発生する推移性は使用すべきではない。
【0049】
マルチ列オペランド (被演算子)が推移性 (transitivities)を有している場合には、本システムはその列をオペランドへ付加し、且つ選択リスト上に対応する列を複製する。全てのマルチ列推移性がオリジナルのステートメントを除いて、各変換して使用される。そのオペランドがアウタージョイン型基準を介して別の列と等価である場合には、その等価な列を使用することは不可能である。
【0050】
FROM句が、GROUP BYシンタックス又は集合体を有することのない入れ子選択ステートメントを有しており且つメインクエリーがそのメインクエリーと入れ子選択の間のジョイン列のうちの1つを参照する非ジョイン基準を有している場合には、本システムはオリジナルを包含するSQLステートメントの全てのコピーにおいて入れ子選択ステートメントにおける非ジョイン基準を複製する。
【0051】
本システムはジョインの順番を決定するためにORDEREDヒントを使用することが可能である。ORDEREDヒントは、SQLステートメントにおけるFROM句においてそれらが表われる順番にオプティマイザーをして強制的にテーブルをジョインさせる。このことは、特定の順番でFROM句において参照されるテーブルをジョインするようにSQLステートメントが書かれることを可能とする。本システムは、最初に、ORDEREDヒントなしでSQLステートメントをテストする。次いで、本システムは、特定のジョイン順番を強制するための異なるドライビングテーブルでORDEREDヒントを使用して付加的な順列を作成し、尚ドライビングテーブルは、例えば、入れ子ループジョイン操作におけるペアレントテーブルである。ドライビングテーブルからの各行は、ジョイン操作を完了するためにジョインさせたテーブルにおけるマッチングする行を見つけるために使用することが可能である。
【0052】
変換したSQLステートメントのデフォルトのジョインがオリジナルのSQLステートメントよりも良好なコスト/行値を有している場合には、ORDEREDヒントがより効率的なプランを発生する蓋然性が最も高いが、デフォルトのジョイン順番での初期的な変換よりもより高いコスト/行である。本システムは可能な最善の解決としてORDERED変換を表示することが可能である。
【0053】
作成された代替的SQLステートメントの各々の中から最善の性能を決定するために、本システムはオリジナルのSQL及び書き直し処理によって発生されたSQLステートメントの各々に対してコストスタティスティック (費用統計)を発生する。そのSQLと関連するプランを作成した後にコストが決定される。例えば、オラクルのEXPLAIN PLANステーメントは、オプティマイザー (最適化器)がそのSQLステートメントを実行するために使用するプランを発生するために使用することが可能である。そのEXPLAIN PLANステートメントはオプティマイザー (最適化器)がそのSQLステートメントを実行するために使用する計画であるステップを記述する実行プランを得るためにSQLステートメント上で稼動させることが可能である。オラクルは、又、そのプランにおける各ステップに対する数 (例えば、コスト)を提供する。そのコストはそのプランにおけるステップを実行するための相対的な利用数である。そのプランに対する全体的なコストに到達するためにそのプランにおけるステップの全てに対してコストを加算することが可能である。本システムはデータベースによって計算されたコストを行数によって割算してSQLステートメントの各々に対してコスト/行の値を発生することが可能である。コストは、又、そのプランによって必要とされる論理的読取数によって決定することが可能である。コストを決定した後に本システムは昇順で (最低コストから最高のコストへ)SQLステートメントをソートする。
【0054】
ステップ (S18)において、本システムは図6に示したような結果ダイアログウインドウ90内に最低のコストを有するSQLステートメント及びオリジナルのSQLステートメントを表示する。オリジナルのSQLステートメントはウインドウ部分92内に表示され且つ提案された代替的SQLステートメントはウインドウ部分94内に表示される。次いで、ユーザは提案された代替的SQLステートメントをオリジナルのSQLステートメントと比較し、その違いを検査し、次いでオリジナルのSQLステートメントを調整したSQLステートメントで置換することを所望するか否かを選択することが可能である。
【0055】
次いで、置換SQLボタン100をクリックすると、オリジナルのSQLステートメントをウインドウ94内に示されている提案された代替的SQLステートメントと置換させる。本システムは、図7に示したように、コメントを付加し且つ調整したSQLステートメントを編集即ちチューニング (調整用)ウインドウ104内に表示する。図7に示したように、該コメントはデータスタンプ、そのステートメントがチューニング即ち調整されたことを表わし且つ使用した最適化モード (この例においてはALL−ROWS)を識別する情報を包含することが可能である。戻りボタン96をクリックすると前のウインドウへ戻る。より詳細ボタン98をクリックすると図8に示したように詳細結果ウインドウ106が開かれる。調整されたSQLステートメントがウインドウ部分108内に表示される。行110はオリジナルのSQLステートメントに対するコストスタティスティックス即ち費用統計を表示し且つ1個又はそれ以上の行112が調整した代替的SQLステートメントに対するコストスタティスティックス即ち費用統計を表示する。これらのスタティスティックス即ち統計は、SQLを実行するのに必要とされる時間の量 (秒単位)である経過時間114、SQLを実行するのに必要とされる毎秒CPUサイクル数であるCPU時間116、SQLを実行するのに必要とされる論理的読取数であるLog読取118、SQLを実行するのに必要とされる物理的読取数である物理的読取120、を包含することが可能であり、行122はSQLがリターンする行数であり且つコスト/行124はデータベースとのコストを行数で割算したものである。
【0056】
詳細結果ウインドウ106はユーザがその必要性に最も適したSQLを選択することを助けるために各ステートメントに対するコストスタティスティックス (費用統計)をユーザが見ることを可能とする。ユーザは、又、更なる編集のためのエディター機能を包含するシステムにおいてその調整したステートメントを開くことを選択することが可能である。
【0057】
そのSQLにおいてバインド変数が存在している場合には、「Bind (バインド)」ボタン126をクリックすると、そのSQLステートメントを実行する前にその変数に対する値をユーザが特定することが可能なダイアログが表示される。「実行」ボタン128をクリックすると、その選択したステートメントに対するスタティスティックス即ち統計を発生する。「全て実行」ボタン130をクリックすると、リストされている全てのSQLステートメントに対するスタティスティックス (統計)が発生される。ユーザは「印刷」ボタン132をクリックして現在ウインドウ内に表示されている情報を印刷させることが可能である。ユーザは「保存」ボタン134をクリックしてこのウインドウ内の情報を将来の参照のためにテキストファイルとして保存することが可能である。ユーザは該テーブル内の代替的SQLエントリを選択し且つそのコードをプランナーウインドウ内に表示させるために「PAFO」 (オラクル用プランアナライザー)ボタン138をクリックすることが可能である。
【0058】
「SQL置換」ボタン140をクリックすると、オリジナルのSQLが調整されたSQLで置換される。「戻り」ボタン136をクリックすると結果ウインドウ90 (図6)ヘリターンする。「キャンセル」ボタン144をクリックすると、オリジナルのSQLを変化させることなしに本システムから抜け出る。
【0059】
以下の記載部分は、SQLステートメントをチューニング即ち調整するために本システムによって使用される概念の幾つか及びSQLステートメントのパーツ又は属性を参照するために本明細書全体にわたって使用される種々の用語をリストし且つ説明している。これらの用語はSQLステートメントを調整するために本システムによって使用されるアルゴリズムを説明する本明細書全体にわたって使用されている。
【0060】
A.ブランチ及びネスティングのレベル
クエリー (query)がサブクエリー (subquery)を有している場合には、上部 (メインクエリー)から底部へのパス (path)即ち経路は「ブランチ (branch)」である。「ネスティング (nesting)のレベル」はそのブランチにおけるサブクエリーの数である。メインクエリーは「レベル」=1において考えられるものである。そのすぐ下側のサブクエリーは「レベル」=2にあり、以下同様である。以下のSQLについて検討する。引用を容易にするために行番号が付加されている。
【0061】
【表3】
【0062】
ブランチはメインクエリーLEVEL=1 (行1で開始)からLEVEL=2 (行3で開始)へ、且つLEVEL=3最後のサブクエリー (行7で開始)へ延在している。この例における「ネスティングのレベル」は2である。何故ならば、メインクエリーは1個のサブクエリーを有しており且つそのサブクエリーは1個のサブクエリーを有しているからである。以下のSQLステートメントは2個のランチを包含している。
【0063】
【表4】
【0064】
このSQLステートメントにおける最初のブランチは前の例におけるものと同じである。然しながら、このSQLステートメントは2番目のブランチを有している。メインクエリー (それは行1上で開始)はレベル1である。レベル2は行11上で開始している。この2番目のブランチは1に等しいネスティングのレベルを有している。
【0065】
B.最上のペアレントブール演算子
OR演算子がWHERE句内に存在する場合には、サブクエリーをFROM句内にマージ又は移動する前に注意すべきである。そのORがペアレントブール演算子である場合には、そのマージ又は移動が行われるべきではない。以下の例がこの点を例示している。
【0066】
SQLステートメントに対し
【表5】
【0067】
このOR演算子を考慮しなかった場合には、サブクエリーは以下の如くにマージされる場合がある。
【0068】
【表6】
【0069】
然しながら、そのサブクエリー内にジョイン用の行が存在しない場合には、そのジョイン (join)はカーテシアンプロダクト (Cartesian product)即ち直積となる。例えば、基準「e.emp seq=x.emp seq」がFALSE (偽)に評価されるが非ジョイン基準がTRUE (真)に評価されると、そのサブクエリーからの行はとにかくジョインされる。その特定のEMPLOYEES行に対して、そのサブクエリーからのどの行がジョインされるかに拘わらず、非ジョイン基準は常にTRUE (真)に評価する。このことはカーテシアンプロダクト即ち直積を形成する。
【0070】
以下の例は、NOTが基準に先行する場合にはこの問題が更に困難なものとなる場合があることを例示している。
【0071】
例えば、以下のSQLステートメントが与えられると、
【表7】
【0072】
ドモルガンの定理を使用して、該NOTは包含されているブール及び関係演算子を逆転させる。然しながら、本システムはドモルガンの定理を使用することによってこのNOT演算子を取除くことが可能であり、その結果以下のSQLとなる。
【0073】
【表8】
【0074】
逆転されたブール及び関係演算子は下線を付けてある。この逆転を最初に行うことは処理を簡単化させる場合がある。
【0075】
C.マルチSQLモジュールに対する相関
相関型サブクエリーは以下の例に示したように1つを超えるSQLモジュールに対して相関させることが可能である。
【0076】
【表9】
【0077】
TIME SHEETS (行6)に関するサブクエリーは周囲の即ち取囲むクエリー (ASSIGNMENTSに関し)且つEMPLOYEESに関するメインクエリー (行8を介し)の両方に対して相関されている (行7を介し)。
【0078】
D.相関基準
上のSQLステートメントにおいて、行7及び8に関する基準は「相関基準(correlation criteria)」と呼ばれる。これらの基準は「ジョイン基準 (join criteria)」ではないが、サブクエリーが実行される場合にそのクエリーの外側の参照 (例えば、「e.emp seq」又は「a.proj seq」)が定数であるような意味においてより「非ジョイン基準」のようなものである。
【0079】
相関基準は、等値演算子を使用することを確保するためにルーチンにおいてチェックすることが可能である。然しながら、このようにしてチェックされるべき相関基準は、独特のインデックスを有する列に対応するものであることに注意すべきである。例えば、以下のクエリーはそのサブクエリーにおいて2つの相関基準を有している。然しながら、問題となるものはPROJ SEQに関するものに過ぎない。何故ならば、これが独特のインデックスを有する列だからである。
【0080】
【表10】
【0081】
E.非ジョイン基準
SQLステートメントにおいて、その下側のコードが非ジョイン基準を参照する場合には、関係演算子が「=」である基準を探しており、且つその他の演算子は定数か又はサブクエリーのいずれかである。そのサブクエリーに関する仮定は、ユーザが関係演算子として「=」を特定したので、そのサブクエリーは高々単一の行をリターンせねばならず、それは定数を意味している。
【0082】
以下のものは無効なWHERE句の例である。
【0083】
WHEREcol1=10+col2
WHEREcol1>10
以下のものは有効なWHERE句の例である。
【0084】
WHEREcol1=10
WHEREcol1=(select col2 from tab1)
WHEREcol1=:Bind Variable
F.ジョイン基準
ジョイン基準を以下に参照する。各場合において、関係演算子は「=」とすべきであり、且つ該基準の各側は単一列名とすべきであって表現とすべきではない。
【0085】
G.サブクエリーインターフェース
周囲のクエリーとサブクエリーとの間のインターフェースは、典型的に、例えば「in」、「=」、「not exists」等の少なくとも1個の「関係演算子」を包含している。EXISTS及びNOT EXISTS関係演算子を除き全てに先行するものは1つ又はそれ以上の列である。該演算子に先行する列は「インターフェース列」と呼ばれる。サブクエリーの対応するSELECTリスト内の列も「インターフェース列」と呼ばれる。これら2つのタイプの「インターフェース列」はそれらが周囲クエリーか又はサブクエリーに対するインターフェース列であるか否かによって区別することが可能である。
【0086】
該列がそのサブクエリー内のオブジェクトに属するものでなく且つ、以下に例示したように、そのサブクエリー内のテーブルに属する列のいずれとも相関するものでない場合がある。
【0087】
【表11】
【0088】
列「e.hiredete」 (行4)はサブクエリー (ASSIGNMENTSテーブル)に属するものではなく且つASSIGNMENTS内の列のいずれとも相関するものではない。この文書は周囲クエリーのこれらの列を「フォーリン (foreign)」即ち外部として言及する。1つの列がフォーリン即ち外部である場合には、本システムはそれを非相関型サブクエリーとマージ又はそれへ変換しようと試みる。然しながら、本システムはそのサブクエリーを移動させようとはしない。
【0089】
H.お気に入り (Preferences)
SQLステートメントを変換する場合にヌル (NULL)論理は多数の問題を提起する場合がある。ある列が周囲クエリーにおいてヌルとなることが可能である場合には、変換された場合に異なる結果組が表われる場合がある。その変換は、性能の点では小さなコストが存在する場合があるが、このことが発生しないことを確保するために修正することが可能である。その修正は基準をAND処理することであり、その列がヌルとなることが不可能であることを特定する (例えば、col is not null)。その基準はオリジナルの基準を満足する各行に対して有効なものとされねばならないので、僅かなコストが存在する。一方、ある場合においては、例えばオラクルのオプティマイザー等のオプティマイザー即ち最適化器がアンチジョイン (anti−join)即ち逆結合を実施することが可能であるので、性能が改善する場合がある。これらのプリファランス (preferences)即ちお気に入りが以下のアルゴリズムにおいて参照される。
【0090】
I.エイリアス
サブクエリーがFROM句マージ又は移動されると、周囲クリエィにおける基準が、例えば、以下の例を参照することにより示されるように、エイリアスを介して完全に識別すべきである。
【0091】
【表12】
【0092】
この例においては、エイリアスをEMPLOYEESに対して付加すべきであり、且つそのエイリアスはそのテーブルに関連する全ての列に先行すべきである。さらに、そのサブクエリーにエイリアスが与えられるべきである。EMPLOYEESに対して「e」エイリアスを付加すると、その変換は以下の如くである。
【0093】
【表13】
【0094】
サブクエリーが集合体 (aggregate)を包含している場合には、FROM句内へ移動される前にエイリアスが与えられるべきである。例えば、以下のSQLステートメントはそのサブクエリーにおいて「max」集合体関数を包含している (行3)。
【0095】
【表14】
【0096】
従って、以下の如くに集合体「MAX(EFFECTIVE DATE)」にエイリアスを与えるためにSQLステートメントを変換すべきである。
【0097】
【表15】
【0098】
暗示的な知識を介して独特なセット (組)をリターンすることが知られているサブクエリーにユーザがフラッグを立てることを可能とするか否かの問題が発生する。例えば、
【表16】
【0099】
は以下の如くに変換することが可能であり、
【表17】
【0100】
又は、以下の如くに変換することが可能である。
【0101】
【表18】
【0102】
両方の場合が可能である。何故ならば、該サブクエリーにおける低レベルテーブルはPROJ SEQ及びEMP SEQに関しPKを有しているからである。UNQインデックスも有しているNAMEに関する等値性のために、推移性はPROJ SEQに関して等値性が存在していると言うことを可能とする。従って、該サブクエリーはEMPLOYEES行当たり1つの行を発生することが保証され、そのことはマージが可能であることを意味する。
【0103】
本システムによって使用される用語及び概念の幾つかにおいて説明したので、以下の例はSQLステートメントを変換するために本システムによって使用することが可能なアルゴリズムを説明する場合の助けとなる。例が相関型及び非相関型サブクエリーに対して示されており且つそのようなものとして識別される。非相関型サブクエリーは、メインクエリーに対して相関されていないサブクエリーである。即ち、非相関型サブクエリーは、メインクエリーによっていずれかの行が検査される前に、論理的に実行させることが可能である。換言すると、サブクエリーはメインクエリーとは独立的であり且つ独立して1つのクエリーとして存在することが可能である。一方、相関型サブクエリーはメインクエリーによって検査される行に依存する。
【0104】
1.以下のSQLステートメントは相関型サブクエリーと非相関型サブクエリーとの混合したものである。以下のSQLステートメントにおいては、最後のサブクエリーはスカラーサブクエリーであり、且つ周囲サブクエリーはPROJ SEQ及びRTP DATEに関して等値基準を有しており且つEMP SEQ列は選択リスト上にあるので、そのサブクエリーは、SAL HISTORY上のサブクエリーが不可能な場合であっても、マージさせることが可能である。これはFROM句における入れ子 (ネスト型)クエリーがスカラーとして正確に識別されたか否かの良好なテストである。
【0105】
【表19】
【0106】
は以下の如くに変換されるべきである。
【0107】
【表20】
【0108】
2.以下の例は非相関型であり且つすぐ前の例とは僅かに異なっている。基本的な差異はSAL HISTORYに関するサブクエリーである。この場合には、サブクエリーは、初期的に、潜在的に複数個の行をリターンするものと決定される。このことは、オリジナルのクエリーにおいてはランタイムエラーが発生する可能性があることを意味する。このことは該サブクエリーをマージ又は移動することを阻止する。即ち、SAL HISTORYに関するサブクエリーはそのまま残存すべきである。然しながら、RPT DATEに関する基準は等値演算子を有しているので、該サブクエリーとTIME SHEETSとのマージは未だに発生することが可能であり、且つそれは未だに同一のランタイムエラーに遭遇する蓋然性がある。還元すると、SAL HISTORYに関するサブクエリーは移動されることはない。何故ならば、それはスカラーセット (組)を発生することを保証することが不可能だからである。然しながら、そうである場合には、それは「rpt date= 」基準に対し単一の定数値となる。本システムは該サブクエリーを定数と等価であるとして認識し、周囲クエリーがその周囲のクエリーとマージし且つ入れ子 (ネスト型)選択を続行することを可能とする。
【0109】
例えば、以下のSQLステートメント、
【表21】
【0110】
は以下のものへ変換すべきである。
【0111】
【表22】
【0112】
3.以下の例は相関型であり且つALL演算子を取扱う。サブクエリーがいずれの行もリターンするものでない場合には、該基準はTRUE (真)と評価することが可能である。このことは、サブクエリーが移動されるだけであり且つアウタージョインとして行われるべきであることを意味し、その場合にアウタージョインシンタックスのみが初期的相関基準に対して適用されるに過ぎない。比較されるオリジナルの列はジョインマッチなしを考慮に入れるものでなければならない。付加される最終的な基準はアウタージョインが行われた後に評価される。
【0113】
例えば、以下のSQLステートメント、
【表23】
【0114】
は以下のものへ変換することが可能である。
【0115】
【表24】
【0116】
本システムは、新たにアウタージョインした基準のいずれかが何かとOR処理されるか否かを決定すべくチェックすべきである。何故ならば、それはパースエラーを発生するからである。その変換が行われるべきであったか否かを判別するためにデータベースをしてその中間解をパース即ち解析させることが望ましい場合がある。それが行われるべきでなかった場合には、そのサブクエリーについて何も行われるべきではない。
【0117】
4.以下のクエリーは非相関型であり且つGROUP BYシンタックスを有するサブクエリーを取扱う。該サブクエリーはGROUP BY句を有するものであっても、SELECTリストはGROUP BYリスト上の列の各々を包含するものではない。このことは、DISTINCTキーワードが該サブクエリーのSELECTリストに付加されない限り、複製に対しての可能性が存在することを意味している。
【0118】
例えば、以下のSQLステートメント、
【表25】
【0119】
は以下のものへ変換することが可能である。
【0120】
【表26】
【0121】
5.SQLステートメントは集合体のみを包含するが、GROUP BY句を包含するものでない場合がある。従って、それはDISTINCTキーワードを必要とすることはない。この例は非相関型である。
【0122】
以下のSQLステートメント、
【表27】
【0123】
は以下のものに変換することが可能である。
【0124】
【表28】
【0125】
6.以下の例は非相関型であり且つ周囲クエリーを移動する場合にNOT IN演算子を取扱う場合を例示している。基本的な点は、本システムがアウタージョインへ変換し、次いで、「アウタージョインされた行」である行を探し出すことである (例えば、サブクエリーIS NULLの選択リスト上のヌル不可能な列 (以下の「x.col1 is null」基準参照))。解決は例えば1等の定数を選択リストへ付加することである。何故ならば、それはサブクエリーがGROUP BYシンタックスを有しているか否かに拘わらずに動作するからである。
【0126】
例えば、以下のSQLステートメント、
【表29】
【0127】
は以下のものへ変換することが可能である。
【0128】
【表30】
【0129】
7.以下の例は上の例6と同様であり、且つ、非相関型である。然しながら、この例においては、複数個の列がサブクエリーに対してインターフェースされる。更に、該列は周囲クエリーにおける複数個のテーブルを表わしている。この例においては、変換がパースするものではないので問題に遭遇する場合がある。エラーメッセージが発生される場合があり、即ち「ORA−01417:テーブルが高々他の1つのテーブルへアウタージョインされた可能性がある」。その理由は、XがEMPLOYEES及びDEPENDENTSへアウタージョインされるからである。従って、この変換は、関係演算子がアウタージョインを必要とするが、そのサブクエリーとインターフェースする列が複数個のテーブルからのものである場合に、行われるべきではない。
【0130】
例えば以下のSQLステートメント、
【表31】
【0131】
は誤って以下のものに変換される場合がある。
【0132】
【表32】
【0133】
8.以下の非相関型の例は興味があるがおかしな状態を与える。この状態は滅多に見られるものではないが、理論的には、発生することが可能である。その理由は以下のサブクエリーは非相関型であるが、EXISTS演算子で周囲クエリーとインターフェースされているからである。EXISTS演算子は、通常、相関型サブクエリーと共に使用されるに過ぎない。いずれの場合においても、この変換は簡単であり、単にそれをジョイン句なしで周囲クエリーへ移動し、且つ以下に示した如く基準「ROW NUM=1」を該サブクエリー内に付加するに過ぎない。
【0134】
例えば、以下のSQLステートメント、
【表33】
【0135】
は以下のものへ変換することが可能である。
【0136】
【表34】
【0137】
性能はオリジナルのSQLステートメントの場合よりも変換したSQLステートメントの場合に著しく良好である。何故ならば、そのサブクエリーは、オリジナルのSQLステートメントにおいて実施されるように行毎に一度ではなく単に一度実行されるに過ぎないからである。
【0138】
9.以下の例は非相関型であり、且つ該サブクエリーは同一の名前で1つを超える列名を包含しているのでリストしてある。列名がテーブルエイリアスによって先行されている場合であっても、列名にはエイリアスが与えられるべきである。又、周囲 (外部)クエリーのSELECTリスト上のアステリスクは周囲 (外部)クエリーにおける各テーブルに対して複製されるべきである。下に示した変換において下線を付けた項目に注意。
【0139】
SQLステートメント、
【表35】
【0140】
を以下のものへ変換することが可能である。
【0141】
【表36】
【0142】
10.以下の例は非相関型であり且つスカラーサブクエリー及びNOT IN演算子を例示している。サブクエリーはスカラーであるので、それはアウタージョインとして周囲のものとマージさせることが可能である。そのキーは「アウタージョインした」行のみを維持することである。このことは、IS NULL演算子及び該サブクエリーにおけるテーブルのヌルでない列を有する基準とAND処理することによって達成することが可能である。より良好な解決法は、ROWIDを使用することである場合がある (以下の2番目の変換参照)。
【0143】
例えば、
【表37】
【0144】
を以下のものへ変換することが可能であり、
【表38】
【0145】
又は以下のものへ変換することが可能である。
【0146】
【表39】
【0147】
11.以下の相関型の例は相関基準及び非ジョイン基準の両方を包含している。サブクエリーは独自性を保証するので、サブクエリーをマージすることが可能である。
【0148】
例えば、SQLステートメント、
【表40】
【0149】
は以下のものへ変換することが可能である。
【0150】
【表41】
【0151】
12.以下の相関型の例は異なるものである。何故ならば、SELECTリストは周囲 (外部)クエリーへリターンすることのない列を包含している(実際に、すぐ前の例11におけるクエリーが選択リスト上の項目を有している場合には、その変換は、未だに、全く同一のものである。注意すべきことであるが、すぐ前の例11においては、サブクエリー選択リスト上のアステリスクは問題ではなかった)。
【0152】
例えば、
【表42】
【0153】
を以下のものへ変換することが可能である。
【0154】
【表43】
【0155】
13.この相関型の例はすぐ前の例とは異なっている。何故ならば、SELECTリスト列は周囲 (外部)クエリーにおいて対応する列を有しているからである。
【0156】
例えば、
【表44】
【0157】
を以下のものへ変換することが可能である。
【0158】
【表45】
【0159】
14.以下の非相関型の例はNOT EXISTS演算子を介してインターフェースされた非相関型サブクエリーを例示している。
【0160】
例えば、
【表46】
【0161】
を以下のものへ変換することが可能である。
【0162】
【表47】
【0163】
注意すべきことであるが、オリジナルのサブクエリーのSELECTリストは「COUNT(*)」へ変更されており、且つ「ROWUNM=1」基準がサブクリエィへ付加されている。
【0164】
15.以下の非相関型の例は、サブクエリーがGROUP BYを包含していることを除いて、すぐ前の例14と同様である。この変換はすぐ前の例14と同様である。
【0165】
例えば、
【表48】
【0166】
を以下のものへ変換することが可能である。
【0167】
【表49】
【0168】
サブクエリーのSELECTリスト上に何があろうと「COUNT (*)」とスワップされる。
【0169】
16.以下のものはNOT EXISTS演算子を使用した相関型の例である。例えば、
【表50】
【0170】
を以下のものへ変換することが可能である。
【0171】
【表51】
【0172】
17.以下の相関型の例はIN演算子とインターフェースされたセット (組)サブクエリーを例示している。例えば、
【表52】
【0173】
を以下のものへ変換することが可能である。
【0174】
【表53】
【0175】
18.以下の非相関型の例は<ALL演算子を例示している。例えば、
【表54】
【0176】
を以下のものへ変換することが可能である。
【0177】
【表55】
【0178】
この変換において「x.col1 is null」を使用していることに注意すべきである。ポイントは、どの行もその基準に資格を与えるものでない場合でも集合体関数は常に値をリターンするということである。サブクエリーが空のセットとなる場合にALL演算子は常にTRUE (真)と評価するので、本システムは、未だに、周囲 (外部)クエリーにおける行をリターンすべきである。
【0179】
19.以下の非相関型の例はすぐ前の例18と類似している。然しながら、この例においては、>ALL演算子が<ALLの代わりに使用される。
【0180】
例えば、
【表56】
【0181】
を以下のものへ変換することが可能である。
【0182】
【表57】
【0183】
20.以下の非相関型の例はマージ可能なセットサブクエリーを有している。例えば、
【表58】
【0184】
を以下のものへ変換することが可能である。
【0185】
【表59】
【0186】
21.以下の相関型の例は相関されていることを除いて、すぐ前の例20に類似している。この例は、相関基準に対してどのようにしてアウタージョインシンタックスを付加するかを例示している。例えば、
【表60】
【0187】
を以下のものへ変換することが可能である。
【0188】
【表61】
【0189】
22.以下の非相関型の例はすぐ前の例21に類似している。然しながら、この例においては、サブクエリーは複数個のテーブルを有している。以下の例は、周囲 (外部)クエリーとマージされる場合にサブクエリー内のジョイン基準上にどのようにしてアウタージョインシンタックスを配置させるかを例示している。
【0190】
例えば、
【表62】
【0191】
を以下のものへ変換することが可能である。
【0192】
【表63】
【0193】
このサブクエリーにおいて、中間的にジョインされたテーブルの独自性が保証されている (この場合においては、p.nameが独自的であるのでエイリアス「p」)。ジョイン順番における高々1つの再開レベルチャイルドが独自的でない場合があり、この場合にはエイリアス「a」である。ジョイン順番はエイリアス「s」、次いで「p」、次いで「a」である。
【0194】
23.次の相関型の例はむしろ複雑なものとなる場合がある。それは、NOT IN演算子のためにアウタージョインとすべきである。然しながら、問題は、両方のエイリアス「e」、及び「a」がサブクエリーと相関しているということである。サブクエリーは単に1つのテーブルを包含するに過ぎないのでサブクエリーはマージ可能とすべきであり、従ってユニークネス即ち独自性を保証することは必要ではない。
【0195】
例えば、
【表64】
【0196】
である。
【0197】
相関基準のためにサブクエリーはマージすることも移動することも不可能である。サブクエリーの相関基準及びインターフェース列が周囲 (外部)クエリーにおける1つを超えるテーブルを参照する場合には、サブクエリーをスキップすることが可能である。この場合には、1つの相関基準がエイリアス「a.」を参照し且つ周囲即ち外部クエリーのインターフェースが「e.emp seq」を参照する。本システムがサブクエリーを変換すべき場合には、その変換はTIME SHEETSが1個を超えるテーブルとアウタージョインされることとなり、そのことは有効ではない。
【0198】
従って、上のSQLステートメントは誤って以下の如くにマージされ、
【表65】
【0199】
且つ誤って以下の如くに移動される。
【0200】
【表66】
【0201】
これら両方の場合は違法なアウタージョインとなり回避すべきである。
【0202】
24.この相関型の例はすぐ上の例23と同様に類似している。推移性を介して、本システムは例23に示したようなオリジナルのステートメントを以下のオリジナルのステートメントへ変換することが可能であり、次いで、その変換を実施し、従って例23において遭遇される制限を取除いている。
【0203】
例えば、例23におけるオリジナルのステートメントを以下のものへ変換することが可能であり、
【表67】
【0204】
それは、以下のものへ変換することが可能である。
【0205】
【表68】
【0206】
25.以下の相関型の例はスカラー演算子「=」を取扱う。この例は、サブクエリーがスカラーであることを決定するためにサブクエリーにおいて推移性をどのようにして使用することが可能であるかを示しており、例えば「e.emp seq=t.emp seq=a.emp seq」である。
【0207】
例えば、
【表69】
【0208】
を以下のものへ変換することが可能である。
【0209】
【表70】
【0210】
26.以下の相関型の例は集合演算子「IN」を取扱う。例えば、
【表71】
【0211】
を以下のものへ変換することが可能である。
【0212】
【表72】
【0213】
27.以下の相関型の例は、相関基準がサブクエリー内のテーブルの1つを超えるものが関与するものであるが、マージが可能である場合を示している。この場合においては、「t.」はサブクエリーのインターフェースを介して「e.」へインターフェースし、次いで「t.」はPROJ SEQ列を介して「a.」と相関する。推移性を適用することが可能であり、従って「t」はPROJ SEQ及びEMP SEQの両方の列を介して「a」と相関する。更に、ジョインされた場合に「e」及び「a」に関してユニークネス即ち独自性が保証される。
【0214】
例えば、
【表73】
【0215】
を以下のものへ変換することが可能である。
【0216】
【表74】
【0217】
「a」及び「e」は別々に「t」へジョインされるので、本システムは各テーブルのヌル不可能な列に対してIS NULLを付加し、それらを一体的にOR処理することが必要である。
【0218】
28.以下の相関型の例はGROUP BY句を有するサブクエリーのSELECTリストに関する集合体を例示している。
【0219】
例えば、
【表75】
【0220】
を以下のものへ変換することが可能である。
【0221】
【表76】
【0222】
29.以下の非相関型の例は、サブクエリーが移動される場合に、集合体を集合体の集合体へ変換する場合を例示している。
【0223】
例えば、
【表77】
【0224】
を以下のものへ変換することが可能である。
【0225】
【表78】
【0226】
30.以下の相関型の例は、「<ANY」のような演算子を介してインターフェースされたサブクエリーを変換することが不可能である場合を例示している。例えば、
【表79】
【0227】
を誤って以下のものへ変換させる場合がある。
【0228】
【表80】
【0229】
この変換は正しくない。何故ならば、サブクエリーは未だにセットであり、要求されるようにスカラーでないからである。例えば、EMP SEQに関して、PROJ SEQによるグルーピングに起因して未だに多数のMIN (rtp date)値が存在する可能性がある。サブクエリーがGROUP BY句を有するものでなかった場合であっても、その変換は未だに容易に可能なものではない。何故ならば、その変換は、相関列をSELECTリスト上に配置させ且つ集合体、及び集合体の集合体を形成することを必要とするからである。そのことは、スカラー及び集合体の集合体のシンタックス違反となる。
【0230】
オリジナルのGROUP BY列はHAVING句と相関しておらず且つその一部ではないが、本システムはそれを取除くことは不可能である。
【0231】
例えば、クエリーは誤って以下のものへ変換される場合がある。
【0232】
【表81】
【0233】
上の変換は正しくない。何故ならば、同一のPROJ SEQで、e.hiredateより小さなrpt dateが存在するがe.hiredateより大きな別のrpt dateが存在するからである。オリジナルのクエリーにおいて、MIN(rpt date)を有するクエリーは行のうちの1つとして第一データをリターンする。然しながら、上のクエリーにおいては、サブクエリーは最大をリターンする。
【0234】
31.以下の相関型の例は、「=」演算子の代わりに「<」演算子を使用する相関基準のためにサブクエリーを移動することが不可能な場合の優れた例である。
【0235】
例えば、
【表82】
【0236】
を誤って以下のものへ変換させる場合がある。
【0237】
【表83】
【0238】
正しい変換を行う1つの方法は、不等相関に関与するテーブルを以下の如くにしてサブクエリー内に移動させることである。
【0239】
【表84】
【0240】
その解決法はEMPLOYEESテーブルをサブクエリー内に移動させ、次いでそのサブクエリーを移動させることである。
【0241】
32.以下の相関型の例は集合体のないスカラーサブクエリーである。
【0242】
例えば、
【表85】
【0243】
を以下のものへ変換することが可能である。
【0244】
【表86】
【0245】
33.以下の相関型の例はすぐ前の例32と類似している。然しながら、この例においては、ユニーク即ち独特なキーの一部ではない列に関し付加的な相関基準が存在している。このことは、相関型サブクリエィを取扱う場合に重要である場合があり、即ち、サブクエリーのPK又はUNQキーに関しての相関基準は「=」演算子を使用すべきであり、且つ付加的な相関基準に対して使用される演算子は問題ではない。この場合には、相関基準「t.rtp date>=a.start date」はユニーク即ち独特なキーの一部ではない。
【0246】
例えば、
【表87】
【0247】
を以下のものへ変換することが可能である。
【0248】
【表88】
【0249】
34.以下の相関型の例は、スカラーサブクエリーをインターフェースするためにスカラー演算子を使用し、該サブクエリーは集合体及びGROUP BY句でないためにスカラーである。
【0250】
例えば、
【表89】
【0251】
を以下のものへ変換することが可能である。
【0252】
【表90】
【0253】
35.以下の相関型の例はHAVING句における相関を例示している。その解決方法は、HAVING句は周囲即ち外部クエリーにおける基準となり、且つ相関型基準において比較されたローカルな項目はそのサブクエリーはSELECTリスト内に表われるべきである。注意すべきことであるが、チェックする別のシンタックスは、サブクエリーがGROUP BYを有するものでないがHAVING句を有する場合である。
【0254】
例えば、
【表91】
【0255】
を以下のものへ変換することが可能である。
【0256】
【表92】
【0257】
36.以下のものは相関型の例であり、その場合に演算子はNOT IN演算子であり且つ不等相関基準が存在している。本システムは、既にそこに存在しているのでEMP SEQ列の別のコピーをGROUP BY句上へ移動させることは必要ではないことに気が付くべきである。
【0258】
例えば、
【表93】
【0259】
を以下のものへ変換することが可能である。
【0260】
【表94】
【0261】
37.この相関型の例は、例30においてはサブクエリーが集合体を有するものでないということを除いて、上の例30に類似している。このクエリーは実際的なものではないかも知れないが、この例はANY、SOME又はALL演算子のいずれに対してもGROUP BYを有するサブクエリーを何故移動すべきではないかを例示するために使用される。例えば、
【表95】
【0262】
は誤って次のものへ変換されることがある。
【0263】
【表96】
【0264】
問題は、既にRPT BATEによるグルーピングが存在しており、且つ周囲即ち外部のクエリーに対してのジョイン基準が存在しないということである。従って、スカラーを必要とする場合にEMP SEQについてのジョイン当たりのセット即ち組となる。
【0265】
38.以下の相関型の例は、不等相関基準に起因してANY、SOME又はALLサブクエリーを移動させることが不可能である場合を例示している。移動させるためには、高々1つの行がオリジナルの周囲即ち外部クエリーと比較されることを最終的な変換が確保すべきである。然しながら、この変換における不等ジョイン基準の場合には、複数個の行がジョインされる場合がある。
【0266】
例えば、
【表97】
【0267】
は誤って次のものへ変換される場合がある。
【0268】
【表98】
【0269】
39.以下のものは「>ALL」演算子を有する相関型の例である。この例は、MIN関数の代わりにMAX関数を使用することを除いて、上の例と類似している。
【0270】
例えば、
【表99】
【0271】
を以下のものへ変換することが可能である。
【0272】
【表100】
40.以下の相関型の例は「<ANY」演算子を例示している。<ANYと「ANY」演算子との間の唯一の差異は、MAXがMINとなることである。
【0273】
例えば、
【表101】
を以下のものへ変換することが可能である。
【0274】
【表102】
41.以下の相関型の例はスカラー演算子「=」を例示している。例えば、
【表103】
を以下のものへ変換することが可能である。
【0275】
【表104】
42.以下の相関型の例はEXISTS演算子を例示しており、その場合にサブクエリーはHAVING句を包含しているがGROUP BY又は集合体を包含していない。ここでのポイントは、HAVING句の前にGROUP BY句を付加することである。
【0276】
例えば、
【表105】
を以下のものへ変換することが可能である。
【0277】
【表106】
43.この相関型の例はすぐ前の例42と類似しており、尚HAVING句が存在している。然しながら、この例においては、GROUPも存在している。
【0278】
例えば、
【表107】
を以下のものへ変換することが可能である。
【0279】
【表108】
44.以下の非相関型の例は、EXISTS演算子に対してサブクエリーを移動させることが不可能な場合を例示している。この場合の理由は、その解決方法がサブクエリーに対して「ROWNUM=1」基準を付加することだからである。然しながら、HAVING句は検索された唯一の行を資格剥奪することが可能である。この例においては、少なくとも2つの資格がある行が存在すべきであり、そうでない場合には、サブクエリーは空のセットをリターンする。
【0280】
例えば、
【表109】
は誤って以下のものへ変換される場合がある。
【0281】
【表110】
45.次の相関型の例は上の複数個のレベルに相関されたサブクエリーを例示している。この例は、上のセクションにおいては、「制限」がこれらのタイプの相関型サブクエリーを変換しようとすべきではないことを表わすものであるために包含されている。その理由は、それらは以下に示すように可能なものであるが比較的複雑なものであるからである。
【0282】
例えば、
【表111】
を以下のものへ最初に変換することが可能であり、
【表112】
次に、以下のものに変換することが可能である。
【0283】
【表113】
最初の変換は比較的簡単である。サブクエリーをマージすることは不可能であり、従ってそれは移動されている。このことはSELECTリストにおけるDISTINCTキーワード及びSELECTリストへ移動されるべき相関基準の一部であったローカルな列を必要としている。更に、相関型基準は周囲即ち外部クエリーへ移動されている。
【0284】
2番目の変換はより複雑なものである。何故ならば、この場合には、同一の名前を有しているが周囲即ち外部クエリーに相関されていたサブクエリーの異なるローカルなテーブルからの2つの列が存在しているからである。そのことは、SELECTリストへ移動される場合にユニークなエイリアスが該列に対して与えられねばならないことを意味している。従って、本システムは相関型基準を周囲即ち外部のクエリーを移動させねばならないに過ぎない。
【0285】
これをより最適化するために、本システムは、移動の前に、基準の推移性に注意すべきである。例えば、「a.emp seq=e.emp seq」及び「xl.emp seq=e.emp seq」を持っていた。これは、「a.emp seq=xl.emp seq」というのと等価である。このことを認識することは、サブクエリーにおけるジョインをより効率的なものとさせ且つ次のような結果となる。
【0286】
【表114】
46.OR演算子はサブクエリーのペアレント即ち親と考えられる。以下の例は、ジョインへの変換が誤った答えを発生する場合を例示している。
【0287】
例えば、
【表115】
ORを無視した場合には、変換は以下のようになる。
【0288】
【表116】
この問題を見る1つの方法は、以下のようにしてORをしてUNION ALLへ変換することである。
【0289】
【表117】
47.以下の例はOR処理した相関基準を取扱う。相関基準がOR処理されると、アウタージョインへの変換は不可能であり、且つNOT INへの変換は複雑である。例えば、
【表118】
NOTへの変換が実施された場合に、本システムは以下のことを行うべきである。
【0290】
【表119】
パース不可能なシンタックスを発生するためにアウタージョインへの変換が不可能である場合には次の通りである。
【0291】
【表120】
48.以下の例は、オリジナルのサブクエリーが空のセットを発生することが可能である場合のNOT INからNOT EXISTSを例示している。サブクエリーはデモの目的のために人工的に空のセットを強制的に発生させた。例えば、
【表121】
は、同一の結果が発生されることを確保するために以下の如くに変換すべきである。
【0292】
【表122】
然しながら、この解の問題は、再度オリジナルへ戻るということである。
【0293】
49.以下の相関型の例は、周囲即ち外部のクエリーへ相関されている集合体を有するHAVING句を例示している。例えば、
【表123】
この変換は、以下のようにして、集合体及び相関列をSELECTリストへ移動させることを必要とする場合がある。
【0294】
【表124】
50.以下の相関型の例はNOT INを有するマージを示している。注意すべきであるが、この変換において付加されている基準は周囲即ち外部のクエリーへインターフェースされているサブクエリーテーブルのROWIDを包含している。「t」はジョイン順番における再開レベルのチャイルド (子)であり、「e」は「a」に対してアウタージョインされており、「a」は「t」ヘアウタージョインされているので、「a」ではなくエイリアス「t」のROWIDを使用することが重要である。
【0295】
例えば、
【表125】
は次のように変換することが可能である。
【0296】
【表126】
51.以下の相関型の例は、クエリーのインターフェース列がサブクエリーにおける相関テーブルと同一ではないということを除いて、すぐ前の例50と同様である。たとえば、START DATEはASSIGNMENTSに属しているが、T.EMP SEQは相関されているが異なるテーブルに属している。推移性が使用される場合には、TとAとの間のジョイン基準のためにT.EMP SEQをA.EMP SEQへスイッチさせることが可能である。
【0297】
例えば、
【表127】
最初に、推移性を付加すると次のものが得られ、
【表128】
従って、前の例50におけるのと同一のクエリーを有しており、それは同一の変換が発生したことを意味している。
【0298】
52.この相関型の例は例50に類似しているが、インターフェース列に対応するこのサブクエリーにおけるテーブルはTIME SHEETSである。唯一の差異は、EMPLOYEESがTIME SHEETSへアウタージョインされており、従ってTIME SHEETSがASSIGNMENTSへアウタージョインされていることである。従って、付加された基準は例50におけるようにTIME SHEETSテーブルではなくASSIGNMENTSテーブルのROWIDを使用する。
【0299】
例えば、
【表129】
は以下のものへ変換することが可能である。
【0300】
【表130】
53.以下の相関型の例は、集合体の集合体は可能な変換ではないことを例示している。例えば、
【表131】
は誤って次のように変換されることとなる。
【0301】
【表132】
然しながら、このようなSQLはコンパイルすることがなく従って回避すべきである。
【0302】
54.以下の相関型の例は、不等相関基準及び集合体は可能な変換ではないことを例示している。例えば、
【表133】
は誤って以下のように変換される。
【0303】
【表134】
ここでの問題は、不等基準「a.start date>t.rpt date」のために、GROUP BYのみならずt.rtp dateがSELECTリストへ移動されねばならないことである。然しながら、集合体は誤ったグループを包含しているので、SELECTリストへ移動させることは不可能である。実際に、MAXはRTP DATEに等しくなる。
【0304】
55.以下の相関型の例も、集合体の集合体は可能な変換ではないことを例示している。例えば、
【表135】
は誤って以下のように変換される。
【0305】
【表136】
問題は、SELECTリストに関してスカラー及び集合体を持つことを不可能であるということである。
【0306】
最適化
以下のものは、更に、システム又はユーザによって最適化モードが選択された後に、代替的SQLステートメントを発生することによってSQLステートメントを最適化するために本システムが使用する態様をリストしている。最適化目標のためのヒントは、各SQLステートメント変換内に包含されるべきである。本システムはノンジョイン (non−join)即ち非ジョイン基準における全ての推移性を決定し、全てのジョイン順番を決定し、全ての種々のサブクエリー変換を決定する。
【0307】
ノンジョイン推移性
簡単に、以下のクエリーを見てみる。
【0308】
【表137】
この例においては、DEPENDENTSのサブクエリーに関する基準は「e.emp seq」であるオリジナルのみならず、「a.emp」又は「t.emp seq」へインターフェースさせることが可能である。他のシステムはこのことを認識するものではない。「a.emp seq」へスイッチすることによって、本システムは、データベースがASSIGNMENTSに関する連結されたキーインデックスを使用することを可能とする。
【0309】
代替的な変換は、以下のようにして「a.emp seq」を「a.emp seq」 (行5)ヘ変化させる。
【0310】
【表138】
オペランド「e.emp seq」は2つの他の値と置換することが可能であるので、SQLは3つの態様で書くことが可能である (オリジナルに対して1つ及び「e.emp seq」を置換することが可能な異なる値の数に対して2つ)。
【0311】
マルチ非ジョイン推移性
以下のものは、本システムがどのようにしてマルチ非ジョイン推移性を取扱うかを説明する。例えば、以下のSQLステートメントが与えられたものとする。
【0312】
【表139】
2つの異なる非ジョイン基準における2つのオペランド「a.proj seq」(行5)及び「e.emp seq」 (行7)は等価な列で置換することが可能である。他のシステムではこのことを認識するものではない。然しながら、本システムは、「e.emp seq」 (行7)を「a.emp seq」へスイッチすることによって、データベースがASSIGNMENTSに関する連結されたキーインデックスを使用することを可能とする。「e.emp seq」についての基準は最後の例と同じである。本システムは、又、「a.proj seq」 (行5)を「t.proj seq」で置換することが可能である。このことは、使用することが可能な潜在的に6個 (2×3)異なるSQLステートメントが存在していることを意味している (このことはオリジナルの値を包含することに注意)。
【0313】
マルチ列オペランド
複数個の列を包含するオペランドに関してはどうであろうか?例えば、
【表140】
基準「s.emp seq,s.effective date」(行3)は非ジョイン基準を表わしており、推移性を適用することが可能である。このジョイン句は「e.emp seq」と言っており且つ「s.emp seq」は等価であるので、非ジョイン基準オペランドに対して2つのオプションが存在している。最初のものはオリジナルであり且つ2番目のものは「s.emp seq」を「e.emp seq」で置換させることである。
【0314】
問題は、このことを行うべきかどうかと言うことである。その問題の理由は、オペランドにおける両方の列は同一のテーブルを参照し、且つ両方の列に関して連結されたインデックスが存在しているからである。単一の列のみが存在する場合であっても、両方の列に関するインデックスが存在している。
【0315】
その答えは心配することではなく単にオペランドに他の列を付加し、且つ以下のようにして対応する列をSELECTリストへ付加することである。
【0316】
【表141】
このことは、決定を簡単化させ且つデータベースがどれを使用するかを決定させる。
【0317】
OR処理された非ジョイン基準
OR処理された基準がクエリー内に存在する場合はどうであろうか?非ジョイン基準がジョイン基準のうちのいずれかに対してOR処理された場合には、OR処理されたジョイン基準に起因する推移性を使用することは不可能である。使用することが可能な唯一の推移性はAND処理されたものである。
【0318】
以下のSQLはORを有するクエリーを例示しているが、ジョイン基準の全ては非ジョイン基準に対してAND処理されていることに注意すべきである。
【0319】
【表142】
以下のSQLは基準の優先性を特定するために括弧を使用するものではない。ORの前にANDが処理されると言うデフォルトが使用される。
【0320】
【表143】
この場合には、非ジョイン基準に対してAND処理される唯一のジョイン基準は行5及び6においてである。「e.emp seq=a.emp seq」である推移性を使用することは不可能である。非ジョイン基準に対してAND処理されるジョイン基準のどれもが「e.emp seq」を参照するものではないので、推移的値は存在しない。
【0321】
アウタージョイン
非ジョイン基準は存在しないがクエリー内にアウタージョイン(outer−join)が存在する場合はどうであろうか?その例が次のことを例示している。
【0322】
【表144】
問題の非ジョイン基準は「e.emp seq」に関するオペランドを有しており、且つ等価な列が非アウタージョインテーブルからのものであるジョイン基準は存在しないので、推移的値は存在しない。
【0323】
以下の例は前のものとは僅かに異なっている。
【0324】
【表145】
この例においては、TIME SHEETSは唯一のアウタージョインテーブルである。従って、この例においては、推移性「e.emp seq=a.emp seq」は使用することが可能であるが、「e.emp seq」は「t.emp seq」と等値させることは不可能である。
【0325】
簡単な非ジョイン基準の推移性
以下のクエリーはこの概念を説明するために使用する。
【0326】
【表146】
非ジョイン基準は「d.emp seq=1001」(行3)である。ジョイン基準に基づいた推移性に起因して、このクエリーは次の通りに書き直すことが可能である。
【0327】
【表147】
従って、非ジョイン基準はEMPLOYEESテーブル上にある。
【0328】
これは、2つの可能な値を有する推移性を具備する単一列オペランドと考えるべきである。
【0329】
非ジョイン基準及び入れ子選択の推移性
これは非常に有益的な場合がある単一列推移性の1つのエリアである。入れ子即ちネストされた選択が選択リストにおいてGROUP BYシンタックス又は集合体を有するものではなく、且つジョイン列の1つを参照するメインクエリーにおいて非ジョイン基準が存在しない場合には、非ジョイン基準は入れ子即ちネストされた選択へ移動させることが可能である。
【0330】
例えば、非ジョイン基準は「e.emp seqBETWEEN1001and1010」(行4)である。
【0331】
【表148】
ジョイン基準及び推移性のために、このクエリーは以下のように書き直すことが可能である。
【0332】
【表149】
ポインタは、これを複数個の値を取ることが可能な単一列オペランドと考えるのではなく、単に入れ子即ちネストされた選択における基準を複製させることである。
【0333】
ドライビングテーブル
インデックスされていない非ジョイン基準を有するクエリーが存在する場合がある。例えば、インデックスサーチがクエリーをスタートさせる方法は存在しない。インデックスされた非ジョイン基準を有するクエリーが存在する場合がある。最後に、非ジョイン基準を有することのないクエリーが存在する場合がある。別の重要な考慮事項は、ジョイン基準が両側でインデックスされているか否かである。これら全ては最適化モードが何であるかと共に考慮されねばならない。
【0334】
以下に参照する非ジョイン基準は1つのオペランドがサブクエリーであるものを包含していることに注意すべきである。又、メインクエリーのみならず1つを超えるテーブルを有する全てのサブクエリーに対して可能なドライビングテーブルを決定すべきであることにも注意すべきである。
【0335】
非ジョイン基準が存在する場合
ドライビングテーブルを決定することは使用されている最適化モードに基づいている。
【0336】
FIRST ROWS
最適化モードがFIRST ROWSに設定されている場合には、FROM句におけるテーブル/ビュー又は入れ子即ちネストされている選択に対して(それはアウタージョインテーブルではない)、インデックスされている非ジョイン基準及びインデックスされていない非ジョイン基準の数をカウントする。そのテーブルが何等かのインデックスされている非ジョイン基準を有している場合には、そのテーブルはクエリーをドライブするために使用することが可能である。該テーブルのどれもがインデックスされている非ジョイン基準を有するものでない場合には、可能なドライビングテーブルはいずれかのインデックスされていない非ジョイン基準を有するものである。
【0337】
ALL ROWS
最適化モードがALL ROWSに設定されている場合には、FROM句におけるテーブル/ビュー又は入れ子即ちネストされている選択に対して(それはアウタージョインテーブルではない)、インデックスされているか否かに拘わらず非ジョイン基準の数を単にカウントする。可能なドライビングテーブルは非ジョイン基準を有するものである(そのカウントはジョイン順番を決定する場合に後に使用される)。
【0338】
以下のSQLステートメントは、両方の最適化モード変換を例示するために使用する。
【0339】
【表150】
上のSQLの場合、最適化モードがFIRST ROWSである場合には、LNAMEに関するインデックスされている非ジョイン基準のために、EMPLOYEESがドライビングテーブルとなることが可能である(LNAMEは連結されたインデックスの一部であるという事実を忘れることが可能である)。RELATIONに関する非ジョイン基準はインデックスされておらず、従ってDEPENDENTSはドライビングテーブルとなることは不可能である。更に、ASSIGNMENTSに関して非ジョイン基準は存在していない。従って、唯一の可能なドライビングテーブルはEMPLOYEESである。
【0340】
上のSQLの場合、最適化モードがALL ROWSである場合には、EMPLOYEES及びDEPENDENTSの両方がドライビングテーブルとなることが可能である。何故ならば、それらは両方共非ジョイン基準を有しているからである。この場合も、ASSIGNMENTSは何等非ジョイン基準を有するものではなく、従ってドライビングテーブルとなることは不可能である。
【0341】
非ジョイン基準でない場合
絶対的に非ジョイン基準が存在することはなく且つ参照完全性を介してか又はユーザのジョインを介してのいずれかによりヒエラルキー即ち階層を知得している場合(ユニークなインデックスを使用する側がペアレント(親)側であり、且つユニークでないインデックスを有する側がチャイルド(子)側である)、ドライビングテーブルは最上のペアレント(親)とすべきである。それはFIRST ROWS及びALL ROWS最適化モードの両方に対してそうすべきである。
【0342】
例えば、以下の例において参照完全性が存在しないものと仮定する。
【0343】
【表151】
EMPLOYEES及びBEPENDENTSの間のジョインはEMPLOYEES側においてユニークなインデックスを使用し且つDEPENDENTS側においてユニークでないものを使用する。従って、EMPLOYEESはペアレント即ち親であると考えられ、DEPENDENTSはチャイルド即ち子であると考えられる。EMPLOYEES及びASSIGNMENTSの間のジョインはEMPLOYEES側のユニークなインデックスを使用する。然しながら、ASSIGNMENTS側にはインデックスは存在しない(EMP SEQを包含するインデックスが存在するが前端の列としてではない)。次のセクション「If Un−Indexed Join Criteria」はこのことの意味を説明する。
【0344】
従って、上の例の場合には、EMPLOYEESはクエリーをドライビングするための唯一の候補者である(然しながら、次のセクションにおいては、ジョインインデックスの欠如に起因してASSIGNMENTSも可能なドライバとして考えることが可能である)。
【0345】
1つを超えるテーブルが最上テーブルと考えることが可能なクエリーに関してはどうであろうか?以下のSQLが例示している。
【0346】
【表152】
この場合には、EMPLOYEES及びDEPARTMENTSの両方がDEPE HISTORYのペアレントである。従って、両方がドライビングテーブルとしてテストすることが可能である。
【0347】
非インデックス型ジョイン基準
テーブルのジョインがインデックスされていない場合には、最適化モードがALL ROWSである場合には、そのテーブルはクエリーをドライビング即ち駆動するための候補者である。注意すべきことであるが、そのテーブルが何等非ジョイン基準を有するものでなく、一方他のテーブルが有する場合であっても、ALL ROWSクエリーをドライブすることが可能である。最適化モードがFIRST ROWSである場合には、そのテーブルに関して非ジョイン基準が存在しない限り、このようなテーブルは考慮されない。例えば、インデックスされている基準を有するテーブルに対して優先性を与える前のルール(規則)を使用する。以下の例が例示している。
【0348】
【表153】
上のクエリーにおけるASSIGNMENTSは「t.proj seq」に関するインデックスを有するものではない。従って、ASSIGNMENTSは、又,ALL ROWS最適化モードにおいて該クエリーをドライブする候補者である。
【0349】
アウタージョイン
テーブルがアウタージョインされている場合には、それはドライビングテーブルとして使用されるべきではない。従って、以下の例に例示されるように、DEPENDENTSに関して非ジョイン基準が存在する場合であっても、DEPENDENTSはいまだに該クエリーを駆動するために使用することは不可能である。
【0350】
【表154】
FROM句入れ子型選択
以下のクエリーは、アウタージョインの場合の問題を例示している。入れ子型即ちネストされた選択は非ジョイン基準においてサブクエリーとして作用するので、サブクエリーは常にドライビングテーブルとすべきである。実際に、アウタージョインされていない全ての入れ子型即ちネストされているSELECTSは、それらが非ジョイン基準を有するか否かに拘わらずに最初にジョインされる。
【0351】
以下のクエリーにおいては、サブクエリーが最初にジョインされる場合に最善のプランが発生し、それにより履歴レコードの選択をより効率的にドライブ即ち駆動する。このことは以下のORDEREDヒントセクションにおいて更に説明する。
【0352】
【表155】
ビュー
理想的に,本システムはビュー(view)を包含するクエリーのみならず非ジョイン基準に対してビュー定義それ自身をチェックすべきである。ビュー定義が1つのビューを包含している場合には、該ビューを反復的にチェックすることはしない。1つのレベルで充分であり、且つ、しばしば、それが必要とされる全てである。又、ビューは複数個のテーブルのジョインである場合であることに注意すべきである。
【0353】
本プロセスを簡単化するために、ビューを潜在的なドライビングテーブルとして考慮する。
【0354】
ジョイン順番
ジョイン順番に関して決定をする前に、本システムはどこからスタートするかを知ることを必要とする。例えば、FROM句における潜在的なドライビングテーブル/ビュー又は入れ子型選択は何であるか。(上のドライビングテーブル参照)
ORDEREDヒントはジョイン順番を特定するために使用される。
【0355】
最初に、ジョイン順番を特定するSQLステートメントの場合、ORDEREDヒントなしでそれをテストする。例えば、これはテストされる最初の順列(ORDEREDヒント無し)である。他の順列は決定された種々のドライビングテーブルに基づいている。SQLステートメントがクエリーをドライブすることが可能な2つのテーブルを有している場合には、少なくとも3個の順列が存在しており、即ちオリジナル及び異なるドライビングテーブルを有するORDEREDヒントを使用する2つである。
【0356】
ドライビングテーブルのうちの1つを選択する。FROM句におけるオブジェクト間のヒエラルキー即ち階層を見て、どのジョイン経路が「最高の(MOST)」非ジョイン基準と遭遇するかをチェックする(その場合に、FIRST ROWSは存在する場合にインデックスされている非ジョイン基準を創作し、そうでない場合にはインデックスされていない非ジョイン基準を創作し、且つALL ROWSは、インデックスされているかに拘わらず、最高の非ジョイン基準のみを創作する)。全てのオブジェクトが非ジョイン基準とジョインされた後に、他のジョインは問題ではなく、従ってこれらのテーブルの変形例を作成することはない。
【0357】
以下の例が例示している。
【0358】
例1
以下の例はALL ROWS最適化モードの場合である。
【0359】
【表156】
PROJECTSに関して1つの非ジョイン基準が存在しており且つ入れ子型即ちネストされた選択に対して1つ存在している。この例に対するヒエラルキー即ち階層は図10に示してある。図10に示したように、このヒエラルキーは入れ子型選択をEMPLOYEESのチャイルド(子)として図示している。これは、SAL HISTORYがEMPLOYEESのチャイルドであることを既知であるのでこの場合にうまく行く。点線は以下に更に詳細に説明するようにその関係が推移性を介してのものであることを示している。
【0360】
推移性のために、PROJECTSがドライビングテーブルとして選択される場合には、最高の非ジョイン基準の方向にジョインすることを所望する。それは可及的速やかに入れ子型即ちネストされている選択へ到達することを所望することを意味している。従って、ジョインは以下のようにすべきである。
【0361】
【表157】
入れ子型選択がドライバとして選択される場合には、ジョインは以下のようにすべきである。
【0362】
【表158】
それは前のSQLにおける非ジョイン基準の全てがインデックスされていたことになり,従って同一のジョイン順番が使用される。
【0363】
例2
以下の例はFIRST ROWS及びALL ROWS最適化モードの場合である。
【0364】
【表159】
EMPLOYEESと入れ子型選択との間のジョイン基準は両側においてインデックスされている。然しながら、非ジョイン基準はネスト型選択において複製されるべきであるので(推移性に関する上のセクションを想起)、両方のオブジェクトがクエリーをドライブすることが可能である。
【0365】
例3
このクエリーはFIRST ROWS最適化モードの場合に使用されることが意図されている。これは使用されるスタンダードの履歴データクエリーである。ここでのポイントは各規準におけるオペランドのうちの1つがサブクエリーである場合の非ジョイン基準である。各場合における他のオペランドはインデックスされているので、これらはインデックスされている非ジョイン基準と考えられる。
【0366】
【表160】
この例に対するヒエラルキーを図11に示してある。点線は推移的ジョインを表わしている。履歴テーブルの各々はインデックスされた非ジョイン基準を有しているので、それらは直接的にジョインさせることが可能である。従って、履歴テーブルのうちの何れもドライビングテーブルとなることが可能である。デフォルト以外の異なるジョイン順番は以下の如くである。
【0367】
【表161】
又は、
【表162】
又は、
【表163】
又は、
【表164】
又は、
【表165】
又は、
【表166】
例4
さて、例3におけるサブクエリーがFROM句へ移動された場合はどうであろうか?この場合は、入れ子型選択が多分クエリーをドライブすることが可能である。これらALL ROWS最適化モードであると仮定する。
【0368】
【表167】
この例に対するヒエラルキーを図12に示してある。注意すべきであるが、EMP SEQの推移性のために履歴テーブルの間には推移的ジョイン基準が存在している。例えば、「s.emp seq=x1.emp seq」、及び「s.emp seq=e.emp seq」、「e.emp seq=j.emp seq」、「j.emp seq=x2.emp seq」であるので、「x1.emp seq=x2.emp seq」である。
【0369】
更に、注意すべきことであるが、履歴テーブルに対して非ジョイン基準は存在しておらず、単に入れ子型選択のみである。従って、履歴テーブルのいずれもがクエリーをドライブすることは不可能である。いずれの場合においても、ドライビングテーブルに関して上述したようにFROM句における入れ子型サブクエリーは常にドライバとなることが可能である。
【0370】
更に、可能なジョイン順番が存在している。それを見ることをより容易なものとさせるために、ネスト型選択に対してエイリアスが与えられ、即ち、SAL HISTORYに関する入れ子型選択に対してS.N.であり、DEPT HISTORYに関する入れ子型選択に対してDNである等である。更に、前述したように、本システムは非ジョイン基準を有することのないオブジェクトの並べ替えに関しては問題にすることはない。
【0371】
【表168】
【表169】
【表170】
【表171】
【表172】
【表173】
注意すべきであるが、後のテーブルはそれらの順番が一定である。初期的な順番は変化させることが可能であるが、種々のジョイント順番に対してそれは常に一定に止まる。
【0372】
クラスター型テーブル
テーブルがクエリー内の他のテーブルのうちの1つに対してクラスターされているすなわち寄せ集められている場合には、これらのテーブルは他のテーブルの中間的ジョイン無しで一体的にジョインされるべきである。例えば、ASSIGNMENTS、PROJECTS、TIME SHEETSは同一のハッシュクラスター(hash cluster)内にある。以下のクエリーが例示している。
【0373】
【表174】
この例に対するヒエラルキーを図13に示してある。遷移的ジョイン関係は点線によって図13に示してある。TIME SHEETSのみが非ジョイン基準を有している。従って、TIME SHEETSは唯一のドライバである。このクラスター構成及びその他においての非ジョイン基準の欠如のために、全てのクラスターされているテーブルは以下の如くにして次にジョインされるべきである。
【0374】
【表175】
ORDEREDヒント
ORDEREDヒントは常に動作する。然しながら、ジョイン基準がジョインの順番を可能とさせる場合に本システムはより効率的なものとなる。しばしば、このことは、現在のジョイン基準における推移性に対応するジョイン基準を付加することを意味する。
【0375】
ジョイン順番を選択する場合に、本システムは、明示的なジョイン基準が存在するか否かをチェックせねばならない。そうでない場合には、本システムは推移性を介してどこでジョイン基準が暗示されるかをチェックすべきである。そうである場合には、暗示されたジョイン基準が存在し、その基準はテストの前にクエリーに付加すべきである。パラメータは既にORDEREDヒント内に内蔵されているので、暗示されたジョイン基準はORDEREDヒント内に継続して内蔵されるべきである。本システムがこれらにおけるジョイン順番を取扱うのは、ユーザがORDEREDヒントを手作業で使用することを可能とさせる場合である。何故ならば、他の最適化モードに対してSQLテストを修正することは望ましくないからである。
【0376】
以下の例の場合には、テーブルX1とX2との間に明示的なジョイン基準は存在しないが、推移性を介してジョインが存在する。チェックする方法は、X1からX2へのジョイン経路に追従することである。例えば、X1からSへ、ジョインは「x1.emp seq=s.emp seq and x1.col1=s.effective date」である。SからEへのジョインはEMP SEQに関してである。このことは暗示的に「x1.emp seq=e.emp seq」を与える。継続してX2へのジョイン経路を追従して、EMP SEQを介してEからDへ移行する。従って、「x1.emp seq=d.emp seq」ということが可能である。最後に、その経路は「d.emp seq=x2.emp seq and d.effective date=x2.col1」」を介してDからX2へ移行する。従って、該経路は、最終的に、「x1.emp seq=x2.emp seq」である。ORDEREDヒントはX1をX2へジョインさせることを望むものであり、且つ暗示的なジョイン基準「x1.emp seq=x2.emp seq」が存在するので、その基準はORDEREDに対するパラメータとして付加されるべきである。
【0377】
同一の処理を、X2とX3との間の推移的ジョイン基準を得るために実施することが可能である。例えば、「x2.emp seq=x3.emp seq」である。X3は明示的にEにジョインされるものではないので、本システムはジョイン基準「x3.emp seq=e.emp seq」を包含すべきである。
【0378】
暗示的ジョイン基準を有するORDEREDヒントの提案されるフォーマットは以下の通りである。
【0379】
【表176】
FROM句における入れ子型選択
入れ子型即ちネストされた選択がFROM句内に存在しており且つ非ジョイン基準がメインSQLモジュールにおいてそれを参照する場合には、本システムはその基準を入れ子型SELECTのWHERE句へ移動させることをチェックする。例えば、以下のSQLステートメント、
【表177】
を以下のものへ変換することが可能である。
【0380】
【表178】
この場合には、非ジョイン基準がサブクエリーへ移動されてジョインの後に後にフィルタする前に資格が与えられる行数を減少させる。
【0381】
注意すべきことであるが、幾つかのデータベースは既にこのことを考慮する場合があるが、該基準をWHERE句へ移動させることは有益的であり且つ早期にヒントを特定させることを可能とする。
【0382】
NOT処理した論理
NOT処理した基準は、通常、最適化と言う観点においてここで考慮されることはない。何故ならば、それは関係ないからである。即ち、データベースは、典型的に、NOT処理された基準の置き換えを自動的に取り扱う。
【0383】
NVL関数
この関数に対するデフォルトパラメータがオペランド定数と等しくない場合には、WHERE NVL(cost,0)=10はNULLがリターンされる場合にWHERE 0=10と評価する。従って、デフォルト(0)は10に等しくないので、NVL関数を落とすことが可能であり、従って基準がインデックスを使用することを可能とさせる。基準がインデックスを使用することが可能でない場合には、何もなされない。その列がNULLable即ちヌル化可能でない場合には、NVL関数に対する理由は全く存在しないので、行うことはない。
【0384】
WHERE NVL(cost,0)=0は、他のインデックスされている基準が存在していない限り、おきかえられるべきではない。例えば、これが発生しなかった場合には、本システムはWHERE cost=0 or cost is nullへ置き換えねばならない。それは他のインデックスされている基準なしで完全なテーブルスキャンを必要とする。例えば、下の例を見てみる。
【0385】
【表179】
は以下のように変換することが可能であり、
【表180】
従って、これは更に次のように変換することが可能である。
【0386】
【表181】
各SQLモジュール(例えば、各入れ子型クエリー)を別々に最適化することがより可能となる。更に、注意すべきことであるが、その変換は底部モジュールにおいてスタンダードの不等式を包含するものではない。ORが同一の列にあるのでその必要性はない。OR処理された基準は以下に更に詳細に説明する。
【0387】
OR処理された基準
以下の例は、どのようにして本システムがOR処理された基準を取扱うかを説明する。例えば、以下のSQLステートメント、
【表182】
は以下のように書き直すことが可能である。
【0388】
【表183】
列A及びBがヌル化可能である場合には、そのアプローチは以下の通りである。
【0389】
【表184】
以下のように書かれるWHERE句は、
【表185】
は以下の通りに書き直すことが可能である。
【0390】
【表186】
「IS NOT NULL」は、列がヌル化可能である場合に付加すべきである。
【0391】
新たなプラン演算
ビットマップキー反復
これは、サブクリエーが複数個の値を出力する場合に発生し、次いでビットマップインデックスへ移行する。IN等の場合にも発生するかをチェックする。以前に、BITMAP ORはビットマップインデックス上でIN演算子で複数個の値を取扱かっている。
【0392】
その他のヒント
データウエアハウス処理において、該データウエアハウスにおける主要な情報を包含する1つ又はそれ以上の非常に大きな事実テーブル及び各々が事実テーブルにおける特定の属性に対するエントリに関する情報を包含している多数のより小さなディメンジョンテーブル(例えば、ルックアップテーブル)を描写するためにスタースキーマー(star schema)を使用することが可能である。
【0393】
スタークエリー(star query)は事実テーブルと多数のルックアップテーブルとの間のジョインである。各ルックアップテーブルは、プライマリーキー(primary−key)対フォーリンキー(foreign−key)ジョインを使用して事実テーブルに対してジョインされる。然しながら、ルックアップテーブルは互いにジョインされることはない。
【0394】
スター変換はスタークエリーを効率的に実行することを目標にしたコストベース即ちコストを基礎としたクエリー変換である。スターオプティマイゼーションは少数のディメンジョン及び稠密事実テーブルを有するスキーマーに対して良好に働く場合があるが、スター変換は以下のうちのいずれかが真である場合に代替物として考えることが可能である。例えば、ディメンジョンの数が大きいか又は事実テーブルがまばらである場合にはスター変換が有用である場合がある。更に、全てのディメンジョンテーブルが拘束用プレディケート即ち述語を有するものでないクエリーが存在する場合にスター変換が有用である場合がある。スター変換はディメンジョンテーブルのカーテシアンプロダクト即ち直積を計算することに依存するものではなく、そのことは、事実テーブルがまばらであること及び/又は多数のディメンジョンが事実テーブルにおける実際のマッチを有する行を殆ど有することのない大きなカーテシアンプロダクト即ち直積となる場合にそれをより適切なものとさせる。更に、連結されたインデックスに依存する代わりに、スター変換は個々の事実テーブルの列に関するビットマップインデックスを結合することに基づいている。従って、該変換は拘束されたディメンジョンに対して精密に対応するインデックスを結合させることが可能である。異なる列順番が異なるクエリーにおける拘束されたディメンジョンの異なるパターンとマッチする場合に多数の連結されたインデックスを作成することは必要ではない。
【0395】
「STAR TRANSFORMATION」は、本システムを変換が使用される最善のプランを使用させる。このことは事実テーブル内にビットマップインデックスが存在しておりディメンジョンテーブルに関して充分な基準が存在している場合に発生する。
【0396】
スター変換はある特性を有するテーブルに対してサポートされることはない。例えば、以下の特性を有するテーブルはサポートされない。ビットマップアクセス経路と適合性のないテーブルヒントを有するテーブル、ビットマップインデックスが少な過ぎるテーブル(サブクエリーを発生することを考慮するためにオプティマイザーに対し事実テーブル列に関するビットマップインデックスが存在すべきである)、遠隔したテーブル(然しながら、遠隔ディメンジョンテーブルは発生されるサブクエリーにおいて許容される)、アンチジョイン型テーブル、サブクエリーにおいて既にディメンジョンテーブルとして使用されたテーブル、ビューのパーテションではなく実際にマージされなかったビューであるテーブル、良好な単一テーブルアクセス経路を具備するテーブル、及び変換が価値あるものであるためには小さ過ぎるテーブル等である。
【0397】
以下の例はクエリーにおいて早期に入れ子型選択の結果を減少させることを例示している。例えば、ユーザがFROM句内の入れ子型選択で以下のクエリーをエンターした場合。
【0398】
【表187】
ユーザは、以下に示したように、入れ子型選択で該基準を設定すべきである。そのようにして、入れ子型選択の結果は早期に減少させることが可能である。
【0399】
【表188】
OBJECT INSTANCE
最適化期間中にテーブルがアクセスされない場合には、本システムはSQLステートメント内にどのテーブルが存在しているかを見分けることが不可能である。例えば、以下のSQLステートメントにおいて、ASSIGNMENTS及びPROJECTSの両方はそれらのインデックスアクセスによってALL ROWSモードにおいて表わされるのみである。即ち、テーブルへアクセスすることは必要ではない。従って、ユーザがASSIGNMENTSに対するインデックス操作に関してクリックする場合に、SQLにおいてプランとSQLとの間の関係を識別するために何もハイライトされることはない。
【0400】
【表189】
本システムは、少なくとも、そのテーブルが全体的なSQLステートメントにおいてユニーク即ち独特のものであるか否かをチェックすべきである。そうである場合には、本システムは、ユーザがそのインデックス操作に関してクリックした場合にそのテーブルをハイライトすべきである。
【0401】
オブジェクトインスタンス
FROM句内に入れ子型即ちネストされた選択が存在している場合には、本システムは入れ子型選択内側のオブジェクトに対して与えられているOBJECT INSTANCE値のみならず入れ子型選択に与えられているOBJECT INSTANCE値を考慮することはない。
【0402】
代替的SQL
ユーザがFIRST ROWSモードを所望する場合には、一般的にはサブクエリーをFROM句へ移動させることは意味がない。マージは常に良好であるが、必ずしも移動に対してはそうではない。例えば、履歴データクエリーの例をチェックとすると良い。実際に、相関されているサブクエリーをそのままにさせるか、又は相関されていないものを相関されたものへ変換させることが意味がある場合がある。
【0403】
オリジナルのSQLが特定したもの以外のジョイン順番を要求するORDEREDヒントが付加される場合には、本システムはFROM句を並べ替え且つそれをデータベースへパスする。然しながら、本システムが並べ替える場合には、それは、未だに、パラメータと共にオリジナルのORDEREDヒントを示している。該パラメータは実際のヒントシンタックスの一部ではないので本システムはSQLに対するHINTSモードを表示する場合にそのORDEREDヒントに対するパラメータを落とす。例えば、EDITウインドウ内のオリジナルのSQLが以下のものである場合、
【表190】
このことはキーワードHINTS1の消滅及びFROM句の変化と一貫している。即ち、特定のモードに対するSQLウインドウはデータベースへパスされたものを正確に表示すべきである。これは、ジョイン基準がORDEREDヒントへ付加される場合になされるべきである。
【0404】
レポート
有用なレポートは、どの「インデックスされた列(単一列インデックス)」がヒストグラムを作成することから利点が得られる場合があるかを推薦するものである。ヒストグラムは正規分布を有するものではない列に関して構成されるに過ぎないので、正規分布を有することのない列を探すことが必要である。
【0405】
“HINTS”:ALL ROWSの場合、「テーブルへジョイン」インデックスがそのテーブルより大きい場合には、FULLとさせる。
【0406】
SQLチェック
サブクエリーが関係演算子、NOT IN又はALLのいずれかの形式とインターフェースされる場合には、本システムは以下のメッセージを表示し、且つ、可能である場合にはサブクエリーをハイライトすることが可能である。
【0407】
“サブクエリーが行をリターンしない場合(空のセット)、そのサブクエリーを包含する基準はTRUEへ評価し、即ち、それは、そのサブクエリーが1つの行をリターンしない場合にNOT EXISTSと全く同じに機能する。”
代替的SQL
サブクエリーが同一のテーブルを参照する基準内に供給する列をリターンする場合には、そのサブクエリーの選択リストはその代わりにROWIDを包含すべく変更されるべきである。例えば、以下の履歴クエリーを見てみると、
【表191】
は以下のものへ変換することが可能である。
【0408】
【表192】
ヒント
ヒントが適用される場合には、ユーザはヒントが影響を与えたか否かを判別せねばならない。本システムは、ヒントが所望の影響を及ぼさなかったことをユーザに知らせるためのフィードバックを提供することが可能である。例えば、本システムは、OREDEDヒントが特定した順番でジョインされたか否かをユーザへ知らせることが可能である。
【0409】
NOT IN又はNOT EXISTSサブクエリーを包含するクエリーの場合、推移性を適用することが可能であり、従って周囲即ち外部クエリーにおけるインターフェース列は同一のテーブルに属する。このことはNOT IN及びNOT EXISTSサブクエリーをマージさせる。何故ならば、テーブルは1つを超えるテーブルへアウタージョインさせることは不可能だからである。例えば、以下のSQLステートメント、
【表193】
は以下のものへ変換することが可能であり、
【表194】
次いで、以下のものへ変換することが可能である。
【0410】
【表195】
以下の例は、NOT IN及びNOT EXISTSサブクエリーをマージさせてジョインすることを例示している。例えば、以下のSQLステートメント、
【表196】
は以下のものへ変換され、
【表197】
然しながら、サブクエリーは以下のようにしてマージされるべきである。
【0411】
【表198】
本システムは、周囲即ち取囲みインターフェース列内の定数をサブクエリーへ移動させることにより、以下のようにして、SQL4をSQL5へ変換し次いでSQL6へ変換することが可能である。例えば、オリジナルのSQLステートメント、
【表199】
は以下のものへ変換することが可能であり、
【表200】
それは以下のものへ変換することが可能である。
【0412】
【表201】
以下のクエリーは、サブクエリーテーブルがマージされた場合にテーブルヘアウタージョインされねばならないので、変換することは不可能である。サブクエリーはそれ自身で定数へアウタージョインさせることは不可能である。
【0413】
【表202】
サブクエリーインターフェース列が定数である場合には、ジョインされた場合に全てのテーブルがユニーク即ち独特なものである場合には、マージを実施することが可能である。サブクエリーをマージする場合には、定数Θが対応する周囲即ち取囲みインターフェース列に対するNOT EQUALSへセットされ且つ「<child>.ROWID IS NULL」とOR処理される。例えば、SQLステートメント、
【表203】
は次のものへ変換することが可能である。
【0414】
【表204】
SQLステートメンを変換しようとする場合に注意をせねばならない。例えば、以下のSQLステートメント、
【表205】
を以下のものへ変換させようとすることが可能である。
【0415】
【表206】
然しながら、このことは正しいことではない。何故ならば、ここでオリジナルのSQLをアウタークエリーへマージさせることは不可能だからである。このことは正しくない変換となる。
【0416】
本システムが任意のテーブルで「ROWID IS NULL」句を付加しようとする場合に別の問題が発生する場合がある。例えば、時々、本システムはプロジェクトテーブルを選択し且つ、時々、それは、FROM句における順番に依存して、アサイメントテーブルを選択する場合がある。このことは正しいことではない。再開レベルのチャイルドテーブルがヌルであることを確かめるための注意を払うべきである(例えば、プロジェクトテーブル)。そうでない場合には、チャイルドテーブル(この場合にはプロジェクト)に対するジョイン基準は問題はない。
【0417】
以下のルール(規則)及びガイドラインは変換期間中に従われるべきである。
【0418】
A)本システムは以下の場合にのみ変換すべきである、
i)ジョイン順番における全ての中間テーブルはユニークネス即ち独自性を保証するためにジョインされるべきである
ii)1つを超えるブランチが存在する場合がある。然しながら、高々1つの再開レベルのチャイルドテーブルは非ユニークとすることが可能である。その他の全てのテーブルは順番にジョインされた場合にユニークとすべきである。換言すると、上のSQLをチェックする場合に、アサイメントテーブルはインターフェースしたサブクエリー列を具備するテーブルである。それは再開レベルのチャイルドではないので(プロジェクトテーブルがそれにジョインされている)、その選択リストにおける又はWHERE句におけるその列は定数とジョインし、オペレーターはユニークなキーを形成せねばならない。然しながら、emp seqはユニークな列ではない。従って、このサブクエリーはマージさせることが不可能である。然しながら、以下の例のSQL10は、プロジェクト名がユニークな列である場合に変換させることが可能である
iii)クエリーインターフェース列のうちの1つが定数である場合には、ユニーク性を保証するために全てのテーブルをジョインすべきである
iv)集合体関数は存在しない(GROUP BY、DISTINCT、HAVINGは集合体が存在しない限りオーケーである。マージされた場合に、GROUP BY及びDISTINCTを無視し且つHAVING基準をWHERE句へ移動させる)
v)CONNECT BYシンタックスは存在しない
vi)集合演算は存在しない(例えば、UNION、MINUS)
vii)サブクエリーはアウタージョインを包含することはない
B)各より低いレベルのチャイルドに対して、「<child>.ROWID IS NULL」を付加し且つそれらを一体的にOR処理する。
【0419】
C)周囲のインターフェース列内に定数が存在しており且つ他のインターフェース列が存在している場合には、それをサブクエリーWHERE句に対する等値基準へ変化させる。
【0420】
D)サブクエリーインターフェース列内の定数内に定数が存在する場合には、その定数を対応する周囲のインターフェース列に対するNOT EQUALSに対する定数に設定し且つそれを「<child>.ROWID IS NULL」とOR処理する。
【0421】
【表207】
アウタージョインが発生する場合があるかを決定する場合に相関型サブクエリーが問題を提起する場合がある。特に、NOT IN演算子が相関型サブクエリーとインターフェースする場合には、周囲(外部)クエリーにおけるインターフェース列はそのサブクエリーと相関しているテーブルと同一のテーブルに属するものでなければならない。例えば、すぐ下のSQLステートメントを参照すると良い。このサブクエリーにおけるインターフェース列はそのサブクエリーと相関されているテーブルと同一のテーブルに属すべきである。以下の例において、HIREDATE列は相関基準のうちの1つのみならず「e.」に属しているが、その他の相関基準は「a.」を参照する。従って、マージは不可能である。
【0422】
【表208】
上述したルール/ガイドラインA)i)及びA)ii)が真である限り、「[NOT IN]サブクエリー内のインターフェース列はそのサブクエリーと相関しているテーブルと同一のテーブルに属するものでなければならない」は必要ではない。然しながら、周囲の即ち外部のクエリーにおける対応するインターフェース列は、アウタージョインのために、同一のテーブルに属するべきである。変換された場合に、アサイメントテーブルはtime sheets及びemployeesの両方へアウタージョインすることを必要とする。このことは不法なことではない。然しながら、上に示したSQL11ステートメントを以下に示すSQL12へ変換させるために推移性を適用することが可能である。次いで、SQL12を以下に示したようにSQL13へマージさせることが可能である。このマージは、employees及びassignmentsの両方がインターフェース列上のユニークなインデックスを有するものであるので可能である。
【0423】
【表209】
注意すべきことであるが、NOT EXISTS OR NOT INサブクエリーをサブクエリー選択句内の非列(定数、関数等)とマージさせることは不可能である。例えば、以下のSQL14をSQL15へ変換する試みがなされる場合がある。然しながら、SQL15は、t.rpt date=‘22−FEB−94’のためにSQL14と同一の結果セットを発生することはない。該基準はt.rtp date<>‘22−FEB−94’ヘ変化させることが可能である。然しながら、少なくとも1つの行オリジナルのサブクエリーリターンを保証することが必要である。このことは変換の目的を台無しにする。何故ならばそのサブクエリーを維持せねばならないからである。
【0424】
【表210】
Set NOT IN NOT EXISTS Subquery Can Be Query
演算子がNOT IN又はNOT EXISTSである場合には、サブクエリーをジョインへ変換する試みをすべきか否かを決定するために以下のルーチンを呼ぶことが可能である。
【0425】
【表211】
【表212】
【表213】
WHERE句基準がFROM句内の入れ子型即ちネストされている選択内のテーブルを参照するに過ぎない場合には、それを入れ子型即ちネストされている選択へ移動させる。例えば、以下のSQL
【表214】
を以下のものへ変換することが可能である。
【0426】
【表215】
HAVING句基準がグループ関数を関与するものでない場合には、それはWEHRE句へ移動させることが可能である。例えば、以下のSQLステートメント
【表216】
を以下のものへ変換することが可能である。
【0427】
【表217】
本開示は1つ又はそれ以上の従来の汎用デジタルコンピュータを使用して実現することが可能であり及び/又は本明細書の示唆に従ってプログラムすることに役立つ。適宜のソフトウエアコーディングは本開示の示唆に基づいて容易に調整することが可能である。
【0428】
更に、上の説明は特定のデータベースシステム(例えば、オラクル)を参照するものであるが、本開示は任意の特定のデータベース又はデータベースシステムのタイプへ制限されるものとして理解すべきではない。
【0429】
本開示の多数の付加的な修正及び変形例が上の示唆に鑑み可能である。従って、添付の請求の範囲内において、本開示をここに特定的に記載したものとは別に実施することが可能であることを理解すべきである。
【図面の簡単な説明】
【図1】1実施例に基づくデータベースクエリーチューニングプロセスを示したブロック図。
【図2】SQLステートメントを包含するダイアログディスプレイを示した概略図。
【図3】選択最適化モードダイアログディスプレイを示した概略図。
【図4】お気に入りウインドウディスプレイを示した概略図。
【図5】SQLチェックダイアログディスプレイを示した概略図。
【図6】結果ウインドウディスプレイを示した概略図。
【図7】編集又はチューニングウインドウディスプレイを示した概略図。
【図8】詳細結果ウインドウディスプレイを示した概略図。
【図9】本システム及び方法を適用することが可能なコンピュータシステムを示したブロック図。
【図10】種々のSQLステートメントにおけるテーブルに対するヒエラルキーを示したチャート。
【図11】種々のSQLステートメントにおけるテーブルに対するヒエラルキーを示したチャート。
【図12】種々のSQLステートメントにおけるテーブルに対するヒエラルキーを示したチャート。
【図13】種々のSQLステートメントにおけるテーブルに対するヒエラルキーを示したチャート。
Claims (33)
- データベースクエリーを調整する方法において、
データベースクエリーを選択し、
前記選択したデータベースクエリーをパースして前記選択したデータベースクエリーの部分の間の関係を決定し、
複数個の使用可能な最適化モードから1つの最適化モードを選択し、
前記決定した関係及び前記選択した最適化モードに基づいて前記選択したデータベースクエリーの少なくとも1つの部分を修正することによって前記選択したデータベースクエリーを調整し、
前記修正したデータベースクエリーを表示する、
ことを包含している方法。 - 請求項1において、前記パースが前記データベースクエリー内のトークンを決定し、トークンは区切り記号によって分離されたワードである方法。
- 請求項1において、前記複数個の使用可能な最適化モードがコストを基礎としたモード及びルールを基礎としたモードを包含している方法。
- 請求項3において、前記コストを基礎としたモードがFirst Rowsモード及びAll Rowsモードを包含している方法。
- 請求項1において、更に、前記調整したデータベースクエリーを使用することに関連するコストを決定することを包含している方法。
- 請求項5において、更に、前記選択したデータベースクエリーを使用することに関連するコストを前記調整したデータベースクエリーを使用することに関連したコストと比較することを包含している方法。
- 請求項1において、更に、前記ベースベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つによってジョインされている少なくとも1つのサブクエリーを有しているか否かを決定するために前記選択したデータベースクエリーをパースすることを包含している方法。
- 請求項7において、更に、前記データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つを包含しているか否かに基づいて調整期間中に使用すべきお気に入りをユーザが選択することのプロンプトを与えることを包含している方法。
- 請求項8において、NOT EXISTS演算子のNOT IN演算子への変換及び前記選択したデータベースクエリーのアウタージョインへの変換のうちの少なくとも1つをユーザが選択することを可能とするために前記お気に入りがお気に入りの書き直しを包含している方法。
- 請求項8において、ALL演算子によってジョインされたサブクエリーをジョイン又はアウタージョインへ変換させることをユーザが選択することを可能とするために前記お気に入りがお気に入りの書き直しを包含している方法。
- 請求項8において、NOT IN演算子によってジョインされたサブクエリーを変換させるためにNOT EXISTS演算子及びアウタージョインのうちの少なくとも1つを使用するか否かをユーザが選択することを可能とするために前記お気に入りがお気に入りの書き直しを包含している方法。
- データベースクエリーを調整するためのコンピュータ実行可能コードを包含しているコンピュータ格納媒体において、
ユーザがデータベースクエリーを選択することを許容するコンピュータ実行可能コード、
前記選択したデータベースクエリーの一部の間の関係を決定するために前記選択したデータベースクエリーをパースするコンピュータ実行可能コード、
複数個の使用可能な最適化モードからユーザが1つの最適化モードを選択することを許容するコンピュータ実行可能コード、
前記決定した関係及び前記選択した最適化モードに基づいて前記選択したデータベースクエリーの少なくとも一部を修正することによって前記選択したデータベースクエリーを調整するコンピュータ実行可能コード、
前記修正したデータベースクエリーを表示するコンピュータ実行可能コード、を有しているコンピュータ格納媒体。 - 請求項12において、前記パースが前記データベースクエリー内のトークンを決定し、トークンは区切り記号によって分離されているワードであるコンピュータ格納媒体。
- 請求項12において、前記複数個の使用可能な最適化モードがコストを基礎としたモード及びルールを基礎としたモードを包含しているコンピュータ格納媒体。
- 請求項14において、前記コストを基礎としたモードがFirst Rowsモード及びALL Rowsモードを包含しているコンピュータ格納媒体。
- 請求項12において、更に、前記調整したデータベースを使用することに関連するコストを決定するコードを有しているコンピュータ格納媒体。
- 請求項16において、更に、前記選択したデータベースクエリーを使用することに関連するコストを前記調整したデータベースクエリーを使用することに関連するコストと比較するコードを有しているコンピュータ格納媒体。
- 請求項12において、更に、前記データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つによってジョインされている少なくとも1つのサブクエリーを包含しているか否かを決定するために前記選択したデータベースクエリーをパースするコードを有しているコンピュータ格納媒体。
- 請求項18において、更に、前記データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つを包含しているか否かに基づいて調整期間中に使用すべきお気に入りをユーザが選択することのプロンプトを与えるコードを有しているコンピュータ格納媒体。
- 請求項19において、前記お気に入りが、NOT EXISTS演算子のNOT IN演算子への変換及び前記選択したデータベースクエリーのアウタージョインへの変換のうちの少なくとも1つをユーザが選択することを可能とするためのお気に入りの書き直しを包含しているコンピュータ格納媒体。
- 請求項19において、前記お気に入りが、ALL演算子によってジョインされたサブクエリーをジョイン又はアウタージョインへ変換させることをユーザが選択することを可能とするお気に入りの書き直しを包含しているコンピュータ格納媒体。
- 請求項19において、前記お気に入りが、NOT IN演算子によってジョインされたサブクエリーを変換させるためにNOT EXISTS演算子及びアウタージョインのうちの少なくとも1つを使用するか否かをユーザが選択することを可能とさせるお気に入りの書き直しを包含しているコンピュータ格納媒体。
- データベースクエリーを調整するためのプログラムしたコンピュータシステムにおいて、
ユーザに対して少なくとも1つのデータベースクエリーを表示するディスプレイ、
前記表示されているデータベースクエリーの中からデータベースクエリーを及び複数個の使用可能な最適化モードから最適化モードをユーザが選択することを許容するユーザ入力、
前記選択したデータベースクエリーの一部の間の関係を決定するために前記選択したデータベースクエリーをパースし、且つ前記決定した関係及び前記選択した最適化モードに基づいて前記選択したデータベースクエリーの少なくとも1つの部分を修正することによって前記選択したデータベースクエリーを調整するためのプロセッサ、
を有しており、前記修正したデータベースクエリーが前記ディスプレイを介してユーザに表示されるシステム。 - 請求項23において、前記パースが前記データベースクエリー内のトークンを決定し、トークンが区切り記号によって分離されているワードであるシステム。
- 請求項23において、前記複数個の使用可能な最適化モードがコストを基礎としたモード及びルールを基礎としたモードを包含しているシステム。
- 請求項25において、前記コストを基礎としたモードがFirst Rowsモード及びAll Rowsモードを包含しているシステム。
- 請求項23において、前記プロセッサが前記調整したデータベースクエリーを使用することに関連するコストを決定するシステム。
- 請求項27において、前記プロセッサが前記選択したデータベースを使用することに関連するコストと前記調整したデータベースを使用することに関連するコストとを比較するシステム。
- 請求項23において、前記プロセッサが前記選択したデータベースクエリーをパースして前記データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つによってジョインされている少なくとも1つのサブクエリーを包含しているか否かを決定するシステム。
- 請求項29において、前記データベースクエリーがNOT EXISTS、NOT IN、ALL句のうちの少なくとも1つを包含しているか否かに基づいて調整期間中に使用すべきお気に入りをユーザが選択することのプロンプトを前記プロセッサが与えるシステム。
- 請求項30において、前記お気に入りが、NOT EXISTS演算子のNOT IN演算子への変換及び前記選択したデータベースクエリーのアウタージョインへの変換のうちの少なくとも1つをユーザが選択することを可能とするためのお気に入りの書き直しを包含しているシステム。
- 請求項30において、前記お気に入りが、ALL演算子によってジョインされているサブクエリーをジョイン又はアウタージョインへ変換させることをユーザが選択することを可能とするためのお気に入りの書き直しを包含しているシステム。
- 請求項30において、前記お気に入りが、NOT IN演算子によってジョインされているサブクエリーを変換するためにNOT EXISTS演算子及びアウタージョインのうちの少なくとも1つを使用するか否かをユーザが選択することを可能とするためのお気に入りの書き直しを包含しているシステム。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US20737900P | 2000-05-26 | 2000-05-26 | |
PCT/US2001/017171 WO2001093105A2 (en) | 2000-05-26 | 2001-05-25 | System and method for automatically generating database queries |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004509382A true JP2004509382A (ja) | 2004-03-25 |
Family
ID=22770299
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002500250A Pending JP2004509382A (ja) | 2000-05-26 | 2001-05-25 | データベースクエリーを自動的に発生するシステム及び方法 |
Country Status (10)
Country | Link |
---|---|
US (1) | US8019750B2 (ja) |
EP (1) | EP1350184B1 (ja) |
JP (1) | JP2004509382A (ja) |
KR (1) | KR20030047889A (ja) |
CN (1) | CN1592905A (ja) |
AU (2) | AU2001265048B2 (ja) |
BR (1) | BR0111192A (ja) |
CA (1) | CA2409276A1 (ja) |
IL (2) | IL152987A0 (ja) |
WO (1) | WO2001093105A2 (ja) |
Families Citing this family (67)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8910241B2 (en) | 2002-04-25 | 2014-12-09 | Citrix Systems, Inc. | Computer security system |
US8825629B2 (en) * | 2003-09-06 | 2014-09-02 | Oracle International Corporation | Method for index tuning of a SQL statement, and index merging for a multi-statement SQL workload, using a cost-based relational query optimizer |
US7587394B2 (en) * | 2003-09-23 | 2009-09-08 | International Business Machines Corporation | Methods and apparatus for query rewrite with auxiliary attributes in query processing operations |
US7132796B2 (en) | 2003-12-30 | 2006-11-07 | Lg.Philips Lcd Co., Ltd | Organic electroluminescent device and method of fabricating the same |
US7343367B2 (en) * | 2005-05-12 | 2008-03-11 | International Business Machines Corporation | Optimizing a database query that returns a predetermined number of rows using a generated optimized access plan |
US20070143246A1 (en) * | 2005-12-15 | 2007-06-21 | International Business Machines Corporation | Method and apparatus for analyzing the effect of different execution parameters on the performance of a database query |
US7702658B2 (en) * | 2006-01-27 | 2010-04-20 | International Business Machines Corporation | Method for optimistic locking using SQL select, update, delete, and insert statements |
US7882121B2 (en) * | 2006-01-27 | 2011-02-01 | Microsoft Corporation | Generating queries using cardinality constraints |
US8903763B2 (en) | 2006-02-21 | 2014-12-02 | International Business Machines Corporation | Method, system, and program product for transferring document attributes |
CN100403314C (zh) * | 2006-04-19 | 2008-07-16 | 华为技术有限公司 | 一种数据查询方法 |
CN101093493B (zh) * | 2006-06-23 | 2011-08-31 | 国际商业机器公司 | 数据库查询语言转换方法、转换装置 |
US20080040334A1 (en) * | 2006-08-09 | 2008-02-14 | Gad Haber | Operation of Relational Database Optimizers by Inserting Redundant Sub-Queries in Complex Queries |
US8694524B1 (en) * | 2006-08-28 | 2014-04-08 | Teradata Us, Inc. | Parsing a query |
US20080126393A1 (en) * | 2006-11-29 | 2008-05-29 | Bossman Patrick D | Computer program product and system for annotating a problem sql statement for improved understanding |
US8019771B2 (en) * | 2006-11-30 | 2011-09-13 | International Business Machines Corporation | Method for dynamically finding relations between database tables |
US10255583B2 (en) * | 2007-05-01 | 2019-04-09 | Oracle International Corporation | Nested hierarchical rollups by level using a normalized table |
CN100498793C (zh) * | 2007-06-08 | 2009-06-10 | 北京神舟航天软件技术有限公司 | 用基于小波的压缩直方图实现二维谓词选择率估计的方法 |
US8065329B2 (en) * | 2007-06-18 | 2011-11-22 | Oracle International Corporation | Query optimization on VPD protected columns |
US8112421B2 (en) | 2007-07-20 | 2012-02-07 | Microsoft Corporation | Query selection for effectively learning ranking functions |
US7774318B2 (en) * | 2007-07-30 | 2010-08-10 | Sap Ag | Method and system for fast deletion of database information |
US9009181B2 (en) | 2007-08-23 | 2015-04-14 | International Business Machines Corporation | Accessing objects in a service registry and repository |
US7783656B2 (en) * | 2007-09-24 | 2010-08-24 | International Business Machines Corporation | Accessing objects in a service registry and repository using a treat as function |
US8903801B2 (en) * | 2007-09-14 | 2014-12-02 | Oracle International Corporation | Fully automated SQL tuning |
US8600977B2 (en) * | 2007-10-17 | 2013-12-03 | Oracle International Corporation | Automatic recognition and capture of SQL execution plans |
US8516539B2 (en) * | 2007-11-09 | 2013-08-20 | Citrix Systems, Inc | System and method for inferring access policies from access event records |
US8990910B2 (en) * | 2007-11-13 | 2015-03-24 | Citrix Systems, Inc. | System and method using globally unique identities |
CN101436192B (zh) * | 2007-11-16 | 2011-03-16 | 国际商业机器公司 | 用于优化针对垂直存储式数据库的查询的方法和设备 |
US7827153B2 (en) * | 2007-12-19 | 2010-11-02 | Sap Ag | System and method to perform bulk operation database cleanup |
US9240945B2 (en) * | 2008-03-19 | 2016-01-19 | Citrix Systems, Inc. | Access, priority and bandwidth management based on application identity |
US8943575B2 (en) * | 2008-04-30 | 2015-01-27 | Citrix Systems, Inc. | Method and system for policy simulation |
US8150865B2 (en) * | 2008-07-29 | 2012-04-03 | Oracle International Corporation | Techniques for coalescing subqueries |
US8990573B2 (en) * | 2008-11-10 | 2015-03-24 | Citrix Systems, Inc. | System and method for using variable security tag location in network communications |
US8065323B2 (en) * | 2009-02-23 | 2011-11-22 | Oracle International Corporation | Offline validation of data in a database system for foreign key constraints |
US8452754B2 (en) * | 2009-05-08 | 2013-05-28 | Microsoft Corporation | Static analysis framework for database applications |
US8555263B2 (en) * | 2010-01-20 | 2013-10-08 | Aetna Inc. | System and method for code automation |
US10311105B2 (en) * | 2010-12-28 | 2019-06-04 | Microsoft Technology Licensing, Llc | Filtering queried data on data stores |
US8880508B2 (en) * | 2010-12-30 | 2014-11-04 | Sap Se | Processing database queries using format conversion |
US8694525B2 (en) * | 2011-06-24 | 2014-04-08 | Sas Institute Inc. | Systems and methods for performing index joins using auto generative queries |
CN102968420B (zh) * | 2011-08-31 | 2016-05-04 | 国际商业机器公司 | 数据库查询的方法和系统 |
GB2505183A (en) * | 2012-08-21 | 2014-02-26 | Ibm | Discovering composite keys |
US10726010B2 (en) * | 2012-09-04 | 2020-07-28 | Oracle International Corporation | Optimization technique of generalized disjunctive semi/anti join |
KR101432700B1 (ko) * | 2012-10-10 | 2014-08-25 | (주)티베로 | 쿼리의 최적화를 위한 방법 |
US10592506B1 (en) * | 2013-02-13 | 2020-03-17 | Amazon Technologies, Inc. | Query hint specification |
US9146984B1 (en) * | 2013-03-15 | 2015-09-29 | Google Inc. | Enhancing queries for data tables with nested fields |
US20150039555A1 (en) * | 2013-08-02 | 2015-02-05 | International Business Machines Corporation | Heuristically modifying dbms environments using performance analytics |
US10394807B2 (en) * | 2013-11-27 | 2019-08-27 | Paraccel Llc | Rewrite constraints for database queries |
US10621064B2 (en) | 2014-07-07 | 2020-04-14 | Oracle International Corporation | Proactive impact measurement of database changes on production systems |
US9779136B2 (en) * | 2014-09-30 | 2017-10-03 | Linkedin Corporation | Rearranging search operators |
CN104881460A (zh) * | 2015-05-22 | 2015-09-02 | 国云科技股份有限公司 | 一种基于Oracle数据库实现多行数据并为一行显示的方法 |
US10229358B2 (en) * | 2015-08-07 | 2019-03-12 | International Business Machines Corporation | Optimizer problem determination |
CN106598963B (zh) * | 2015-10-14 | 2021-08-10 | 五八同城信息技术有限公司 | 查询语句优化方法及装置 |
US10210223B2 (en) | 2015-10-27 | 2019-02-19 | International Business Machines Corporation | Executing conditions with negation operators in analytical databases |
US10558458B2 (en) * | 2016-06-06 | 2020-02-11 | Microsoft Technology Licensing, Llc | Query optimizer for CPU utilization and code refactoring |
KR101797483B1 (ko) | 2016-07-19 | 2017-11-15 | 주식회사 티맥스데이터 | 데이터베이스 관리 시스템에서 쿼리를 프로세싱하기 위한 기법 |
CN106919678A (zh) * | 2017-02-27 | 2017-07-04 | 武汉珞佳伟业科技有限公司 | 一种数据库查询优化系统及方法 |
US11386058B2 (en) | 2017-09-29 | 2022-07-12 | Oracle International Corporation | Rule-based autonomous database cloud service framework |
US11327932B2 (en) | 2017-09-30 | 2022-05-10 | Oracle International Corporation | Autonomous multitenant database cloud service framework |
US10354203B1 (en) * | 2018-01-31 | 2019-07-16 | Sentio Software, Llc | Systems and methods for continuous active machine learning with document review quality monitoring |
US10733187B2 (en) * | 2018-02-09 | 2020-08-04 | International Business Machines Corporation | Transforming a scalar subquery |
JP7044086B2 (ja) * | 2019-03-15 | 2022-03-30 | オムロン株式会社 | 制御システム、制御方法、および制御プログラム |
US11100104B2 (en) * | 2019-04-09 | 2021-08-24 | Accenture Global Solutions Limited | Query tuning utilizing optimizer hints |
US11151131B2 (en) | 2019-07-19 | 2021-10-19 | Bank Of America Corporation | Query generation from a natural language input |
US11409744B2 (en) * | 2019-08-01 | 2022-08-09 | Thoughtspot, Inc. | Query generation based on merger of subqueries |
CN111209305B (zh) * | 2019-11-19 | 2023-07-18 | 华为云计算技术有限公司 | 查询数据的方法、数据节点、分布式数据库、计算设备 |
EP4136538A4 (en) * | 2020-04-14 | 2024-05-15 | Capital One Services Llc | DATABASE CREATION USING ARRAY TYPE INFORMATION |
US11755579B2 (en) * | 2021-08-04 | 2023-09-12 | Cysiv, Inc. | Database system with run-time query mode selection |
US11847121B2 (en) | 2021-08-27 | 2023-12-19 | International Business Machines Corporation | Compound predicate query statement transformation |
Family Cites Families (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0320266A3 (en) | 1987-12-11 | 1992-03-11 | Hewlett-Packard Company | View composition in a data base management system |
US5555409A (en) | 1990-12-04 | 1996-09-10 | Applied Technical Sysytem, Inc. | Data management systems and methods including creation of composite views of data |
US5347653A (en) | 1991-06-28 | 1994-09-13 | Digital Equipment Corporation | System for reconstructing prior versions of indexes using records indicating changes between successive versions of the indexes |
US5421008A (en) * | 1991-11-08 | 1995-05-30 | International Business Machines Corporation | System for interactive graphical construction of a data base query and storing of the query object links as an object |
US5404510A (en) | 1992-05-21 | 1995-04-04 | Oracle Corporation | Database index design based upon request importance and the reuse and modification of similar existing indexes |
US6259896B1 (en) * | 1994-02-15 | 2001-07-10 | Nokia Mobile Phones Limited | Device for radio communication |
US5560007A (en) * | 1993-06-30 | 1996-09-24 | Borland International, Inc. | B-tree key-range bit map index optimization of database queries |
US5675785A (en) | 1994-10-04 | 1997-10-07 | Hewlett-Packard Company | Data warehouse which is accessed by a user using a schema of virtual tables |
US5758145A (en) | 1995-02-24 | 1998-05-26 | International Business Machines Corporation | Method and apparatus for generating dynamic and hybrid sparse indices for workfiles used in SQL queries |
US5806062A (en) * | 1995-10-17 | 1998-09-08 | Lucent Technologies Inc. | Data analysis system using virtual databases |
US5745904A (en) | 1996-01-12 | 1998-04-28 | Microsoft Corporation | Buffered table user index |
US6061676A (en) * | 1996-05-29 | 2000-05-09 | Lucent Technologies Inc. | Effecting constraint magic rewriting on a query with the multiset version of the relational algebric theta-semijoin operator |
US5761654A (en) * | 1996-06-05 | 1998-06-02 | Oracle Corporation | Memory structure and method for tuning a database statement using a join-tree data structure representation, including selectivity factors, of a master table and detail table |
US5765168A (en) | 1996-08-09 | 1998-06-09 | Digital Equipment Corporation | Method for maintaining an index |
US5765147A (en) | 1996-11-21 | 1998-06-09 | International Business Machines Corportion | Query rewrite for extended search capabilities |
US5956707A (en) * | 1997-02-13 | 1999-09-21 | Chu; Wesley W. | Database system with query relaxation using type abstraction hierarchy (TAH) as query condition relaxation structure |
US6363377B1 (en) * | 1998-07-30 | 2002-03-26 | Sarnoff Corporation | Search data processor |
US6434545B1 (en) * | 1998-12-16 | 2002-08-13 | Microsoft Corporation | Graphical query analyzer |
US6205441B1 (en) * | 1999-03-31 | 2001-03-20 | Compaq Computer Corporation | System and method for reducing compile time in a top down rule based system using rule heuristics based upon the predicted resulting data flow |
EP1109117A1 (en) * | 1999-12-14 | 2001-06-20 | Sun Microsystems, Inc. | Method for converting table data between a database representation and a representation in tag language |
US8825629B2 (en) * | 2003-09-06 | 2014-09-02 | Oracle International Corporation | Method for index tuning of a SQL statement, and index merging for a multi-statement SQL workload, using a cost-based relational query optimizer |
-
2001
- 2001-05-25 AU AU2001265048A patent/AU2001265048B2/en not_active Ceased
- 2001-05-25 CA CA002409276A patent/CA2409276A1/en not_active Abandoned
- 2001-05-25 AU AU6504801A patent/AU6504801A/xx active Pending
- 2001-05-25 BR BR0111192-2A patent/BR0111192A/pt not_active IP Right Cessation
- 2001-05-25 JP JP2002500250A patent/JP2004509382A/ja active Pending
- 2001-05-25 IL IL15298701A patent/IL152987A0/xx unknown
- 2001-05-25 KR KR1020027016062A patent/KR20030047889A/ko not_active Application Discontinuation
- 2001-05-25 EP EP01939541.7A patent/EP1350184B1/en not_active Expired - Lifetime
- 2001-05-25 WO PCT/US2001/017171 patent/WO2001093105A2/en active Application Filing
- 2001-05-25 CN CNA018118208A patent/CN1592905A/zh active Pending
-
2002
- 2002-11-20 IL IL152987A patent/IL152987A/en not_active IP Right Cessation
-
2006
- 2006-01-09 US US11/327,945 patent/US8019750B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
IL152987A0 (en) | 2003-06-24 |
EP1350184B1 (en) | 2014-11-19 |
US20070038618A1 (en) | 2007-02-15 |
CN1592905A (zh) | 2005-03-09 |
BR0111192A (pt) | 2005-05-10 |
IL152987A (en) | 2009-05-04 |
AU6504801A (en) | 2001-12-11 |
CA2409276A1 (en) | 2001-12-06 |
KR20030047889A (ko) | 2003-06-18 |
AU2001265048B2 (en) | 2007-10-18 |
US8019750B2 (en) | 2011-09-13 |
WO2001093105A3 (en) | 2003-07-31 |
EP1350184A2 (en) | 2003-10-08 |
WO2001093105A2 (en) | 2001-12-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2004509382A (ja) | データベースクエリーを自動的に発生するシステム及び方法 | |
AU2001265048A1 (en) | System and method for automatically generating database queries | |
US5615361A (en) | Exploitation of uniqueness properties using a 1-tuple condition for the optimization of SQL queries | |
US6529896B1 (en) | Method of optimizing a query having an existi subquery and a not-exists subquery | |
US5590324A (en) | Optimization of SQL queries using universal quantifiers, set intersection, and max/min aggregation in the presence of nullable columns | |
US5548755A (en) | System for optimizing correlated SQL queries in a relational database using magic decorrelation | |
US6826562B1 (en) | Method of simplifying and optimizing scalar subqueries and derived tables that return exactly or at most one tuple | |
US5761657A (en) | Global optimization of correlated subqueries and exists predicates | |
US6339768B1 (en) | Exploitation of subsumption in optimizing scalar subqueries | |
US8965918B2 (en) | Decomposed query conditions | |
Simitsis et al. | State-space optimization of ETL workflows | |
US5706495A (en) | Encoded-vector indices for decision support and warehousing | |
US5855019A (en) | Enumerating projections in SQL queries containing outer and full outer joins in the presence of inner joins | |
US6032143A (en) | Evaluation of existential and universal subquery in a relational database management system for increased efficiency | |
US6546381B1 (en) | Query optimization system and method | |
US5548758A (en) | Optimization of SQL queries using early-out join transformations of column-bound relational tables | |
US7275056B2 (en) | System and method for transforming queries using window aggregation | |
US6411951B1 (en) | Evaluating SQL subqueries | |
US5822750A (en) | Optimization of correlated SQL queries in a relational database management system | |
US6289334B1 (en) | Apparatus and method for decomposing database queries for database management system including multiprocessor digital data processing system | |
US7080062B1 (en) | Optimizing database queries using query execution plans derived from automatic summary table determining cost based queries | |
EP0747839A1 (en) | Database management system with improved indexed accessing | |
US20080109424A1 (en) | Method of Querying Relational Database Management Systems | |
US6421663B1 (en) | Optimization of joined table expressions by extended access path selection | |
KR20060043011A (ko) | 암시 술어를 이용하는 개선된 쿼리 최적화기 |