900万(+1)の数字をどのように/どのように使用する予定ですか?
番号のストリームをクライアントに送り返すことが唯一の目的なら、クライアントアプリケーションに9mの数字を生成させるほうがはるかに効率的だと思います。
は、小さなテーブル(RMHのベース-10の例を参照)の一握りのデカルト積に基づいて単一のクエリを使用して数字のシーケンスを生成する多くの方法がありますが、これらのソリューションのすべてが必要です:
- まず、全体のデカルト積が
- その後のtempdbに内蔵されるように、全体のデカルト積は、(メモリおよびtempdb内)ソートする
- のみ、クライアントに送り返され、所望の数である
このオーバーヘッドは、小さな数字セット(1〜10)または大きな数字セット(1〜9,000,000)を生成するかどうかにかかわらず、同じ「ジェネレータ」クエリに必要です。
明らかに、より効率的で、より軽量な方法を使用して、データサーバーのリソースを奪うのを防ぐ必要があります(たとえば、9,000,000の数値を生成しようとしている複数のユーザー/アプリケーションを想像してください...大量のtempdbスペースとcpuリソース... egad ... DBAからの怒った電子メール/電話コールを期待してください!)。
もう一つのアイデアが必要な数字...
declare @counter bigint, @max bigint
select @counter=0, @max=9000000
while @counter <= @max
begin
select @counter
select @[email protected]+1
end
を生成するためのループ構造を使用するだろう...と、これはtempdbのオーバーヘッドを排除する一方で、あなたはまだアップに使用するつもりです中規模のCPUリソースが900万回ループしています。追加のパフォーマンス・ヒットは、900万行の結果セットを生成するオーバーヘッドから来る可能性があります。特に、dataserverとクライアント・アプリケーションの間に流れるネットワーク・パケットの数が過剰になる可能性があります。
最終結果を単一の結果セットのように見せることでネットワークパケットの量を減らすことはできますが、これは上記のループ構成をストアドプロシージャに変換し、ループバックサーバーが定義されていることを確認し、前記プロキシを参照するプロキシ・テーブルと、プロキシ・テーブルを照会して、目的の数値セットを含む単一の結果セットのように見えるようにします。
は「もちろん、この時点で、我々は今だけのデータサーバを持っているいくつかのフープを介してジャンプしなければならなかった単一の結果セットとして、(多少効率的な方法で)一連の数字を生成します。
SYBASE/ASEは、一連の番号を生成することができるいくつかの他の手段があるかもしれません(例えば、ID列を持つテーブルを移入/作成)が、すべては、データサーバのいずれかa)の良いビットが必要になりますリソースまたはb)いくつかの複雑なコード(例えば、アプリケーション・コンテキスト機能、プラグイン、Javaコード)...そう、より効率的にクライアント/フロントエンドアプリケーションによって処理された何かをします。 Sybase IQでは
私の質問が明確でない場合、私は責任を負いませんよ?私は、マスターからの読み取りに権限を追加する必要があるものの – Moudiz