2011-12-22 12 views
2

最初にランダムな方法についてどう思いますか?これはあまりにも貧しいですか?ランダムT-SQLの最適化

Iは、テーブルTABLE_A有する:

id  | name  | state 
---------------------|---------- 
1703248 | blablabla | 1 
...  | blablabla | 0 
7873415 | blablabla | 1 
7926033 | blablabla | 1 

ID列は、例えば 'zxg-76354GH-34347' のように、あまりにもalfanumeric値を含めることができます。 さて、私には3060のレコードがあります。

詳細:

select count(1) from TABLE_A where id like 'n%' 

場合:ランダム化

n=1 ---> 201 records , n=2 ---> 147 records , n=3 ---> 187 records 
n=4 ---> 327 records , n=5 ---> 430 records , n=6 ---> 503 records 
n=7 ---> 1175 records , n=8 ---> 35 records , n=9 ---> 55 records 

私のストアドプロシージャ:

--Name: Randomize_sp 
BEGIN 
DECLARE @temp table(id varchar(50)) 
--RANDOM 1 
INSERT INTO @temp 
SELECT id FROM TABLE_A 
WHERE state > 0 
ORDER BY RAND(CHECKSUM(NEWID())) 
--RANDOM 2 
SELECT top 1 id FROM @temp ORDER BY RAND(CHECKSUM(NEWID())) 
END 

私は私が必要とする何回か 'N' 回(ストアドプロシージャことを呼び出しますこれを行うには):

BEGIN 
DECLARE @nTimes int, @i int 
DECLARE @tempT table(id varchar(50)) 
SET @nTimes = 12 
SET @i = 0 
WHILE @i < @nTimes 
    BEGIN 
    INSERT INTO @tempT 
    EXECUTE MyDB.dbo.Randomize_sp 
    SET @i = @i + 1 
    END 
    SELECT id FROM @tempT 
END 

問題は、常に「7」で始まる4行または5行、時には「5」で始まる3行または2行が得られます... は繰り返しを避けたいと思います。私はどんな提案も歓迎する。

ありがとうございました。

+0

私はあなたが何をしようとしているのか本当に理解していません。 Id値をランダム化したいのですか?50文字のランダムな文字が必要ですか? – Lamak

+0

はい、ランダム化するId値が必要ですが、私はORDER BY RAND(CHECKSUM(NEWID()))を実行していますが、 '743432' y '75469'のような繰り返しは避けてください。それを望んでいないか、私はその繰り返しを減らす必要があります。私は、全体の約50%が '7'で始まるレコードであるため、このパターンのIDがより多くの確率を持つので、 – jlrvpuma

+0

あなたはその場合にあなたのIDに 'NEWID()'を使うことができます。しかし、本当に1から50までのランダムな文字が必要な場合は、はるかに複雑なアルゴリズムが必要です – Lamak

答えて

4

あなたは「ランダム」が何を意味するのか分かりません。この場合、3000レコードありますが、1175レコードは「7」で始まります。純粋な統計によれば、あなたは「7」を得る時間の約33%を言います。あなたはかなり頻繁に愚か者を得るでしょう。 Lamakのコメントには、重複を明示的に避けたい場合は、はるかに複雑なアルゴリズムが必要であり、データによっては重複を避けることができない可能性があります。

最終目標は何ですか。いくつかのIDのセットを何度も複製しているようですが、そのデータは何を使用していますか?あなたが望むものを達成するためのより良い、そしてはるかに短い道があるかもしれません。

その他のコメント: あなたのRAND(CHECKSUM(NEWID()))の使用は私を困惑させます。 RAND()を呼び出したばかりの場合は、ランダムにシステムのタイムスタンプが設定されます。これは、巨大なデータモデリング以外のアプリケーションで十分な "ランダム性"以上のものです。

さらに、なぜRandomize_spで「ランダム化」していますか?まず、データベースからすべての "状態> 0"行を一時表に選択し、一時表からすべてを選択します。ランダム性を「増やす」ことはできないので、最初に@table変数に入れるのではなく、元のデータセットを返すほうがよいでしょう。

+0

ssyladin、返信いただきありがとうございます。コードを編集しました。ランダムに2回選択しました。 1つのレコードが最後にはランダムに1つのデータが通常は順序付けられているため乱雑にしようとします: '1 ***'(n回)、 '2 ***'(ntimes)、... '9 *** '(n回)。時々私はグループ別に処理が必要なので、WHILEループからRandomize_spを呼び出します。 – jlrvpuma

+0

使用しているデータベースサーバーのタイプは何ですか?私は、あなたが描いているものとは非常に異なる行動を取っています。私はMS SQL 2008 R2インスタンスのテストを行っています。あなたですか? – jklemmack

+0

私もMS SQL 2008 R2のインスタンスを使用していますが、プロセスの目標は1つまたは複数の受賞者を選択することです。毎回、抽選を想像しますが参加者はciaの雇用者です。 Idの最初の文字は都市を指定します。私は特定の都市でより多くの雇用者がいるとき、その都市のより多くの勝者(ゥープ)を得るので、ランダム化が貧しいと多くの人々が考えるので、私はプロセスがリファクタリングすると思ったので、特定の都市にもっと多くの人がいるでしょう。 – jlrvpuma