4

次のようなクエリを記述できない特定の設計上の理由が必要だと思います。

select 
    (select column_name 
    from information_schema 
    where column_name not like '%rate%' 
    and table_name = 'Fixed_Income')
from Fixed_Income

代わりに、動的SQLに頼る必要があります。

誰もがその理由が何であるか知っていますか?私はそれをグーグルで試してみましたが、すべてのヒットは問題を解決するための助けを求める叫びでした-つまり、それはかなり広範囲にわたるニーズであり、よく理解されていません。

4

2 に答える 2

6

その理由は、クエリオプティマイザは、コンパイル時に参照している正確なスキーマオブジェクトを知る必要があるためです。クエリを最適化するためにそれらが必要です。この情報をクエリオプティマイザで利用できなければ、RDBMSがどれほど遅くなるか信じられないでしょう。

これは、実際の静的型付けと動的型付けのパフォーマンスの違いに少し似ています。通常、重要な違いがあります(ここでは主流の言語について考えています)。コンパイラーは静的情報を利用して優れたコードを生成できます。

この機能が存在する場合でも、最初にテーブル名と列名を計算してから、標準の「静的」クエリプランニングを実行することで実装されます。

于 2012-06-06T19:59:40.487 に答える
1

あなたは非常に興味深い質問をします。

「関係代数」の「関係」は、テーブル間の関係ではなく、名前と値のペアを指します。関係代数では、セット(テーブル)内のすべてのレコードが同じ列を持つ必要はありません。

私の推測では、制限は実体関連図のアイデアに関連していると思います。データベースはテーブルを中心に設計されており、これらのテーブルは相互に関係があります。データの保存とアクセスのためのリレーショナルデータベースの選択は、特にデータをこの方法で保存できる場合でした。エンティティとその属性を知ることは、データの静的な形式、したがってクエリでの静的な参照を示唆します。

さらに、言語としてのSQLは、手続き型言語ではなく宣言型言語です。これは、クエリの実行とは別のコンパイル手順を示唆していますが、強制はしていません。一般に、SQLエンジンは次のことを行います(非常に高いレベルで)。

  1. クエリをコンパイルします。通常、ある種のデータフロープロセスにコンパイルします。
  2. データフロープロセスを最適化します。(通常、コンパイルプロセスの一部です。)
  3. クエリを実行します。

最初の2つは、いわゆる「クエリプラン」になります。ただし、操作しているオブジェクトについて知らない限り、最適化を行うことはできません。したがって、テーブルと列を動的に選択するということは、最適化がクエリのコンパイルではなく実行の一部になることを意味します。

最後に、SQLServerなどの一部のデータベースは動的SQLをサポートしています。これにより、コンパイルと実行を同時に行う文字列を作成できます。これは、複雑な意思決定支援クエリに非常に役立ちます。高速なトランザクションスループットが必要な場合は、クエリに比べてコンパイルのオーバーヘッドが高すぎるため、お勧めしません。

于 2012-06-06T20:10:57.527 に答える