2008-08-05 4 views
14

エラーメッセージが表示されましたか?テーブルが多すぎるためSQL Serverが実行できなかったクエリがありますか?

- SQL Server 2000の

は、ビューまたは関数の解決に補助テーブルを割り当てられませんでした。
クエリ内のテーブルの最大数(256)を超えました。

- SQL Server 2005

クエリのテーブル名が多すぎます。最大許容値は256です。

もしあれば、何をしましたか?

?お客様の要求を簡素化するように顧客に説得しましたか?データベースを非正規化しますか?


(誰もが私がクエリを投稿したい)@:

  1. 私は答えの編集ウィンドウにコードの70キロバイトを貼り付けることができるかどうかはわかりません。
  2. この70キロバイトのコードは、20または30のビューを参照するので、これは役に立ちませんが、それ以外の場合はコードが意味をなさないため、投稿する必要があります。

私はここで自慢しているように聞こえませんが、問題はクエリに含まれていません。クエリは最適(または少なくともほぼ最適)です。私はそれらを最適化するために無数の時間を費やして、すべての単一の列と削除可能なすべてのテーブルを探しました。 1つのSELECT文で満たされなければならない200または300列のレポートを想像してください(それは、それがまだ小さなレポートだったときに数年前に設計された方法なので)。

+0

SQL Server 2000 SP3を使用していますか? – Stu

+0

ビューを作成することはできますか? –

+1

ビューは役に立ちません。ビューで使用されるテーブルも上限にカウントされます。 –

答えて

8

SQL Server 2005では、テーブル変数を使用して、データを部分的に構築することをお勧めします。

これを行うには、ユーザーに送信する最終結果セットを表すテーブル変数を作成します。

次に、プライマリテーブル(上記の例のordersテーブル)を見つけて、そのデータだけでなく、1つだけ結合するという補足データ(顧客名、製品名)を取り出します。 SELECT INTOを使用して、これをテーブル変数に直接入れることができます。

そこから、テーブルを繰り返し、各行に対して、結果セットに必要なすべての補足データを取得する一連の小さなSELECTクエリを実行します。これらを各列に挿入します。

完了したら、テーブル変数から簡単なSELECT *を実行して、この結果セットをユーザーに返すことができます。

ハード・ナンバーはありませんが、これらの小さなクエリを実際に実行した3つの異なるインスタンスが、多数の結合で大量の選択クエリを実行するよりも実際に高速に機能しました。

1

私はこのような状況に遭遇したことはありません。正直なところ、256個以上のテーブルを照会するという考えは、私にとって死の恐怖を感じさせます。

あなたの最初の質問は、おそらく "なぜそんなに多いのでしょうか?"の後ろに "何ビットの情報がありますか?はありません。が必要ですか?"私はそのようなクエリから返されるデータの量がアプリケーションのパフォーマンスにも非常に深刻な影響を与え始めるだろうと心配しています。

+0

実際に多くの関連情報とともに店舗内のアイテムのリスト(グリッド内)を表示したい顧客を想像してください(例えば、各アイテムの最初の注文、最後の注文、最初の配送について、最後の配送について、それを購入する顧客、配送コストなど)。私を信じて、それは可能です、私はそれを見ました。そして私はそれに対処しなければなりませんでした。 :) はい、このような状況では、パフォーマンスへの影響が深刻な場合があります。 –

0

私はそのクエリを見たいと思っていますが、それはある種のイテレータで問題があると思いますが、可能性のある状況を考えることはできませんが、間違った/ case/cursorまたは実装されていないビューが非常に多い。

+0

どのような種類のイテレータでもありません。単なるSELECT文です。 –

1

@chopeenこれらの統計を計算する方法を変更する代わりに、すべての製品ごとの統計情報を別々のテーブルに保存することができます。注文があったときに製品をループし、統計情報の適切なレコードを更新します表。これは、レポートを実行するときに1つの膨大なクエリですべてを実行するのではなく、計算負荷の多くをチェックアウトページにシフトします。もちろん、このように機能しない統計もいくつかあります(例:特定の製品を購入した後の顧客の次の購入を追跡する。

0

ポストクエリ:D

はまた、私は、単一のルックアップテーブルに凝縮できた名前/値テーブルのトンを(読んで200以上)を有する可能性が可能性のある問題の一つのように感じます。

1

これは、SQL Server 2000で実行されているDynamics CRMインストール用のReporting Servicesレポートを作成する際に常に発生します。CRMには、多くの結合が発生する正常なデータスキーマがあります。実際には、256から256までの制限を超える修正プログラムがあります(http://support.microsoft.com/kb/818406)。私たちはいつもこれをSQL Serverチームの冗談と考えていました。

解決策は、適切な「サブジョイン」(好ましくは複数回使用されるサブジョイン)を特定し、それらをメインジョインで使用する一時テーブル変数に分解することです。それは主要なPIAであり、しばしばパフォーマンスを殺します。申し訳ありません。

@Kevin、そのティーンが大好きです。

0

私の開発ボックスはSQL Server 2008(ビューはうまくいきました)を実行しますが、SQL Server 2005ではプロダクションでは表示されませんでした。私はこの制限を避けるために、エラーを投げたビュー内のクエリの一部として新しいビューを使用してビューを作成しました。私は、ビューを作成したいとき、論理的実行を考慮

愚かなの種類が同じである...

+2

私が知る限り、ビューに使用されるテーブルは限界に向かってカウントされます。インデックス付きビューを使用していますか? –

0

は(2008年に働いていた)SQL Server 2005で同じ問題を持っていました。私はビューの代わりにストアドプロシージャを作成することで問題を解決しました。

関連する問題