Оптимизировать случайный T-SQL - PullRequest
2 голосов
/ 23 декабря 2011

Во-первых: что вы думаете о том, как я случайно?Это слишком плохо?.

У меня есть таблица TABLE_A:

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

Столбец id также может содержать буквенно-цифровые значения, например, 'zxg-76354GH-34347'.Ну, у меня 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

Проблема в том, что всегда я получаю 4 или 5 строк, начинающихся с '7', иногда я получаю3 или 2 строки, которые начинаются с «5» ... Я бы хотел избежать повторений.Я ценю любое предложение.

Спасибо.

1 Ответ

4 голосов
/ 23 декабря 2011

Я думаю, вы не знаете, что означает "случайный".В этом случае у вас есть ~ 3000 записей, но 1175 из них начинаются с "7".Чистая статистика говорит, что примерно в 33% случаев вы получите «7».Вы будете получать куклы довольно часто.По словам Ламака, если вы хотите явно избежать дублирования, вам понадобится гораздо более сложный алгоритм, и в зависимости от ваших данных избежать дублирования может оказаться невозможным.

Какова конечная цель?Похоже, вы дублируете некоторый набор идентификаторов несколько раз, но для чего используются эти данные?Там может быть лучший и гораздо более короткий путь для достижения того, что вы хотите.

Другие комментарии: Ваше использование RAND (CHECKSUM (NEWID ())) ставит меня в тупик.Если вы только что вызвали RAND (), он будет случайным образом заполнен системной меткой времени.Это более чем достаточная «случайность» для любого приложения вне моделирования больших данных.

Плюс, почему вы дважды «рандомизируете» в Randomize_sp?Сначала вы выбираете все строки «state> 0» из базы данных во временную таблицу, затем выбираете все из временной таблицы.Вы не можете «увеличить» случайность, поэтому лучше просто вернуть исходный набор данных вместо того, чтобы сначала поместить его в переменную @table.

...