(57)【要約】  プログラムコード内のクエリの効率性を向上させるための方法、システム、装置、およびコンピュータープログラム製品が提供される。複数のクエリがプログラムコード内で検出される。クエリがプログラムコード内でそこまでに評価される遅延が拡大される。クエリは、複数のクエリコンポーネントに分解される。複数のクエリより効率的に評価する複数のクエリと機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットがクエリコンポーネントに適用される。
2019523942.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも１つのプロセッサを含むコンピューティングデバイスにおける方法であって、
プログラムコード内の複数のクエリを検出するステップと、
前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させるステップと、
検出された前記クエリよりも効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットを検出された前記クエリに適用するステップと
を含む方法。
【請求項２】
請求項１に記載の方法であって、検出する前記ステップは、
コードエディターにおいて前記プログラムコード内の前記クエリを検出するステップ
を含み、
前記複数のクエリを前記機能的に等価なクエリセットで置き換えるために、前記コードエディターが前記プログラムコードを自動的にリファクタリングするオプションを提示するステップ
をさらに含む方法。
【請求項３】
請求項１に記載の方法であって、検出する前記ステップは、
コンパイル中に前記プログラムコード内の前記クエリを検出するステップ
を含み、
前記複数のクエリが前記機能的に等価なクエリセットで置き換えられたバージョンの前記プログラムコードに基づき、前記コンパイラにおいてコンパイルされたコードを生成するステップ
をさらに含む方法。
【請求項４】
請求項１に記載の方法であって、前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させる前記ステップは、
評価延期可能な前記クエリのうちの１つまたは複数を検出するステップと、
前記１つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成するステップと
を含む、方法。
【請求項５】
請求項１に記載の方法であって、ルールセットを適用する前記ステップは、
複数のクエリコンポーネント間の共通の論理的な前後関係を決定するステップと、
前記共通の論理的な前後関係に対応する前記ルールセットのルールを前記複数のクエリコンポーネントに適用するステップと
を含む、方法。
【請求項６】
請求項１に記載の方法であって、生成された前記機能的に等価なクエリセットは、前記複数のクエリのクエリ結果より少ないメモリ空間しか消費せずにクエリ結果を生成することと、前記複数のクエリより実行の時間がかからずにクエリ結果を生成することと、前記複数のクエリより少ないネットワーク帯域幅しか消費せずにクエリ結果を生成することと、前記複数のクエリより少ない処理能力しか消費せずにクエリ結果を生成することとのうちの少なくとも１つによって、前記複数のクエリよりも効率的に評価する、方法。
【請求項７】
請求項１に記載の方法であって、ルールセットを適用する前記ステップは、
複数の候補となる機能的に等価なクエリセットを生成するために、前記ルールセットのルールの複数の組合せの前記クエリコンポーネントへの前記適用を評価するステップと、
前記複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する１つの候補となる機能的に等価なクエリセットを選択して、生成された前記機能的に等価なクエリセットとするステップと
を含む、方法。
【請求項８】
請求項１に記載の方法であって、ルールセットを適用する前記ステップは、
複数の候補となる機能的に等価なクエリセットを生成するために、前記ルールセットのルールの複数の組合せの前記クエリコンポーネントへの前記適用を実行中に評価するステップと、
前記複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する１つの候補となる機能的に等価なクエリセットを実行中に選択して、生成された前記機能的に等価なクエリセットとするステップと
を含む、方法。
【請求項９】
請求項８に記載の方法であって、前記候補となる機能的に等価なクエリセットのうちの１つまたは複数によってもたらされる効率性の向上は、実行時の実行条件に少なくとも部分的に依存する、方法。
【請求項１０】
請求項１に記載の方法であって、
機械学習を使用して少なくとも１つのルールを生成して前記ルールセットに追加するステップ
をさらに含む方法。
【請求項１１】
少なくとも１つのプロセッサ回路と、
前記少なくとも１つのプロセッサ回路によって実行されるように構成されたプログラムコードを格納する少なくとも１つのメモリであって、前記プログラムコードは演算を行うように構成され、前記演算は、
プログラムコード内の複数のクエリを検出するステップと、
前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させるステップと、
検出された前記クエリよりも効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットを検出された前記クエリに適用するステップと
を含む、少なくとも１つのメモリと
を備えるコンピューティングデバイス。
【請求項１２】
請求項１１に記載のコンピューティングデバイスであって、検出する前記ステップは、
コードエディターにおいて前記プログラムコード内の前記クエリを検出すること
を含み、前記方法は、
前記複数のクエリを前記機能的に等価なクエリセットで置き換えるために、前記コードエディターが前記プログラムコードを自動的にリファクタリングするオプションを提示するステップ
をさらに含む、コンピューティングデバイス。
【請求項１３】
請求項１１に記載のコンピューティングデバイスであって、検出する前記ステップは、
コンパイル中に前記プログラムコード内の前記クエリを検出するステップ
を含み、前記方法は、
前記複数のクエリが前記機能的に等価なクエリセットで置き換えられたバージョンの前記プログラムコードに基づき、前記コンパイラにおいてコンパイルされたコードを生成するステップ
をさらに含む、コンピューティングデバイス。
【請求項１４】
請求項１１に記載のコンピューティングデバイスであって、前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させる前記ステップは、
評価延期可能な前記クエリのうちの１つまたは複数を検出するステップと、
前記１つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成するステップと
を含む、コンピューティングデバイス。
【請求項１５】
コンピュータープログラムロジックが記録されるコンピューター可読媒体を備えるコンピュータープログラム製品であって、
請求項１から１０のいずれかをプロセッサが行うことを可能にするためのコンピュータープログラムロジック手段
を含むコンピュータープログラム製品。
【発明の詳細な説明】
【背景技術】
【０００１】
[0001]ソフトウェア開発者が使用してソフトウェアを開発できる様々なタイプのソフトウェア開発アプリケーションが存在する。統合開発環境（ＩＤＥ：ｉｎｔｅｇｒａｔｅｄ  ｄｅｖｅｌｏｐｍｅｎｔ  ｅｎｖｉｒｏｎｍｅｎｔ）は、１つのパッケージにいくつかの開発ツールを収める一種のソフトウェア開発アプリケーションである。ＩＤＥは、ソースコードエディター（「コードエディター」）、ビルド自動化ツール、およびデバッガーなどのツールを含むことができる。ＩＤＥの例は、カナダ、オタワのＥｃｌｉｐｓｅ  Ｆｏｕｎｄａｔｉｏｎによって開発されたＥｃｌｉｐｓｅ（商標）、カナダ、バンクーバーのＡｃｔｉｖｅＳｔａｔｅによって開発されたＡｃｔｉｖｅＳｔａｔｅ  Ｋｏｍｏｄｏ（商標）、チェコ共和国のＪｅｔＢｒａｉｎｓによって開発されたＩｎｔｅｌｌｉＪ  ＩＤＥＡ、カリフォルニア州レッドウッドシティのＯｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたＯｒａｃｌｅ  ＪＤｅｖｅｌｏｐｅｒ（商標）、Ｏｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたＮｅｔＢｅａｎｓ、カリフォルニア州サンフランシスコのＣｏｄｅｎｖｙによって開発されたＣｏｄｅｎｖｙ（商標）、カリフォルニア州クパチーノのＡｐｐｌｅ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたＸｃｏｄｅ（登録商標）、およびワシントン州レドモンドのＭｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたＭｉｃｒｏｓｏｆｔ（登録商標）  ｖｉｓｕａｌ  ｓｔｕｄｉｏ（登録商標）を含む。
【０００２】
[0002]現在の多くのプログラミング言語が、データに対するクエリをネイティブにサポートする。例えば、Ｍｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたＭｉｃｒｏｓｏｆｔ  ．ＮＥＴ  Ｆｒａｍｅｗｏｒｋは、ＬＩＮＱ（統合言語クエリ（Ｌａｎｇｕａｇｅ  Ｉｎｔｅｇｒａｔｅｄ  Ｑｕｅｒｙ））の形でクエリをサポートし、一方、カリフォルニア州レッドウッドシティのＯｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたＪａｖａ（登録商標）は、Ｓｔｒｅａｍｓの形でクエリをサポートする。プログラミング言語におけるクエリのネイティブサポートは、開発者のために統合クエリ機能がクエリの実際の実装を担当するので、開発者が彼らのプログラムコードのロジック部分に集中することを可能にする。これにより、開発者は、彼らのコーディングのスピードアップを可能にすることができる。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
[0003]しかし、非効率的なクエリの影響を知らないこと、または十分に理解していないことが、非効率的なプログラムコードの開発をもたらすことがある。さらに、ソフトウェアを開発するための今日の最善の手法により、開発者は、より優れた可読性のために彼らのコード内で、比較的大きいメソッド／プロシージャを比較的小さいメソッド／プロシージャに分割する傾向があり、これが、プログラムコード内のクエリの非効率性をもたらすこともある。
【課題を解決するための手段】
【０００４】
[0004]発明を実施するための形態において下記でさらに説明される簡素化した形で概念の選択を紹介するために、本概要が提供される。本概要は、特許請求された主題の主要な特徴または本質的特徴を識別することを意図するものではなく、特許請求の範囲の主題の範囲を限定するために使用されることを意図するものでもない。
【０００５】
[0005]プログラムコード内のクエリの効率性を向上させるための方法、システム、装置、およびコンピュータープログラム製品が提供される。プログラムコードがコードエディターにエンターされるとき、またはコンパイル中などに、複数のクエリがプログラムコード内で検出される。クエリがプログラムコード内でそこまでに評価される遅延（ｌａｚｉｎｅｓｓ）が拡大される。さらに、検出されたクエリより効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットが、検出されたクエリに適用される。
【０００６】
[0006]ユーザーによって手動で生成されること、または機械学習、コード例のビッグデータ分析、等などのアルゴリズムによって自動生成されることを含む任意の手法で、ルールセットに含まれるルールが生成されてよい。このようなルールのセットは、開発者の日々の作業の中で発生するほとんどの共通エラーを著しく改善することができる。
【０００７】
[0007]単一の機能的に等価なクエリセットが生成され、既存クエリのうちの１つまたは複数の代わりにプログラムコードに入力されてよく、また１つのクエリセットがプログラムコードへの入力として選択される、複数の候補となる機能的に等価なクエリセットが生成されてもよい。ユーザーは、プログラムコードへの入力として、候補となる機能的に等価なクエリセットを選択してよく、また候補となる機能的に等価なクエリセットが自動選択されてもよい。候補となる機能的に等価なクエリセットの選択は、選択が（例えば、コードエントリ中、またはコンパイル時といった）開発中に行われるか、実行中に行われるかによって影響を受けることがある。実行中に、実行時間の要因（例えば、ネットワーク可用性、利用可能な処理能力、等などの実行条件）に（少なくとも部分的に）基づいて、プログラムコードへの入力のために複数の候補から、候補となる機能的に等価なクエリセットが選択されてよい。
【０００８】
[0008]本発明のさらなる特徴および利点、ならびに本発明の様々な実施形態の構造および動作が、添付の図面を参照しながら下記で詳細に説明される。本発明は、本明細書で説明される特定の実施形態に限定されないということに留意されたい。このような実施形態は、例証のためだけに本明細書で提示される。さらなる実施形態は、本明細書に収められる教示に基づいて、当業者には明白になるであろう。
【０００９】
[0009]本明細書に組み込まれ、本明細書の一部をなす、添付の図面が本出願の実施形態を示し、本説明と共に、実施形態の原理を説明し、当業者が実施形態を作り、使用することを可能にするのにさらに役立つ。
【図面の簡単な説明】
【００１０】
【図１】[0010]１つの実施形態の例による、プログラムコード内でのクエリ実行の効率性を改善するように構成されたクエリオプティマイザーを収めるコンピューティングデバイスのブロック図である。
【図２】[0011]１つの実施形態の例による、プログラムコード内でのクエリ実行の効率性を改善するように構成されたクエリオプティマイザーを有する開発アプリケーションを含むコンピューティングデバイスのブロック図である。
【図３】[0012]１つの実施形態の例による、プログラムコード内でのクエリ実行の効率性を改善するための処理を示すフローチャートである。
【図４】[0013]１つの実施形態の例による、クエリオプティマイザーのブロック図である。
【図５】[0014]１つの実施形態の例による、コードエディター内で提案された置換クエリセットを生成して、提示するための処理を示すフローチャートである。
【図６】[0015]１つの実施形態の例による、提案された置換クエリセットと共にプログラムコードを表示するコードエディターウィンドウを含むコンピューティングデバイスのブロック図である。
【図７】[0016]１つの実施形態の例による、コンパイル時に置換クエリセットを生成し、実行するための処理を示すフローチャートである。
【図８】[0017]１つの実施形態の例による、プログラムコード内でのクエリ実行の遅延を拡大させるための処理を示すフローチャートである。
【図９】[0018]１つの実施形態の例による、遅延エクステンダーのブロック図である。
【図１０】[0019]１つの実施形態の例による、プログラムコードに対する置換クエリセットを決定するために、ルールセットを適用するための処理を示すフローチャートである。
【図１１】[0020]１つの実施形態の例による、等価クエリセットジェネレーターのブロック図である。
【図１２】[0021]１つの実施形態の例による、複数の候補となる機能的に等価なクエリセットを生成して、この中から選択するための処理を示すフローチャートである。
【図１３】[0022]実施形態を実行するために使用され得るコンピューティングデバイスの例のブロック図である。
【発明を実施するための形態】
【００１１】
[0023]本発明の特徴および利点は、全体を通じて同じ参照文字が対応する要素を識別する図面と併せて読むことにより下記に示される詳細な説明からさらに明白になるであろう。図面では、同じ参照番号は全体的に、同一、機能的に類似、および／または構造的に類似の要素を示す。要素が最初に現れる図面が、対応する参照番号の一番左の桁によって示される。
【００１２】
Ｉ．導入
[0024]本明細書および添付の図面は、本発明の特徴を組み込む１つまたは複数の実施形態を開示する。本発明の範囲は、開示の実施形態に限定されない。開示の実施形態は本発明を例示するにすぎず、開示の実施形態の修正バージョンも本発明によって包含される。本発明の実施形態は、本明細書に添付の特許請求の範囲によって定義される。
【００１３】
[0025]「１つの実施形態（ｏｎｅ  ｅｍｂｏｄｉｍｅｎｔ）」、「実施形態（ａｎ  ｅｍｂｏｄｉｍｅｎｔ）」、「実施形態の例（ａｎ  ｅｘａｍｐｌｅ  ｅｍｂｏｄｉｍｅｎｔ）」、等への明細書内での言及は、説明される実施形態が、特定の特徴、構造、または特性を含んでよいが、あらゆる実施形態が、特定の特徴、構造、または特性を必ずしも含まなくてよいということを示す。その上、このような句は、同じ実施形態を必ずしも参照しない。さらに、特定の特徴、構造、または特性が実施形態に対して説明されるとき、明確に説明されていてもいなくても、他の実施形態に対してこのような特徴、構造、または特性をもたらすことが当業者には知られているということが提起される。
【００１４】
[0026]議論において、特に明記しない限り、本開示の実施形態の１つの特徴または複数の特徴の条件または関連の特性を修飾する「実質的に（ｓｕｂｓｔａｎｔｉａｌｌｙ）」および「おおよそ（ａｂｏｕｔ）」などの形容詞は、アプリケーションが意図されるアプリケーションの実施形態の動作に受入れ可能な許容範囲内に条件または特性が定義されるということを意味すると理解される。
【００１５】
[0027]多くの例示的な実施形態が以下のように説明される。本明細書につけられた任意のセクション／サブセクションの見出しは、限定していることを意図するものではないということに留意されたい。実施形態は本文書の全体を通じて説明され、任意のタイプの実施形態が任意のセクション／サブセクションに含まれてよい。さらに、任意のセクション／サブセクションで開示された実施形態は、同じセクション／サブセクションおよび／または異なるセクション／サブセクションにおいて任意の手法で説明される他の任意の実施形態と組み合わされてよい。
【００１６】
ＩＩ．プログラムコード内のクエリを最適化するための実施形態の例
[0028]現在の多くのプログラミング言語が、クエリをネイティブにサポートする。例えば、Ｍｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたＭｉｃｒｏｓｏｆｔ  ．ＮＥＴ  Ｆｒａｍｅｗｏｒｋは、ＬＩＮＱ（統合言語クエリ）の形でクエリをサポートし、一方、カリフォルニア州レッドウッドシティのＯｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたＪａｖａ（登録商標）は、Ｓｔｒｅａｍｓの形でクエリをサポートする。プログラミング言語におけるクエリのネイティブサポートは、開発者のためにクエリの実際の実装を担当することによって、開発者が彼らのプログラムコードのロジック部分に集中することを可能にする。これにより、開発者は、彼らのコーディングのスピードアップを可能にすることができる。しかし、非効率的なクエリの影響を知らないこと、または十分に理解していないことが、完全に機能しないプログラムコードの開発をもたらす可能性がある。例えば、このようなプログラムコードは、結局は未使用に終わるデータを取得するクエリ、冗長量のデータを取得するクエリ、および／または必要以上に頻繁に、もしくは必要以上に早くデータを取得するクエリを含むことがある。クエリは、同じ論理的な結果を生じる多くの様々なやり方で書かれてよいが、性能に対して非常に様々な影響を与える。
【００１７】
[0029]さらに、ソフトウェアを開発するための今日の最善の手法により、開発者は、より優れた可読性のために彼らのコード内の比較的大きいメソッド／プロシージャを比較的小さいメソッド／プロシージャに分割する傾向がある。現在利用可能なコードオプティマイザーは、このように開発されたコードを最適化するのに苦労することがある。
【００１８】
[0030]実施形態によれば、プログラムコードは、非効率的に実装されるクエリについて自動分析され、クエリは、さらに効率的だが論理的に等価なクエリのセットで置き換えられる。このような実施形態は、（例えば、ＣＰＵ最適化のために）コンパイル中に影響を及ぼすように、ならびに／またはＩＤＥツールおよび／もしくはＩＤＥアドイン内でリファクタリングの提案として実装されるように実装されてよい。例えば、１つの実施形態において、コードエディターは、さらに効率的なクエリセットを決定すること、および開発者のコードに実装されるように、さらに効率的なクエリセットを開発者に提案すること、を行うように構成される。実施形態は、開発者によって可読コードが開発されることを可能にし、さらにコードを、さらに効率的なコードに自動的に変換する。
【００１９】
[0031]１つの実施形態において、クエリオプティマイザーは、（ａ）プログラムコード内のクエリ（例えば、ＬＩＮＱ、Ｓｔｒｅａｍｓ、等）を識別すること、（ｂ）クエリの結果を検査して、これらの使用法／前後関係を決定すること、（ｃ）クエリを極小単位に分解すること、（ｄ）クエリ最適化が実装され得る場所を決定するために、（ａ）、（ｂ）、および（ｃ）を集約すること、を行うように構成されてよい。例えば、ルールのセットに対してパターンマッチングが行われてよく、ルールのセットは、明確に定義されたルールおよび／または自動生成されたルールであってよい。例えば、ルールは、機械学習、コード例のビッグデータ分析、等などのアルゴリズムによって自動生成されてよい。このようなルールのセットは、開発者の日々の作業の中で発生するほとんどの共通エラーを著しく改善することができる。
【００２０】
[0032]したがって、実施形態は、（１）クエリ性能を改善するコード変更を分析および推奨するツールおよび処理、（２）等価なさらに最適化されたクエリに、クエリを自動変更するツールおよび処理、（３）クエリの自動性能改善のための、コンパイラのための事前処理するコード分析ツールおよび処理、（４）（．ＮＥＴにおける「ｅｎｔｉｔｙ  ｆｒａｍｅｗｏｒｋ」、および他の言語における等価物のような）データベースに対するクエリのコードリファクタリングを分析および推奨する自動ツールおよび処理、ならびに実行中に等価なクエリをサンプリングし、シナリオに最善のクエリを自動的に選んで置き換える機械学習を実装するコード最適化ツールおよび処理、のうちの１つまたは複数を提供する。
【００２１】
[0033]本明細書で使用されるように、クエリは、データに対するクエリ（またはリクエスト）であり、データクエリと呼ばれることもある。クエリは、データベース、アプリケーション、ＡＰＩ（アプリケーションプログラミングインターフェース（ａｐｐｌｉｃａｔｉｏｎ  ｐｒｏｇｒａｍｍｉｎｇ  ｉｎｔｅｒｆａｃｅ））、等を含む、データの任意のソースに提供されてよい。データベースに対するクエリは、「データベースクエリ」と呼ばれることがある。
【００２２】
[0034]実施形態は様々な方式で実装されてよい。例えば、図１は、１つの実施形態の例による、プログラムコード内でのクエリ実行の効率性を改善するように構成されたクエリオプティマイザー１０４を収めるコンピューティングデバイス１０２のブロック図を示す。図１に示されるように、クエリオプティマイザー１０４は、開発者（プログラムコードを書く人／入力する人／修正する人）によってエンターされたプログラムコード１０６を受け取る。プログラムコード１０６は複数のクエリ１１０を含む。クエリ１１０は複数のクエリを含み、これらは、１つもしくは複数の別々のクエリ演算子および／または１つもしくは複数のクエリ式（文字列／一連のクエリ演算子）を含むことができる。クエリオプティマイザー１０４は、クエリ１１０に対するクエリの置換セットを分析および生成するように構成され、それによって、置換クエリ１１２を含むリファクタリングされたプログラムコード１０８を出力する。リファクタリングされたプログラムコード１０８は、元のプログラムコード１０６と論理的に等価である（同じ機能を実行する）が、置換クエリ１１２で書き直されるプログラムコードである。置換クエリ１１２は、プログラムコードによって使用されないデータを取得しないようにすること、冗長データの取得リクエストを作成しないようにすること、冗長動作を実行しないようにすること、ならびに／またはあまり頻繁にデータを取得しないこと、および／もしくは後で取得すること（遅延を増大させること）などによって、元のクエリ１１０より効率的に実行するように構成される。
【００２３】
[0035]クエリオプティマイザー１０４は、独立して実装されるか、またはコードエディター、コードコンパイラ、コードデバッガー、等などの、プログラムコードを入力または処理するために開発者によって使用され得る任意のシステムまたはツールに含まれてよい。例えば、図２は、１つの実施形態の例による、クエリオプティマイザー１０４を含む開発アプリケーション２００を含むコンピューティングデバイス１０２のブロック図を示す。開発アプリケーション２００は統合開発環境（ＩＤＥ）の例である。図２に示されるように、コンピューティングデバイス１０２は、開発アプリケーション２００、ストレージ２１０、および通信インターフェース２０８を含む。ストレージ２１０は、プログラムコード１０６および１０８、ならびにルールセット２１６を格納する。開発アプリケーション２００は、ソースコードエディター２０２、コンパイラ２０４、およびデバッガーツール２０６を含む。ソースコードエディター２０２は、ユーザーインターフェース２１２を含む。点線矢印で示されるように、クエリオプティマイザー１０４は、ソースコードエディター２０２、コンパイラ２０４、および／またはデバッガーツール２０６のうちの任意の１つまたは複数に実装されてよく、またこれらによってコールされてもよい。開発アプリケーション２００は、例証目的のために、また実施形態の例として示され、開発アプリケーション２００の特徴のすべてが、すべての実施形態に存在していなければならないというわけではないということに留意されたい。さらに、図２に示されないさらなる特徴がいくつかの実施形態に存在してもよい。図２に示された開発アプリケーション２００の特徴が、以下のように説明される。
【００２４】
[0036]図２に示されるように、開発アプリケーション２００は、１つまたは複数のコンピューティングデバイス１０２に実装されてよい。例えば、ソースコードエディター２０２、コンパイラ２０４、およびデバッガーツール２０６が、同じコンピューティングデバイスに含まれてよく、またソースコードエディター２０２、コンパイラ２０４、およびデバッガーツール２０６のうちの１つまたは複数が、ソースコードエディター２０２、コンパイラ２０４、およびデバッガーツール２０６の他のもののコンピューティングデバイスとは別々の１つまたは複数のコンピューティングデバイスに実装されてもよい。
【００２５】
[0037]コンピューティングデバイス１０２は、任意のタイプの据置型または携帯型コンピューティングデバイスのうちの１つまたは複数であってよく、携帯型コンピューターもしくは携帯型コンピューティングデバイス（例えば、Ｍｉｃｒｏｓｏｆｔ（登録商標）  Ｓｕｒｆａｃｅ（登録商標）デバイス、パーソナルデジタルアシスタント（ＰＤＡ：ｐｅｒｓｏｎａｌ  ｄｉｇｉｔａｌ  ａｓｓｉｓｔａｎｔ）、ラップトップコンピューター、ノートブックコンピューター、Ａｐｐｌｅ  ｉＰａｄ（登録商標）、ネットブック、等などのタブレット型コンピューター）、携帯電話、ウェアラブルコンピューティングデバイス、または他のタイプの携帯型デバイス、あるいはデスクトップコンピューターまたはＰＣ（パーソナルコンピューター（ｐｅｒｓｏｎａｌ  ｃｏｍｐｕｔｅｒ））などの据置型コンピューティングデバイスを含む。
【００２６】
[0038]コードエディター２０２は、本明細書の他の場所で言及される、またはそうでなければ知られている、プログラムコードの編集のために構成される任意の専用または一般のコードエディター（例えば、Ｅｃｌｉｐｓｅ（商標）、ＡｃｔｉｖｅＳｔａｔｅ  Ｋｏｍｏｄｏ（商標）、ＩｎｔｅｌｌｉＪ  ＩＤＥＡ、Ｏｒａｃｌｅ  ＪＤｅｖｅｌｏｐｅｒ（商標）、ＮｅｔＢｅａｎｓ、Ｃｏｄｅｎｖｙ（商標）、Ｘｃｏｄｅ（登録商標）、Ｍｉｃｒｏｓｏｆｔ（登録商標）  Ｖｉｓｕａｌ  Ｓｔｕｄｉｏ（登録商標）、等のコードエディター）であってよい。
【００２７】
[0039]開発者は、アプリケーションのソースコードを生成する際に、プログラムコードをエンターし、修正するために、ソースコードエディター２０２と対話することができる。例えば、開発者は、タイプピング、音声入力、提案されたコードブロックの選択、等などを行うことによって、プログラムコードテキストを追加、修正、または削除するために、ソースコードエディター２０２のユーザーインターフェース２１２と対話することができる。したがって、ユーザーインターフェース２１２は、１つもしくは複数のテキストエントリボックス／ウィンドウ（例えば、図６のコードエディターウィンドウ６０４）、音声認識／言語認識、１つもしくは複数のグラフィカルユーザーインターフェース要素（例えば、ボタン、チェックボックス、ラジオボタン、プルダウンメニュー、等）、および／または開発者が対話できる他のユーザーインターフェース要素を含むことができる。完了時または他の間隔で、ユーザーは、「保存」ボタンまたは他のユーザーインターフェース要素と対話することによって、プログラムコードを保存できるようになることがある。
【００２８】
[0040]例えば、図２に示されるように、開発者は、プログラムコード１０６を生成するために、ソースコードエディター２０２のユーザーインターフェース２１２と対話することができる。プログラムコード１０６はソースコードであり、人間が読めるコンピュータープログラミング言語を使用して書かれた（場合によっては、コメントを含む）コンピューター命令の集合体である。人間が読める適切なコンピュータープログラミング言語の例は、Ｃ＃、Ｃ＋＋、Ｊａｖａ、等を含む。プログラムコード１０６は、１つもしくは複数のファイル内で、または他の形式で受け取られてよい。例えば、プログラムコード１０６は、（Ｃプログラミング言語が使用されるときには）１つまたは複数の「．ｃ」ファイル、（Ｃ＋＋プログラミング言語が使用されるときには）１つまたは複数の「．ｃｐｐ」ファイル、等として受け取られてよい。プログラムコード１０６をリファクタリングするためにソースコードエディター２０２によってクエリオプティマイザー１０４が使用されると、リファクタリングされたプログラムコード１０８がソースコードエディター２０２によって生成され、保存されてよい。実施形態において、ソースコードエディター２０２は、リファクタリングされたプログラムコード１０８内にクエリのさらに効率的なセットを作り出すために、プログラムコード１０６の（「クエリ演算子」とも呼ばれる）クエリコンポーネントにルールセット２１６のルールを適用することができる。
【００２９】
[0041]図２に示されるように、プログラムコード１０６および／または１０８は、ストレージ２１０に格納されてよい。ストレージ２１０は、データを格納するための任意のタイプの物理ストレージハードウェア／回路機器のうちの１つまたは複数を含むことができ、（例えば、ハードディスクドライブ内の）磁気ディスク、（例えば、光ディスクドライブ内の）光ディスク、（例えば、テープドライブ内の）磁気テープ、ＲＡＭデバイス、ＲＯＭデバイス、等などのメモリデバイス、および／または他の任意の適切なタイプの物理ストレージハードウェア／回路機器を含む。
【００３０】
[0042]コンパイラ２０４は、コマンドライン、グラフィカルユーザーインターフェース、等などによって任意の手法で起動されてよい。フルコンパイルを行うためにコンパイラ２０４が起動されるときに、「−ｆｕｌｌ」スイッチまたは他のスイッチが使用されてよい。コンパイラ２０４は、プログラムコード１０６（またはプログラムコード１０８）を受け取ってコンパイルし、機械語２２２を生成するように構成される。特に、コンパイラ２０４は、典型的には、機械語またはオブジェクトコードと呼ばれるバイナリ形式の別のコンピューター言語の形で、プログラムコード１０６および／または１０８を機械語２２２に変換するように構成される。いくつかのケースでは、コンパイラ２０４は複数のステージを含むことができ、最初にプログラムコード１０６を中間形式（例えば、中間言語）にコンバートすることができ、中間形式はその後、機械語２２２にコンバートされる。
【００３１】
[0043]コンパイラ２０４は、機械語２２２を生成する際に、プログラムコード１０６および／または１０８に対して１つまたは複数のタイプの最適化を行うように構成されてよい。最適化されたビルドは、最適化されずに生成された機械語に意味的に等価の機械語を生じるが、最適化された機械語の実行中に、より少ないリソースが使用される方式（例えば、少ないメモリ、より少ないプロシージャコール、等）で構成される。実施され得る最適化の例は、ループの最適化、データフローの最適化、ＳＳＡベースの最適化、コードジェネレーターの最適化、関数型言語の最適化、内部手続きの最適化、および／または当業者に知られているさらなるタイプの最適化を含む。多くの特定のタイプの最適化が存在する。例えば、呼出側関数によって呼び出された被呼出側関数が呼出側関数の本体にコピーされる「インライン展開」が行われることがある。特定の最適化の別の例では、コードの単一のインスタンスが、ソースコード内で何度も計算される量に対して使用される「共通式の削除」が行われることがある。プログラムコード１０６をリファクタリングするために、コンパイラ２０４によってクエリオプティマイザー１０４が使用されると、コンパイラ２０４によって機械語２２２を生成するために、リファクタリングされたプログラムコード１０８が生成され、使用されてよい。
【００３２】
[0044]機械語２２２は、実行可能プログラムまたはアプリケーションを形成するために、ファイル（例えば、オブジェクトすなわち「．ｏｂｊ」ファイル）に含まれてよく、また別の形式で作り出され／格納されてもよい。機械語２２２は場合によっては、ストレージ２１０に格納されてよい。
【００３３】
[0045]開発のデバッグステージのためにプログラムコード１０６および／または１０８がコンパイラ２０４によってコンパイルされると、デバッガーツール２０６は機械語２２２を受け取ることができる。デバッガーツール２０６は、機械語２２２で表されたアプリケーションに対して、デバッガー（または「デバッグ」、「デバッギング」）セッションを実行するように構成される。デバッガーセッションでは、開発者は、プログラムコード１０６および／または１０８にエンターされた（ならびにデバッグのためにコンパイラ２０４によって機械語２２２に渡された）任意のデバッグコード／文の結果にアクセスできることを含めて、機械語２２２の実行によって生成された変数、配列、属性、および／または出力の値（例えば、レジスタ、ＧＵＩ、等の内容）を見ながら、機械語２２２のコードの実行を１ステップずつ行えるようになることがある。このように、開発者は、プログラムコード１０６および／または１０８のテストまたはトラブルシューティング（「デバッグ」）ができ、デバッガーセッションの結果に基づいて、ソースコードエディター２０２を使用してプログラムコード１０６および／または１０８を編集することができる。修正バージョンのプログラムコード１０６および／または１０８は、コンパイラ２０４によってコンパイルされ、さらなるデバッグのためにデバッガーツール２０６によって受け取られてよい。デバッグ中、デバッガーツール２０６は、プログラムコード１０６内のクエリを提案し、および／または書き換えて、プログラムコード１０８を生成することができる。デバッガーツール２０６は、機械語２２２を実行する物理および／または仮想の１つまたは複数のプロセッサ（例えば、中央処理装置（ＣＰＵ：ｃｅｎｔｒａｌ  ｐｒｏｃｅｓｓｉｎｇ  ｕｎｉｔ））を含むことができる。
【００３４】
[0046]デバッガーツール２０６によるデバッグが完了し、プログラムコード１０６および／または１０８がその最終バージョンになると、コンパイラ２０４は、開発のリリースステージのためにプログラムコード１０６および／または１０８をコンパイルし、機械語２２２を生成することができる。リリースバージョンの機械語２２２は、ユーザーによって使用されるようにリリースされてよい。
【００３５】
[0047]通信インターフェース２０８は、プログラムコード１０６および／もしくは１０８をリモートエンティティに伝送すること、実施形態によるプログラムコードを改善するためのルールを受け取ること、ならびに／または専用もしくは一般の任意の適切な通信プロトコルに従って他のデータを通信することを行うように構成される。通信インターフェースおよび通信プロトコルのさらなる例が、次のセクションで説明される。
【００３６】
[0048]クエリオプティマイザー１０４は、様々な方式でその機能を実行するように構成されてよい。例えば、図３は、実施形態の１つの例による、プログラムコード内でのクエリ実行の効率性を改善するための処理を示すフローチャート３００を示す。クエリオプティマイザー１０４は、１つの実施形態におけるフローチャート３００に従って動作することができる。図１および図４を参照しながら以下のようにフローチャート３００が説明される。図４は、実施形態の１つの例による、クエリオプティマイザー１０４のブロック図を示す。図４に示すように、クエリオプティマイザー１０４は、クエリ検出器４０２、遅延エクステンダー４０４、および等価クエリセットジェネレーター４０６を含み、これらは、フローチャート３００を参照しながら以下のように説明される。
【００３７】
[0049]フローチャート３００はステップ３０２で始まる。ステップ３０２において、複数のクエリがプログラムコード内で検出される。図１に示されるように、クエリオプティマイザー１０４は、クエリ１１０を含むプログラムコード１０６を受け取る。図４のクエリ検出器４０２は、クエリを検出するためにプログラムコード１０６を初めから終わりまで解析するように構成される。クエリ検出器４０２は、プログラムコード１０６内の符号語を、知られているクエリ演算子／構成要素、等の所定のリストと比較することなどによる、任意の手法でクエリを検出することができる。例えば、ＬＩＮＱクエリを検索するとき、クエリ検出器４０２は、Ｓｅｌｅｃｔ、Ｗｈｅｒｅ、Ｓｕｍ、Ｍｉｎ、Ｍａｘ、Ａｖｅｒａｇｅ、Ａｇｇｒｅｇａｔｅ、Ｊｏｉｎ、ＧｒｏｕｐＪｏｉｎ、ＯｒｄｅｒＢｙ、ＧｒｏｕｐＢｙ、Ｕｎｉｏｎ、Ｃｏｎｔａｉｎｓ、Ｃｏｕｎｔ、ＴｏＬｉｓｔ、ＴｏＤｉｃｔｉｏｎａｒｙ、等などの、知られているＬＩＮＱ演算子についてプログラムコード１０６を初めから終わりまで解析することができる。それぞれの見つけられたクエリ演算子（例えば、テキストマッチングによって見つけられたクエリ演算子）は、プログラムコード１０６のクエリとしてクエリ検出器４０２によって示される。
【００３８】
[0050]１つの例証となる例において、クエリ検出器４０２は、クエリについて以下のプログラムコードを解析することができる。
【００３９】
【数１】
2019523942.tif 000003
【００４０】
この例では、クエリ検出器４０２は、コードの３行目にＯｒｄｅｒｂｙ（ｘ＝＞ｘ）およびＴｏＬｉｓｔ（）のＬＩＮＱクエリ、ならびにコードの４行目にＯｒｄｅｒＢｙＤｅｓｃｅｎｄｉｎｇ（ｘ＝＞ｘ）およびＴｏＬｉｓｔ（）のＬＩＮＱクエリを検出することができる。
【００４１】
[0051]ステップ３０２（およびフローチャート３００の残り）は、任意の適切なコード開発ツールまたはアプリケーション内のクエリオプティマイザー１０４によって実装されてよいということに留意されたい。例えば、図５は、実施形態の１つの例による、コードエディター内に提案される置換クエリセットを生成し、提示するための処理を示すフローチャート５００を示す。１つの実施形態において、図３のフローチャート３００は図５のフローチャート５００を実装することができる。例えば、フローチャート３００のステップ３０２はフローチャート５００のステップ５０２を実装することができ、ステップ５０４は、フローチャート３００への追加のステップであってよい。フローチャート５００は以下のように説明される。
【００４２】
[0052]ステップ５０２において、コードエディター内でプログラムコード内のクエリが検出される。１つの実施形態において、クエリ検出器４０２は、開発者がプログラムコードをエンターし、編集するコードエディター２０２（図２）などのコードエディター内で、プログラムコード１０６内のクエリを検出するように構成されてよい。クエリ検出器４０２は、定期的に、および／または他の任意の所望の時間に、もしくはその時間毎に、（例えば、「クエリ検出」ボタンをクリックすることによって）開発者によってリクエストされるのに応答して、開発者がコードを保存するときはいつでも、開発者がコードをエンターしながら、プログラムコード１０６内のクエリ用語検索を行うことができる。
【００４３】
[0053]例えば、図６は、実施形態の１つの例による、プログラムコード１０６を表示するコードエディターウィンドウ６０４を含むコンピューティングデバイス１０２のブロック図を示す。ディスプレイ６０２は、ＬＣＤ（液晶ディスプレイ（ｌｉｑｕｉｄ  ｃｒｙｓｔａｌ  ｄｉｓｐｌａｙ））、ＣＲＴ（陰極線管（ｃａｔｈｏｄｅ  ｒａｙ  ｔｕｂｅ））ディスプレイ、ＬＥＤ（発光ダイオード（ｌｉｇｈｔ  ｅｍｉｔｔｉｎｇ  ｄｉｏｄｅ））ディスプレイ、プラズマディスプレイ、等を含む、任意の適切なタイプの表示デバイスまたは画面であってよい。コードエディターウィンドウ６０４は、コードエディターウィンドウ６０４に表示されるプログラムコード１０６と対話するためのグラフィカルユーザーインターフェース（ＧＵＩ：ｇｒａｐｈｉｃａｌ  ｕｓｅｒ  ｉｎｔｅｒｆａｃｅ）として、ディスプレイ６０２内のコードエディター２０２によって表示される（フレームのある、またはフレームのない）ウィンドウである。コードライン６０６、６０８、および６１０は、当業者に知られているような任意の適切なプログラミング言語のコードのそれぞれの１つまたは複数のラインである。１つの実施形態において、クエリ検出器４０２は、ステップ５０２に従って、クエリについてコードライン６０６、６０８、および６１０を含むプログラムコード１０６を解析する。
【００４４】
[0054]ステップ５０４において、複数のクエリを機能的に等価なクエリセットで置き換えるために、コードエディターがプログラムコードを自動的にリファクタリングするオプションが提示される。１つの実施形態において、クエリオプティマイザー１０４がクエリを検出し、（本明細書の他の場所でさらに説明されるように）プログラムコード１０６内で検出されたクエリを置き換えるためにさらに効率的なクエリを決定した後、コードエディター２０２は、決定されたさらに効率的なクエリを開発者が受け入れるか、または却下するためのオプションを提示することができる。例えば、図６に示されるように、提案された置換クエリセット６１２が、開発者による受諾または却下のためにコードエディターウィンドウ６０４に表示されてよい。提案された置換クエリセット６１２は、プログラムコード１０６内で検出されたクエリセットより効率的であると、クエリオプティマイザー１０４によって決定されたクエリの提案されたセットである。（例えば、ボタンをクリックすることによって）提案された置換クエリセット６１２を開発者が受け入れると、コードエディター２０２は、プログラムコード１０６内で、クエリの検出されたセットを、提案された置換クエリセット６１２で置き換え、リファクタリングされたプログラムコード１０８を生成し、コードエディターウィンドウ６０４に表示することができる。提案された置換クエリセット６１２を開発者が却下すると、プログラムコード１０６に対する変更は行われず、提案はもはや表示されない。別の実施形態において、提案された置換クエリセット６１２は、（開発者の受諾をリクエストすることなく）プログラムコード１０６に自動的に実装されてよいということに留意されたい。
【００４５】
[0055]別の実施形態において、上述のように、クエリ検出器４０２は、コンパイル中にプログラムコード１０６内のクエリを検出するように構成されてよい。例えば、図７は、実施形態の１つの例による、コンパイル時に置換クエリセットを生成して実装するための処理を示すフローチャート７００を示す。１つの実施形態において、図３のフローチャート３００は、図７のフローチャート７００を実装することができる。例えば、フローチャート３００のステップ３０２は、フローチャート７００のステップ７０２を実装することができ、ステップ７０４は、フローチャート３００への追加のステップであってよい。フローチャート７００は以下のように説明される。
【００４６】
[0056]ステップ７０２において、コンパイル中にプログラムコード内のクエリが検出される。１つの実施形態において、クエリ検出器４０２は、プログラムコード１０６がコンパイルされるときに、コンパイラ２０４（図２）などのコンパイラで（例えば、テキストマッチング等によって）プログラムコード１０６内のクエリを検出するように構成されてよい。
【００４７】
[0057]ステップ７０４において、複数のクエリが機能的に等価なクエリセットで置き換えられたバージョンのプログラムコードに基づき、コンパイラにおいてコンパイルされたコードが生成される。１つの実施形態において、下記にさらに詳細に説明されるように、クエリオプティマイザー１０４は、クエリ検出器４０２によってプログラムコード１０６内で検出されたクエリのさらに効率的な置換クエリセットを生成すること、プログラムコード１０６のコピー内で、検出されたクエリを置換クエリセットと置き換えて、リファクタリングされたプログラムコード１０８を生成すること、およびリファクタリングされたプログラムコード１０８をコンパイルすることによって、コンパイルされたバージョンのプログラムコード１０６を生成することを行うように構成される。このように、プログラムコード１０６を変更することなく、さらに効率的に動作するクエリセットを含むコンパイルされた機械語が生成されるので、開発者は、コードエディター２０２内でプログラムコード１０６を後で編集する際に、変更されたクエリがわからない。しかし、別の実施形態において、置換クエリセットは、（開発者の受諾をリクエストすることなく）コンパイル時にプログラムコード１０６に自動的に実装されてよい。
【００４８】
[0058]図３のフローチャート３００を再び参照すると、ステップ３０４において、プログラムコード内でクエリが評価される遅延が拡大される。１つの実施形態において、遅延エクステンダー４０４は、クエリ検出器４０２によってプログラムコード１０６内で検出されたクエリを分析すること、および（プログラムコードが実行されるときに）クエリの評価の遅延を拡大させることを行うように構成される。「遅延評価」は、数式の値が必要とされるまで数式の評価を遅らせる評価技法を指す。遅延エクステンダー４０４はクエリを受け取り、その演算子の実行をできるだけ後に先送りするように構成される。したがって、遅延エクステンダー４０４は、プログラムコード１０６を分析してクエリの評価を遅らせることができるクエリを決定し、クエリを遅らせて実行する１つまたは複数の等価のクエリ文を決定する。
【００４９】
[0059]例えば、図８は、実施形態の１つの例による、プログラムコード内のクエリ実行の遅延を拡大させるための処理を示すフローチャート８００を示す。１つの実施形態において、遅延エクステンダー４０４は、フローチャート８００に従って動作する。フローチャート８００は、図９に関連して以下のように説明される。図９は、実施形態の１つの例による、遅延エクステンダー４０４のブロック図を示す。図９に示されるように、遅延エクステンダー４０４は、延期可能（ｅｘｔｅｎｄａｂｌｅ）クエリ検出器９０２およびクエリ式アセンブラ９０４を含む。
【００５０】
[0060]フローチャート８００はステップ８０２で始まる。ステップ８０２において、評価延期可能なクエリのうちの１つまたは複数が検出される。１つの実施形態において、遅延エクステンダー４０４の延期可能クエリ検出器９０２は、プログラムコード１０６内のクエリの現在の場所にクエリの出力値は必要ではないが、その代わりに後で使用されるので、プログラムコード１０６を分析してクエリの評価を遅らせることができるクエリを決定する。このような実施形態において、延期可能クエリ検出器９０２は、クエリの値が直接的にユーザーに出力される場所、または数式がクエリの値を使用してユーザーへの出力を生成する場所などの、クエリの値が必要とされる場所、またはその場所に比較的近い場所（例えば、数式、コードライン、等）を見つけるために、特定のクエリに対して、プログラムコード１０６内の当該クエリを越えて解析するように構成される。
【００５１】
[0061]１つの実施形態において、延期可能クエリ検出器９０２は、検出されたクエリ９０６の各クエリに対して、演算ツリーなどのデータ構造を構築することによって始まり、このデータ構造は、プログラムコード内でクエリ検出器４０２によって検出されたクエリ、ならびにクエリではないプログラムコードの演算を含む。延期可能クエリ検出器９０２は、同じ演算ツリーの下にある複数の関連するクエリを合わせてリスト化する。このような演算ツリーはグラフとして表されてよく、ここで各ノードは、データソースから実際のデータをフェッチしない（例えば、データに対して演算を行う）クエリのマッチングクエリ演算子を表し、演算ツリーの各リーフは、データソースから実際のデータをフェッチするクエリのクエリ演算子を表す。延期可能クエリ検出器９０２は、プログラムコード内の各変数／クエリ演算子／方法／コード文に従うこと、および演算ツリーにデータを再帰的に追加することによって演算ツリーを構築する。したがって、延期可能クエリ検出器９０２はクエリを受け取り、これらを関連するツリーに変換する。
【００５２】
[0062]例えば、１つの例において、延期可能クエリ検出器９０２は、以下のプログラムコードを分析し、ＬＩＮＱクエリの評価を遅らせる１つまたは複数のＬＩＮＱクエリを決定することができる。
【００５３】
【数２】
2019523942.tif 000004
【００５４】
このプログラムコードの例は、ＯｒｄｅｒＢｙ、ＴｏＬｉｓｔ、およびＦｉｒｓｔという検出されたＬＩＮＱクエリを含む。延期可能クエリ検出器９０２は、以下の演算ツリーを指定する。
【００５５】
【数３】
2019523942.tif 000005
【００５６】
ここで、１ｓｔＯｆＰｒｉｍｅｓは、演算ツリーの最高レベルの要素であり、Ｆｉｒｓｔは、演算ツリーの最低レベルの要素である。この例において、１ｓｔＯｒｄｅｒｅｄの値はすぐに必要とされない（後のコードラインに対する入力である）が、Ｆｉｒｓｔはリーフであり、したがって延期可能であると示されないので、延期可能クエリ検出器９０２は、延期可能（遅らせる実行）としてＯｒｄｅｒＢｙおよびＴｏＬｉｓｔを示す。
【００５７】
[0063]別の例において、延期可能クエリ検出器９０２は、以下のプログラムコードを分析し、ＬＩＮＱクエリの評価を遅らせる１つまたは複数のＬＩＮＱクエリを決定することができる。
【００５８】
【数４】
2019523942.tif 000006
【００５９】
このプログラムコードの例は、ＯｒｄｅｒＢｙ、ＴｏＬｉｓｔ、ＯｒｄｅｒＢｙＤｅｓｃｅｎｄｉｎｇ、ＴｏＬｉｓｔ、Ｆｉｒｓｔ、およびＦｉｒｓｔという検出されたＬＩＮＱクエリを含む。延期可能クエリ検出器９０２は、以下の第１および第２のブランチを有する演算ツリーを指定する。
【００６０】
【数５】
2019523942.tif 000007
【００６１】
この演算ツリーでは、共通の１ｓｔＯｆＰｒｉｍｅｓの要素は最高レベルの要素であり、ＯｒｄｅｒＢｙおよびＯｒｄｅｒＢｙＤｅｓｃｅｎｄｉｎｇのノードは、１ｓｔＯｆＰｒｉｍｅｓの要素にリンクされた共通のＲｅｔｕｒｎＬｉｓｔＯｆＰｒｉｍｅｓのノードに分岐する。この例において、延期可能クエリ検出器９０２は、１ｓｔＯｒｄｅｒｅｄおよびＬａｓｔＯｒｄｅｒｅｄの値はすぐに必要とされない（後のコードラインに対する入力である）が、第１のブランチ内のＦｉｒｓｔおよび第２のブランチ内のＦｉｒｓｔは両方リーフであり、したがって延期可能であると示されないので、延期可能（遅らせる実行）として第１のブランチ内のＯｒｄｅｒＢｙおよびＴｏＬｉｓｔ、ならびに第２のブランチ内のＯｒｄｅｒＢｙＤｅｓｃｅｎｄｉｎｇおよびＴｏＬｉｓｔを示す。
【００６２】
[0064]さらなる別の例において、延期可能クエリ検出器９０２は、以下のプログラムコードの例を分析し、ＬＩＮＱクエリの評価を遅らせる１つまたは複数のＬＩＮＱクエリを決定することができる。このプログラムコードの例は、２から１０００の範囲内の最後の素数を見つけるようにデザインされる。
【００６３】
【数６】
2019523942.tif 000008
【００６４】
この例において、第３のメソッド（「ＭａｉｎＭｅｔｈｏｄ」）は、初めの方の２つのメソッド（「ＲｅｔｕｒｎＬｉｓｔＯｆＰｒｉｍｅｓ」および「ＲｅｔｕｒｎＤｉｃｔｉｏｎａｒｙＯｆＰｏｗｅｒ」）を参照する。第１のメソッドは、Ｒａｎｇｅ、Ｗｈｅｒｅ、およびＴｏＬｉｓｔというクエリコンポーネントを含む。第２のメソッドは、クエリコンポーネントＴｏＤｉｃｔｉｏｎａｒｙを含む。第３のメソッドは、クエリコンポーネントＬａｓｔを含む。クエリ検出器４０２は、３つのメソッド内でこれらのクエリを検出する（図３のステップ３０２）。図９に示されるように、延期可能クエリ検出器９０２は、検出されたクエリ９０６を受け取り、これは、プログラムコード内でクエリ検出器４０２によって検出されたクエリを含む。１つの実施形態において、延期可能クエリ検出器９０２は、（例えば、簡潔さのために本明細書に図示していない演算ツリーを生成することによって、）検出されたクエリ９０６およびプログラムコード１０６を分析し、検出されたクエリがプログラムコード１０６内で遅延として評価されてよいかどうかを判定する。
【００６５】
[0065]具体的には、第３のメソッドは４つのコードラインを含む。第３のメソッドが実行されると、１行目は第１の値のために第１のメソッドにアクセスし、２行目は（第１の値に基づいて）第２の値のために第２のメソッドにアクセスし、３行目は第２の値に関連するクエリ（Ｌａｓｔ）を実行して第３の値を生成し、４行目は第３の値に基づいて出力を生成する。したがって、延期可能クエリ検出器９０２は、１行目および２行目がすぐに必要とされない（例えば、ユーザーまたはデータベースに出力されない）が、代わりに後のコードラインへの入力として使用される値を生成するということを判定するので、１行目および２行目内のクエリの評価は遅らせることができる。図９に示されるように、延期可能クエリ検出器９０２は延期可能クエリ９０８を出力し、これは、延期可能クエリ検出器９０２によって延期可能であると判定されたクエリを示す。
【００６６】
[0066]図８のフローチャート８００を再び参照すると、ステップ８０４において、１つまたは複数の評価延期可能なクエリを含む単一のクエリ式が形成される。１つの実施形態において、クエリ式アセンブラ９０４は延期可能クエリ９０８を受け取り、（ステップ８０２において）評価を延期可能であると判定されたクエリを含む単一のクエリ式を生成する。図９に示されるように、クエリ式アセンブラ９０４は修正されたクエリ９１０を生成し、これは、プログラムコードに対して延期可能クエリ検出器９０２によって決定された、評価延期可能なクエリを組み合わせる単一のクエリ式を含む。特定のプログラムコードに関して、クエリ式アセンブラ９０４は、評価延期可能なクエリを組み合わせるこのようなクエリ式のうちの１つまたは複数を生成することができるということに留意されたい。別々のクエリを単一のクエリ式に組み合わせるためにクエリ式アセンブラ９０４によって行われる技法は、当業者に知られており、特定の問い合わせ言語（ｑｕｅｒｙ  ｌａｎｇｕａｇｅ）に依存する。１つの例において、数式内の変数は、変数を決定するために他の場所で使用される数式と置き換えられてよい。
【００６７】
[0067]例えば、上記プログラムコードの例について、クエリ式アセンブラ９０４は、式「ｖａｒ  ｌａｓｔＩｔｅｍ」に関して以下の単一のクエリ式を生成することができ、これは、第１および第２のメソッドのＬＩＮＱクエリ、第３のメソッドの最初の３つのラインを含む。
【００６８】
【数７】
2019523942.tif 000009
【００６９】
上記に示すように、式「ｖａｒ  ｌａｓｔＩｔｅｍ」は、３つのすべてのメソッドのクエリコンポーネントＲａｎｇｅ、Ｗｈｅｒｅ、ＴｏＬｉｓｔ、ＴｏＤｉｃｔｉｏｎａｒｙ、およびＬａｓｔを含むクエリコンポーネントの集約セットであり、さらに上記に示された元のプログラムコードに機能的に等価である。このように、クエリコンポーネントＲａｎｇｅ、Ｗｈｅｒｅ、ＴｏＬｉｓｔ、ＴｏＤｉｃｔｉｏｎａｒｙ、およびＬａｓｔは、「ＭａｉｎＭｅｔｈｏｄ」が実行されると、遅延として評価され、「ｌａｓｔＩｔｅｍ」の出力が提示される直前に評価されるだけである。
【００７０】
[0068]１つの実施形態において、クエリ式アセンブラ９０４は、クエリに対して延期可能クエリ検出器９０２によって生成される演算ツリーを受け取ることによって動作し、演算ツリーのデータ構造の中で、リーフでなければクエリ実行が明確に「無効化される」ようにするクエリ演算子を指示／マークすることができるということに留意されたい。言い換えると、クエリ式アセンブラ９０４は、クエリ実行がリーフに対してのみ起こるという手法で演算ツリーにマークすることができ、それによって最新の時点にクエリの遅延を拡大させる。
【００７１】
[0069]図３のフローチャート３００を再び参照すると、ステップ３０６において、複数のクエリよりも効率的に評価する、当該複数のクエリと機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットがクエリコンポーネントに適用される。１つの実施形態において、等価クエリセットジェネレーター４０６（図４）は、検出されたクエリ（図１のクエリ１１０）を分析すること、および検出されたクエリに機能的に等価な代替クエリセット（図１の置換クエリ１１２）を生成することを行うように構成され、さらに、検出されたクエリの元の構成より効率的に実行する。例えば、等価クエリセットジェネレーター４０６は、プログラムコードによって使用されないデータを取得しないようにすること、データを冗長に取得しないようにすること、出力に対する効果のないデータに対して演算しないようにすること、等のために、置換クエリ１１２を生成することができる。これらの効率性を実践するために、等価クエリセットジェネレーター４０６は、クエリコンポーネントを取り除き、クエリコンポーネントを追加し、および／またはクエリコンポーネントを修正することができる。
【００７２】
[0070]等価クエリセットジェネレーター４０６は、その機能を様々な方式で行うことができる。例えば、図１０は、１つの実施形態の例による、プログラムコードに対する置換クエリセットを決定するためにルールセットを適用するための処理を示すフローチャート１０００を示す。等価クエリセットジェネレーター４０６は、１つの実施形態におけるフローチャート１０００に従って動作することができる。フローチャート１０００は、図１１に関して以下のように説明される。図１１は、実施形態の１つの例による、等価クエリセットジェネレーター４０６のブロック図を示す。図１１に示されるように、等価クエリセットジェネレーター４０６は、前後関係決定器１１０４およびルールセレクター１１０６を含み、ルールセット２１６を収めるストレージ２１０と通信連結される。
【００７３】
[0071]フローチャート１０００はステップ１００２で始まる。ステップ１００２において、複数のクエリコンポーネント間の共通の論理的な前後関係が決定される。図１１に示されるように、前後関係決定器１１０４は修正されたクエリ９１０を受け取り、このクエリは、クエリ検出器４０２によって検出され、遅延エクステンダー４０４によってさらなる遅延評価のために書き直されたクエリである。前後関係決定器１１０４は、共通の論理的な前後関係について、修正されたクエリ９１０を分析する。例えば、前後関係決定器１１０４は、単一のクエリ式である可能性のある、修正されたクエリ９１０をクエリコンポーネントのセットに分解することができ、クエリコンポーネントを互いに比較する。類似のまたは関連するタイプのクエリコンポーネントが検出されると（例えば、ＯｒｄｅｒＢｙ、およびＯｒｄｅｒＢｙＤｅｓｃｅｎｄｉｎｇ、等）、クエリコンポーネント間の共通の論理的な前後関係が成立する。図１１に示されるように、前後関係決定器１１０４は、前後関係からみて関連のあるクエリ１１１４を出力し、これは、前後関係からみて関連のある修正されたクエリ９１０のクエリコンポーネントのグループを含む。
【００７４】
[0072]ステップ１００４において、共通の論理的な前後関係に対応するルールセットのルールが、複数のクエリコンポーネントに適用される。図１１に示されるように、ルールセレクター１１０６は、前後関係からみて関連のあるクエリ１１１４を受け取る。ルールセレクター１１０６は、第１のルール１１０８、第２のルール１１１０、等などの、ルールセット２１６のルールの適用性について、前後関係からみて関連のあるクエリ１１１４を分析する。ルールセット２１６の各ルールは、対応する共通の前後関係があるクエリコンポーネントに適用されること、ならびに前後関係からみて関連のあるクエリのクエリコンポーネントを追加、修正、および／または削除することなどによって、より高い効率性のクエリコンポーネントに書き換えることを行うように構成される。ルールの任意の数および多様性がルールセット２１６に含まれてよい。ルールセット２１６に含まれ得るルールの７つの例が、例証のために以下のように説明される。各ルールは、ルールの機能／仕組みについての例示的なルール名、概要、および説明によって下記に説明される。
【００７５】
[0073]（Ａ）ルール名：ＯｒｄｅｒＢｙミニマイザ
概要：不必要なＯｒｄｅｒＢｙ演算を無くすために使用される
ルールの仕組み：ＯｒｄｅｒＢｙミニマイザは、プログラムコード内で見つけられたＯｒｄｅｒＢｙ演算子のリストを１ステップずつ実行し、プログラムコード内で結果が使用されることのないＯｒｄｅｒＢｙ演算子のいずれかを見つける（ここで「使用される」は、ＯｒｄｅｒＢｙ演算子によって行われる順序付けが、後の数式またはメソッドによって依存されない、つまり後の数式またはメソッドによって出力されないか、または要求されないということを意味する）。このような見つけられたＯｒｄｅｒＢｙ演算子に対して、ＯｒｄｅｒＢｙミニマイザは、冗長であるとしてプログラムコードからＯｒｄｅｒＢｙ演算子を削除し、コードライン文の削除（例えば、変数名を置き換えること、等）によって影響を受けるプログラムコードの他の任意のラインを書き換える。
【００７６】
[0074]（Ｂ）ルール名：ＴｏＣｕｒｒｅｎｔコレクション
概要：「ＴｏＬｉｓｔ」、「ＴｏＤｉｃｔｉｏｎａｒｙ」、等の「ＴｏＣｕｒｒｅｎｔ」タイプの演算子を何度も連続して実行する複雑なクエリの場合に使用される。これらのＴｏＣｕｒｒｅｎｔ演算子のそれぞれはコストがかかり、これらのシーケンス内では、これらはシーケンス内のｌａｓｔ演算子を除いて冗長である。
【００７７】
ルールの仕組み：クエリコンポーネントの集約セット（例えば、フローチャート８００のステップ８０４で生成された複数のクエリコンポーネントを収める単一のクエリ式）内のこのような演算子のうちの２つ以上のパターンが検出される。ＴｏＣｕｒｒｅｎｔタイプの演算子のすべては、（ロジックを変更することなく）１つを除いてクエリコンポーネントの集約セットから廃棄される。
【００７８】
[0075]（Ｃ）ルール名：ＤａｔａＲｅｔｒｉｖａｌミニマイザ−タイプ１
概要：クエリ演算子によってリクエストされた大量のデータが最終的に使用されないときに使用されるので、データ取得が問題なく減らされるか、または全く行われないこともある。
【００７９】
ルールの仕組み：クエリ演算子がデータを取得する、取得されたデータがソートされる、およびソートされたデータのうちの最初または最後の要素だけが使用されるというパターンが検出される。このクエリを、データからの最低値の要素または最大値の要素の取得をそれぞれ行うだけのクエリで置き換える。
【００８０】
[0076]（Ｄ）ルール名：ＤａｔａＲｅｔｒｉｖａｌミニマイザ−タイプ２
概要：クエリ演算子によってリクエストされた大量のデータが最終的に使用されないときに使用されるので、データ取得が問題なく減らされるか、または全く行われないこともある。
【００８１】
ルールの仕組み：クエリ演算子がデータを取得する、およびデータの最初または最後の要素だけが使用されるというパターンが検出される。このクエリを、データから任意のランダムのデータ要素を取得するだけのクエリで置き換える。
【００８２】
[0077]（Ｅ）ルール名：ＤａｔａＲｅｔｒｉｖａｌミニマイザ−タイプ３
概要：単一の非常に大きいデータエンティティが取得されるが、データの一部だけが最終的に使用されるときに使用される。
【００８３】
ルールの仕組み：大きいデータセット（例えば、ＸＭＬデータ、ＪＳＯＮデータ、ファイル全体、等）である可能性のあるデータがリクエストされるが、取得されたデータのサブセットだけが使用されることになるというパターンが検出される。このクエリを、データのサブセットを取得するだけのクエリで置き換える。
【００８４】
[0078]「ＤａｔａＲｅｔｒｉｖａｌミニマイザ−タイプ３」のルールの適用性の例は以下を含む。
[0079]（１）ファイルの取得をリクエストするが、（ファイルの内容を使用するのではなく）ファイルのメタデータだけを最終的に使用してファイルがどれだけ大きいかを判定する。このルールは、クエリ演算子を使用してファイル全体を取得しないようにし、代わりにクエリ演算子を使用してファイルのメタデータを取得するために使用されてよい（メタデータは、ファイル全体よりサイズが小さい、いくつかのファクタであることがある）。
【００８５】
[0080]（２）単一のデータベースのラインまたはエンティティをリクエストし、このライン／エンティティの単一の列だけを最終的に使用する。ＤＢのライン／エンティティの全体は非常に大きいことがある。このルールは、クエリ演算子を、所望の列だけを取得する別のクエリ演算子と置き換えるために使用されてよい。
【００８６】
[0081]（Ｆ）ルール名：列挙反復ミニマイザ
概要：クエリが単一の値を利用しているときに使用されるので、メモリ内でデータ全体の構造を構築する必要はない。
【００８７】
ルールの仕組み：「ＴｏＣｕｒｒｅｎｔ」タイプの演算子の後の単一の値だけが使用されるというパターンが検出される。最初のものを後のものにスイッチする。
[0082]（Ｇ）ルール名：Ｌａｓｔ（）演算子を使用する際の列挙の逆転
概要：最後の項目だけが必要とされる場合に使用されるので、開始から終了までを列挙することは非効率的である。逆の順序で列挙することによって、性能を向上させる。
【００８８】
ルールの仕組み：「ＴｏＣｕｒｒｅｎｔ」タイプの演算子の後の最後の値だけが使用されるというパターンが検出される。列挙を、その「逆の（ｒｅｖｅｒｓｅ）」マッチング演算子と置き換える、および／または列挙範囲の値を逆転させる、ならびに演算子「Ｌａｓｔ」を演算子「Ｆｉｒｓｔ」と置き換える。
【００８９】
[0083]さらなる例証として、上記で生成された単一のクエリ式、説明を簡単にするために下記に繰り返す、に対してルールの例を適用する。
【００９０】
【数８】
2019523942.tif 000010
【００９１】
上述のように、この機能的に等価なクエリコンポーネントの集約セットを生成するために、遅延評価が拡大された（フローチャート３００のステップ３０４、遅延エクステンダー４０４）。さらに、この単一のクエリ式の効率性は、ルールセット２１６のルールを適用することによってさらに改善されることがある（フローチャート３００のステップ３０６、等価クエリセットジェネレーター４０６）。
【００９２】
[0084]例えば、ＴｏＣｕｒｒｅｎｔコレクションミニマイザのルール（上記のルール（Ｂ））が適用されてよい。このような場合、前後関係決定器１１０４は、共通の論理的な前後関係を成立させる上記のクエリ文内でＴｏＬｉｓｔおよびＴｏＤｉｃｔｉｏｎａｒｙ演算子を検出する。ルールセレクター１１０６は、ＴｏＣｕｒｒｅｎｔコレクションミニマイザのルールを適用し、このルールは、ルールセット２１６内でこの共通の論理的な前後関係と関連付けられる。ＴｏＣｕｒｒｅｎｔコレクションミニマイザのルールは、最後の１つを除いてクエリ文からすべてのＴｏＣｕｒｒｅｎｔ演算子を除去し、以下のさらに効率的で、機能的に等価なクエリ式を生成する。
【００９３】
【数９】
2019523942.tif 000011
【００９４】
[0085]さらに、ＴｏＣｕｒｒｅｎｔ文（この場合、ＴｏＤｉｃｔｉｏｎａｒｙ）の前に配置されるように、Ｌａｓｔ（）／Ｆｉｒｓｔ（）演算子を移す列挙反復ミニマイザのルール（上記のルール（Ｆ））が使用されてよい。このように、クエリ文は、第１の項目が見つけられるまで反復するので、データ構造すべてが埋められるわけではない。代わりに、ＴｏＤｉｃｔｉｏｎａｒｙ演算子は、単一のエンティティに対して演算する。したがって、前後関係決定器１１０４は、共通の論理的な前後関係を成立させるために、上記のクエリ文内のＬａｓｔ演算子が続くＴｏＤｉｃｔｉｏｎａｒｙ演算子を決定する。ルールセレクター１１０６は列挙可能な反復ルールを適用し、これは、この共通の論理的な前後関係と関連付けられる。列挙可能な反復ルールは、ＴｏＤｉｃｔｉｏｎａｒｙ演算子の前にＬａｓｔ演算子を移して、以下のさらに効率的で、機能的に等価なクエリ式を生成する。
【００９５】
【数１０】
2019523942.tif 000012
【００９６】
[0086]さらに、最後の項目を検索する順序を逆転させる、Ｌａｓｔ（）演算子を使用する際の列挙の逆転（上記のルール（Ｇ））が、使用されてよい。これは、これが、最後の項目を探す時に逆の順序で行うのにさらに一層効率的だからである。したがって、このルールは逆の順序で数字を列挙し、最後の要素ではなく最初の要素を採用する。したがって、前後関係決定器１１０４は、共通の論理的な前後関係を成立させるために、上記のクエリ文内のＴｏＤｉｃｔｉｏｎａｒｙ演算子の直前のＬａｓｔ演算子を決定する。ルールセレクター１１０６は、この共通の論理的な前後関係に関連のある列挙可能なルールの最適化を適用する。列挙可能なルールの最適化は、Ｌａｓｔ演算子を第１の演算子で置き換えて、以下のさらに効率的で、機能的に等価なクエリ式を生成する。
【００９７】
【数１１】
2019523942.tif 000013
【００９８】
この最終的なクエリは、１１００から始まる整数に対して減少方向に反復し、その中で最初の素数を見つけ、さらに上記に示された元の３つのメソッドのバージョンよりも、（例えば、より少ないメモリを使用してデータを格納し、ＣＰＵをより良く使用して）これを一層効率的に行う。
【００９９】
[0087]１つの実施形態において、等価クエリセットジェネレーター４０６は、単一の機能的に等価なクエリセットを決定するために、これ以上のルールが適用されることがなくなるまで、ルールセット２１６のルールを順次適用することができるということに留意されたい。別の実施形態において、機能的に等価なクエリセットの複数の様々なセットが、等価クエリセットジェネレーター４０６によって決定されてよく、それぞれの決定されたセットは、プログラムコード１０６内の検出されたクエリを置き換えるために適用可能である。このような実施形態において、ルールセレクター１１０６は、機能的に等価なクエリセットのうちの１つを開発者が手動で選択してプログラムコード１０６に適用し、リファクタリングされたプログラムコード１０８を生成することを可能にすることができる。一方、ルールセレクター１１０６は、選択を自動的に行うこともできる。
【０１００】
[0088]例えば、図１２は、１つの実施形態の例による、複数の候補となる機能的に等価なクエリセットを生成して、この中から選択するための処理を示すフローチャート１２００を示す。１つの実施形態において、ルールセレクター１１０６は、フローチャート１２００を実行することができる。フローチャート１２００は以下のように説明される。
【０１０１】
[0089]ステップ１２０２において、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することが、複数の候補となる機能的に等価なクエリセットを生成するために評価される。１つの実施形態において、ルールセレクター１１０６は、様々な機能的に等価なクエリセットを生成するために、ルールの様々な組合せおよび／または順序をプログラムコードに適用することができる。例えば、特定のプログラムコードは、クエリコンポーネントＯｒｄｅｒＢｙ、ＧｒｏｕｐＢｙ、およびＴｈｅｎＢｙをクエリ式に含むことができる。ルールセレクター１１０６は、ＯｒｄｅｒＢｙおよびＧｒｏｕｐＢｙを第１のクエリ演算子で置き換える第１のルールをクエリ式に適用して、第１の機能的に等価なクエリセットを生成することができ、その後、代替として、ＧｒｏｕｐＢｙおよびＴｈｅｎＢｙを第２のクエリ演算子で置き換える第２のルールをクエリ式にさらに適用して、第２の機能的に等価なクエリセットを生成することができる。このように、２つの機能的に等価なクエリセットが同じクエリ式に対して生成され、これらは、これら自体の効率特性をそれぞれ有することができる。クエリ式内の特定のクエリ演算子、およびルールセット２１６に利用可能なルールに応じて、任意の数の機能的に等価なクエリセットが同じクエリ式に対して生成されてよい。
【０１０２】
[0090]ステップ１２０４において、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する１つの候補となる機能的に等価なクエリセットが選択されて、生成された機能的に等価なクエリセットとなる。上記の例において、ルールセレクター１１０６は、第１および第２の機能的に等価なクエリセットのどちらをプログラムコードにリファクタリングすべきかを、開発者が選択することを可能にすることができ、また第１および第２のクエリコンポーネントのどちらをプログラムコードにリファクタリングすべきかを、自動選択することもできる。例えば、ルールセレクター１１０６は、最大効率を有する利用可能な機能的に等価なクエリセットのうちの１つを選択することができる。この最大効率は、様々な方式で決定されてよい。
【０１０３】
[0091]例えば、ルールセット２１６内の各ルールは、ルールの相対的な効率性を示す、対応する効率性の値（例えば０から１の数字）を有することができる。ルールセレクター１１０６は、この機能的に等価なクエリセットの全体的な効率性の値を決定するために、特定の機能的に等価なクエリセットに対して使用されるルールのそれぞれに対する効率性の値を組み合わせることができ、その後、すべての機能的に等価なクエリセットに対する全体的な効率性の値を比較して、どちらが最大効率を有するかを判定することができる。他の実施形態において、ルールセレクター１１０６は、他の方式で最大効率を決定することができる。
【０１０４】
[0092]１つの実施形態において、フローチャート１２００は、コンパイル時または実行時に実行されてよいということに留意されたい。例えば、実行時に、実行可能なバージョンのプログラムコード１０６またはリファクタリングされたプログラムコード１０８（例えば、機械語２２２）は、（例えば、オペレーティングシステム内、等で）実行エンジンによって実行されてよい。実行時の実施形態によれば、最善の候補となる機能的に等価なクエリセットが、実際のシステムの健全性の状態を考慮に入れる方式で決定されてよい。これは、候補となる機能的に等価なクエリセットのうちの１つまたは複数によってもたらされる効率性の向上が、実行時の実行条件に少なくとも部分的に依存するからである。例えば、実行時に、実行可能なバージョンのプログラムコードは実行することができ、特定のクエリが実行されることになると、実行時の条件（例えば、ネットワーク条件、利用可能な処理帯域幅、利用可能な処理能力、等）に基づいて、どちらの候補となる機能的に等価なクエリセットを実行すべきかを選択するために、プログラムコードによって、（例えば実行エンジンによって実行されることがある）ルールセレクター１１０６に対するコールが行われてよい。
【０１０５】
[0093]例えば、通常の実行時の条件（例えば、十分なネットワーク可用性、等）において、候補となる機能的に等価なクエリセットＡは、機能的に等価なクエリセットＢより効率的である可能性がある。しかし、特定の実行中に、低速インターネット接続、等などの望まれない何かが、機能的に等価なクエリセットＡのクエリコンポーネントの性能を妨げることがある。したがって、このような実行時の条件（例えば、不十分なネットワークレスポンス）では、（クエリセットＡではなく）機能的に等価なクエリセットＢがさらなる効率性をもたらすことがあるので、ルールセレクター１１０６によって、この特定の実行中に実行されるように選択されてよい。したがって、実施形態において、ルールセレクター１１０６は実行時に、候補となる機能的に等価なクエリセットの選択を可能にするように構成されてよい。
【０１０６】
[0094]ルールは、手動または自動を含む任意の手法でルールセット２１６に追加されてよいということに留意されたい。例えば、開発者は、開発者がわかるような、または知っているようなクエリで特定の効率性の問題を解決したいという要望を含む、開発者の経験に基づいて、ルールをルールセット２１６に追加することができる。別の実施形態において、自動メカニズムは、機械学習を組み込む自動メカニズムを含む、新しいルールを生成することができる。機械学習は、相対的な効率性のために実行中に等価なクエリをサンプリングするため、およびこれに基づいて、このシナリオに対する最も効率的なクエリを自動選択するために使用されてよい。ルールによって提供されるそれぞれのクエリ最適化に関して、クエリオプティマイザー１０４は、クエリ最適化によって受ける影響の詳細な分析を維持することができる。
【０１０７】
ＩＩＩ．携帯型および据置型デバイスの実施形態の例
[0095]コンピューティングデバイス１０２、クエリオプティマイザー１０４、コンパイラ２０４、開発アプリケーション２００、ソースコードエディター２０２、コンパイラ２０４、デバッガーツール２０６、クエリ検出器４０２、遅延エクステンダー４０４、等価クエリセットジェネレーター４０６、延期可能クエリ検出器９０２、クエリ式アセンブラ９０４、内容決定器１１０４、ルールセレクター１１０６、フローチャート３００、フローチャート５００、フローチャート７００、フローチャート８００、フローチャート１０００、およびフローチャート１２００は、ハードウェア、またはソフトウェアおよび／もしくはファームウェアと組み合わされたハードウェアに実装されてよい。例えば、クエリオプティマイザー１０４、コンパイラ２０４、開発アプリケーション２００、ソースコードエディター２０２、コンパイラ２０４、デバッガーツール２０６、クエリ検出器４０２、遅延エクステンダー４０４、等価クエリセットジェネレーター４０６、延期可能クエリ検出器９０２、クエリ式アセンブラ９０４、内容決定器１１０４、ルールセレクター１１０６、フローチャート３００、フローチャート５００、フローチャート７００、フローチャート８００、フローチャート１０００、および／またはフローチャート１２００は、１つまたは複数のプロセッサ内で実行され、コンピューター可読ストレージ媒体に格納されるように構成されたコンピュータープログラムコード／命令として実装されてよい。一方、コンピューティングデバイス１０２、クエリオプティマイザー１０４、コンパイラ２０４、開発アプリケーション２００、ソースコードエディター２０２、コンパイラ２０４、デバッガーツール２０６、クエリ検出器４０２、遅延エクステンダー４０４、等価クエリセットジェネレーター４０６、延期可能クエリ検出器９０２、クエリ式アセンブラ９０４、内容決定器１１０４、ルールセレクター１１０６、フローチャート３００、フローチャート５００、フローチャート７００、フローチャート８００、フローチャート１０００、および／またはフローチャート１２００は、ハードウェアロジック／電気回路機器として実装されてよい。
【０１０８】
[0096]例えば、１つの実施形態において、クエリオプティマイザー１０４、コンパイラ２０４、開発アプリケーション２００、ソースコードエディター２０２、コンパイラ２０４、デバッガーツール２０６、クエリ検出器４０２、遅延エクステンダー４０４、等価クエリセットジェネレーター４０６、延期可能クエリ検出器９０２、クエリ式アセンブラ９０４、内容決定器１１０４、ルールセレクター１１０６、フローチャート３００、フローチャート５００、フローチャート７００、フローチャート８００、フローチャート１０００、および／またはフローチャート１２００のうちの１つまたは複数は、任意の組合せで、ＳｏＣに合わせて実装されてよい。ＳｏＣは、プロセッサ（例えば、中央処理装置（ＣＰＵ）、マイクロコントローラ、マイクロプロセッサ、デジタルシグナルプロセッサ（ＤＳＰ：ｄｉｇｉｔａｌ  ｓｉｇｎａｌ  ｐｒｏｃｅｓｓｏｒ）、等）、メモリ、１つもしくは複数の通信インターフェース、および／またはさらなる回路のうちの１つまたは複数を含む集積回路チップを含んでよく、場合によっては、受け取られたプログラムコードを実行するか、および／または機能を実行するための埋込型ファームウェアを含んでもよい。
【０１０９】
[0097]図１３は、実施形態が実行され得るコンピューティングデバイス１３００の例示的な実装形態を描写する。例えば、コンピューティングデバイス１０２および／またはクライアントコンピューティングデバイス１０４は、コンピューティングデバイス１３００の１つまたは複数の特徴および／または代替の特徴を含む、据置型または携帯型コンピューターの実施形態における、コンピューティングデバイス１３００に類似の１つまたは複数のコンピューティングデバイスに実装されてよい。本明細書で提供されるコンピューティングデバイス１３００の説明が例証のために提供されるが、限定することを意図するものではない。実施形態は、当業者に知られているような、さらなるタイプのコンピューターシステムに実装されてよい。
【０１１０】
[0098]図１３に示されるように、コンピューティングデバイス１３００は、プロセッサ回路１３０２と呼ばれる１つまたは複数のプロセッサ、システムメモリ１３０４、およびシステムメモリ１３０４を含む様々なシステム構成要素をプロセッサ回路１３０２に連結するバス１３０６を含む。プロセッサ回路１３０２は、中央処理装置（ＣＰＵ）、マイクロコントローラ、マイクロプロセッサ、および／または他の物理ハードウェアプロセッサ回路として、１つまたは複数の物理ハードウェア電気回路デバイス要素および／または集積回路デバイス（半導体材料のチップもしくはダイ）に実装される電気的および／または光学的回路である。プロセッサ回路１３０２は、オペレーティングシステム１３３０、アプリケーションプログラム１３３２、他のプログラム１３３４、等のプログラムコードなどの、コンピューター可読媒体に格納されたプログラムコードを実行することができる。バス１３０６は、メモリバスまたはメモリコントローラ、周辺機器バス、アクセラレイティッドグラフィックスポート、および様々なバスアーキテクチャのいずれかを使用するプロセッサまたはローカルバスを含む、いくつかのタイプのバス構造のいずれかのうちの１つまたは複数を表す。システムメモリ１３０４は、リードオンリメモリ（ＲＯＭ：ｒｅａｄ  ｏｎｌｙ  ｍｅｍｏｒｙ）１３０８およびランダムアクセスメモリ（ＲＡＭ：ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）１３１０を含む。基本入出力システム１３１２（ＢＩＯＳ：ｂａｓｉｃ  ｉｎｐｕｔ／ｏｕｔｐｕｔ  ｓｙｓｔｅｍ）は、ＲＯＭ１３０８に格納される。
【０１１１】
[0099]コンピューティングデバイス１３００も、ハードディスクに読み書きするためのハードディスクドライブ１３１４、リムーバブル磁気ディスク１３１８に読み書きするための磁気ディスクドライブ１３１６、およびＣＤ  ＲＯＭ、ＤＶＤ  ＲＯＭ、または他の光媒体などのリムーバブル光ディスク１３２２に読み書きするための光ディスクドライブ１３２０といったドライブのうちの１つまたは複数を有する。ハードディスクドライブ１３１４、磁気ディスクドライブ１３１６、および光ディスクドライブ１３２０は、ハードディスクドライブインターフェース１３２４、磁気ディスクドライブインターフェース１３２６、および光学ドライブインターフェース１３２８のそれぞれによってバス１３０６に接続される。ドライブおよびこれらに関連のあるコンピューター可読媒体は、コンピューター可読命令、データ構造、プログラムモジュール、およびコンピューターの他のデータを非一時的に格納する。ハードディスク、リムーバブル磁気ディスク、およびリムーバブル光ディスクが説明されるが、フラッシュメモリカード、デジタルビデオディスク、ＲＡＭ、ＲＯＭ、および他のハードウェアストレージ媒体などの他のタイプのハードウェアベースのコンピューター可読ストレージ媒体がデータを格納するために使用されてよい。
【０１１２】
[0100]いくつかのプログラムモジュールは、ハードディスク、磁気ディスク、光ディスク、ＲＯＭ、またはＲＡＭに格納されてよい。これらのプログラムは、オペレーティングシステム１３３０、１つまたは複数のアプリケーションプログラム１３３２、他のプログラム１３３４、およびプログラムデータ１３３６を含む。アプリケーションプログラム１３３２または他のプログラム１３３４は、クエリオプティマイザー１０４、コンパイラ２０４、開発アプリケーション２００、ソースコードエディター２０２、コンパイラ２０４、デバッガーツール２０６、クエリ検出器４０２、遅延エクステンダー４０４、等価クエリセットジェネレーター４０６、延期可能クエリ検出器９０２、クエリ式アセンブラ９０４、内容決定器１１０４、ルールセレクター１１０６、（フローチャート３００、フローチャート５００、フローチャート７００、フローチャート８００、フローチャート１０００、フローチャート１２００の任意の適切なステップを含む）フローチャート３００、フローチャート５００、フローチャート７００、フローチャート８００、フローチャート１０００、および／もしくはフローチャート１２００、ならびに／または本明細書で説明されるさらなる実施形態を実装するための、例えば、コンピュータープログラムロジック（例えば、コンピュータープログラムコードまたは命令）を含むことができる。
【０１１３】
[0101]ユーザーは、キーボード１３３８およびポインティングデバイス１３４０などの入力デバイスを通じてコマンドおよび情報をコンピューティングデバイス１３００にエンターすることができる。他の入力デバイス（図示せず）は、マイクロフォン、ジョイスティック、ゲームパッド、パラボラアンテナ、スキャナ、タッチスクリーンおよび／もしくはタッチパッド、音声入力を受け取るための音声認識システム、ジェスチャ入力を受け取るためのジェスチャ認識システム、または同様のものを含むことができる。これらおよび他の入力デバイスは、バス１３０６に連結されるシリアルポートインターフェース１３４２を通じてプロセッサ回路１３０２に接続されることが多いが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス（ＵＳＢ：ｕｎｉｖｅｒｓａｌ  ｓｅｒｉａｌ  ｂｕｓ）などの他のインターフェースによって接続されてもよい。
【０１１４】
[0102]表示画面１３４４も、ビデオアダプタ１３４６などのインターフェースを介してバス１３０６に接続される。表示画面１３４４は、コンピューティングデバイス１３００の外部にあるか、または組み込まれてよい。表示画面１３４４は情報を表示することができ、ならびに（例えば、タッチ、指を使ったジェスチャ、仮想キーボード、等によって）ユーザーコマンドおよび／または他の情報を受け取るためのユーザーインターフェースであってよい。表示画面１３４４に加えて、コンピューティングデバイス１３００は、スピーカおよびプリンタなどの他の周辺機器出力デバイス（図示せず）を含むことができる。
【０１１５】
[0103]コンピューティングデバイス１３００は、アダプタもしくはネットワークインターフェース１３５０、モデム１３５２、またはネットワーク上で通信を確立するための他の手段を通じて、ネットワーク１３４８（例えば、インターネット）に接続される。モデム１３５２は、内部または外部にあってよいが、図１３に示されるようにシリアルポートインターフェース１３４２を介してバス１３０６に接続されてよく、またパラレルインターフェースを含む別のインターフェースのタイプを使用してバス１３０６に接続されてもよい。
【０１１６】
[0104]本明細書で使用されるように、ハードディスクドライブ１３１４に関連のあるハードディスク、リムーバブル磁気ディスク１３１８、リムーバブル光ディスク１３２２、ＲＡＭ、ＲＯＭ、フラッシュメモリカード、デジタルビデオディスク、ジップディスク、ＭＥＭ、ナノテクノロジーベースのストレージデバイス、および物理的な／有形のハードウェアストレージ媒体のさらなるタイプ（図１３のメモリ１３２０を含む）などの他の物理ハードウェア媒体などの、物理ハードウェア媒体を指すために、用語「コンピュータープログラム媒体」、「コンピューター可読媒体」、および「コンピューター可読ストレージ媒体」が使用される。このようなコンピューター可読ストレージ媒体は、通信媒体とは区別され、重複しない（通信媒体を含まない）。通信媒体は、搬送波などの変調データ信号内で、コンピューター可読命令、データ構造、プログラムモジュール、または他のデータを具体化する。用語「変調データ信号」は、その特性セットのうちの１つもしくは複数を有する、または信号内の情報をエンコードするような方式で変更された、信号を意味する。例として、また限定ではなく、通信媒体は、アコースティック、ＲＦ、赤外線、および他のワイヤレス媒体などのワイヤレス媒体、ならびに有線媒体を含む。実施形態は、コンピューター可読ストレージ媒体を対象とする実施形態とは別々で、重複していないこのような通信媒体も対象とする。
【０１１７】
[0105]上述のように、（アプリケーションプログラム１３３２および他のプログラム１３３４を含む）コンピュータープログラムおよびモジュールは、ハードディスク、磁気ディスク、光ディスク、ＲＯＭ、ＲＡＭ、または他のハードウェアストレージ媒体に格納されてよい。このようなコンピュータープログラムは、ネットワークインターフェース１３５０、シリアルポートインターフェース１３４２、または他の任意のインターフェースのタイプを介して受け取られてもよい。このようなコンピュータープログラムは、アプリケーションによって実行されるか、またはロードされると、本明細書で論じられる実施形態の特徴をコンピューティングデバイス１３００が実行することを可能にする。したがって、このようなコンピュータープログラムは、コンピューティングデバイス１３００のコントローラに相当する。
【０１１８】
[0106]実施形態は、任意のコンピューター可読媒体に格納されたコンピューターコードまたは命令を含む、コンピュータープログラム製品も対象とする。このようなコンピュータープログラム製品は、ハードディスクドライブ、光ディスクドライブ、メモリデバイスパッケージ、ポータブルメモリスティック、メモリカード、および他のタイプの物理ストレージハードウェアを含む。
【０１１９】
ＩＶ．実施形態の例
[0107]１つの実施形態において、方法は、プログラムコード内の複数のクエリを検出することと、クエリがプログラムコード内でそこまでに評価される遅延を拡大させることと、検出されたクエリより効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットを検出されたクエリに適用することとを含む。
【０１２０】
[0108]１つの実施形態において、検出することが、コードエディター内でプログラムコード内のクエリを検出することを含み、方法が、複数のクエリを機能的に等価なクエリセットで置き換えるために、コードエディターがプログラムコードを自動的にリファクタリングするオプションを提示することをさらに含む。
【０１２１】
[0109]１つの実施形態において、検出することが、コンパイル中にプログラムコード内のクエリを検出することを含み、方法が、プログラムコードのバージョンに基づくコンパイラでコンパイルされたコードを生成することであって、機能的に等価なクエリセットで複数のクエリが置き換えられる、生成することをさらに含む。
【０１２２】
[0110]１つの実施形態において、クエリがプログラムコード内でそこまでに評価される遅延を拡大させることが、評価延期可能なクエリのうちの１つまたは複数を検出することと、１つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成することとを含む。
【０１２３】
[0111]１つの実施形態において、ルールセットを適用することが、複数のクエリコンポーネント間の共通の論理的な前後関係を決定することと、共通の論理的な前後関係に対応するルールセットのルールを複数のクエリコンポーネントに適用することとを含む。
【０１２４】
[0112]１つの実施形態において、生成された機能的に等価なクエリセットが、複数のクエリのクエリ結果より少ないメモリ空間しか消費せずに、複数のクエリより実行の時間がかからずに、複数のクエリより少ないネットワーク帯域幅しか消費せずに、または複数のクエリより少ない処理能力しか消費せずに、クエリ結果を生成することのうちの少なくとも１つによって、複数のクエリより効率的に評価する。
【０１２５】
[0113]１つの実施形態において、ルールセットを適用することが、複数の候補となる機能的に等価なクエリセットを生成するために、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することを評価することと、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する１つの候補となる機能的に等価なクエリセットを選択して、生成された機能的に等価なクエリセットとすることとを含む。
【０１２６】
[0114]１つの実施形態において、ルールセットを適用することが、複数の候補となる機能的に等価なクエリセットを生成するために、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することを実行中に評価することと、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する１つの候補となる機能的に等価なクエリセットを実行中に選択して、生成された機能的に等価なクエリセットとすることとを含む。
【０１２７】
[0115]１つの実施形態において、候補となる機能的に等価なクエリセットのうちの１つまたは複数によってもたらされる効率性の向上が、実行時の実行条件に少なくとも部分的に依存する。
【０１２８】
[0116]１つの実施形態において、方法が、機械学習を使用して少なくとも１つのルールを生成し、ルールセットに追加することをさらに含む。
[0117]別の実施形態において、コンピューティングデバイスは、少なくとも１つのプロセッサ回路と、少なくとも１つのプロセッサ回路によって実行されるように構成されたプログラムコードを格納する少なくとも１つのメモリであって、演算を行うように構成されたプログラムコードが、プログラムコード内の複数のクエリを検出すること、クエリがプログラムコード内でそこまでに評価される遅延を拡大させること、および検出されたクエリより効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットを検出されたクエリに適用することを含む、少なくとも１つのメモリとを備える。
【０１２９】
[0118]１つの実施形態において、検出することが、コードエディター内でプログラムコード内のクエリを検出することを含み、方法が、複数のクエリを機能的に等価なクエリセットで置き換えるために、コードエディターがプログラムコードを自動的にリファクタリングするオプションを提示することをさらに含む。
【０１３０】
[0119]１つの実施形態において、検出することが、コンパイル中にプログラムコード内のクエリを検出することを含み、方法が、プログラムコードのバージョンに基づくコンパイラでコンパイルされたコードを生成することであって、機能的に等価なクエリセットで複数のクエリが置き換えられる、生成することをさらに含む。
【０１３１】
[0120]１つの実施形態において、クエリがプログラムコード内でそこまでに評価される遅延を拡大させることが、評価延期可能なクエリのうちの１つまたは複数を検出することと、１つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成することとを含む。
【０１３２】
[0121]１つの実施形態において、ルールセットを適用することが、複数のクエリコンポーネント間の共通の論理的な前後関係を決定することと、共通の論理的な前後関係に対応するルールセットのルールを複数のクエリコンポーネントに適用することとを含む。
【０１３３】
[0122]１つの実施形態において、ルールセットを適用することが、複数の候補となる機能的に等価なクエリセットを生成するために、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することを評価することと、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する１つの候補となる機能的に等価なクエリセットを選択して、生成された機能的に等価なクエリセットとすることとを含む。
【０１３４】
[0123]１つの実施形態において、ルールセットを適用することが、複数の候補となる機能的に等価なクエリセットを生成するために、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することを実行中に評価することと、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する１つの候補となる機能的に等価なクエリセットを実行中に選択して、生成された機能的に等価なクエリセットとすることとを含む。
【０１３５】
[0124]１つの実施形態において、候補となる機能的に等価なクエリセットのうちの１つまたは複数によってもたらされる効率性の向上が、実行時の実行条件に少なくとも部分的に依存する。
【０１３６】
[0125]１つの実施形態において、演算が、機械学習を使用して少なくとも１つのルールを生成し、ルールセットに追加することをさらに含む。
[0126]別の実施形態において、コンピューティングデバイスは、少なくとも１つのプロセッサ回路と、少なくとも１つのプロセッサ回路によって実行されるように構成されたプログラムコードを格納する少なくとも１つのメモリであって、プログラムコードが、プログラムコード内の複数のクエリを検出するように構成されるクエリ検出器、クエリがプログラムコード内でそこまでに評価される遅延を拡大させるように構成される遅延エクステンダー、および検出されたクエリより効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットを検出されたクエリに適用するように構成される等価クエリセットジェネレーターを含む、少なくとも１つのメモリと、を備える。
【０１３７】
Ｖ．結論
[0127]様々な本発明の実施形態が上述されたが、これらはほんの一例として提示され、限定されないということを理解されたい。添付の特許請求の範囲に規定されたような本発明の精神および範囲から逸脱することなく、形式および詳細の様々な変更が、その中で行われてよいということが当業者によって理解されよう。したがって、本発明の広がりおよび範囲は、上述の例示的な実施形態のいずれによっても限定されるべきではなく、以下の特許請求の範囲およびその均等物によってのみ定義されるべきである。
【図１】
2019523942.tif 000014
【図２】
2019523942.tif 000015
【図３】
2019523942.tif 000016
【図４】
2019523942.tif 000017
【図５】
2019523942.tif 000018
【図６】
2019523942.tif 000019
【図７】
2019523942.tif 000020
【図８】
2019523942.tif 000021
【図９】
2019523942.tif 000022
【図１０】
2019523942.tif 000023
【図１１】
2019523942.tif 000024
【図１２】
2019523942.tif 000025
【図１３】
2019523942.tif 000026
【国際調査報告】
2019523942.tif 000027
2019523942.tif 000028