|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
(Yaffil) 1. Есть: табля в которой 150 тыщ строк. 2. Нужно: Сделать выборку RANDOM 150 строк. 3. Как это сделать не на клиенте? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 11:01 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 12:13 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Выше было предложено следующее: Гаджимурадов Рустам Смотря какая рандомность нужна... Самое тупое Код: plaintext 1. 2. 3.
первая строчка каждый раз в выборку не попадала - с помощью SKIP или с помощью (Where PK > :start) Способ чуть умнее Код: plaintext 1. 2. 3.
Код: plaintext
Я посчитал что выдать результат, который просит Диля оно не сможет и удалил как "вредные советы". Если Рустам покажет , что таки может, готов извиниться. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 13:34 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Di_LIne(Yaffil) 1. Есть: табля в которой 150 тыщ строк. 2. Нужно: Сделать выборку RANDOM 150 строк. 3. Как это сделать не на клиенте?а поле PK - с дырками или без ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 14:42 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Рустам, действительно, не ругал моё предложение, а наоборот, сказал "о да!". Вот только не из той же оперы, не из той же. Я без тынца тут свои мысли навалю кучкой. Проверка условия PK = random(150000) имхо не сработает никогда, потому что вероятность, что совпадёт значение PK и значение рандома ничтожно мала. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 15:04 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Таблоида поле PK - с дырками или без ? А как жеж без них-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 15:15 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Di_LIne, Варианты с ХП принимаются? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 16:30 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Senya_LDi_LIne, Варианты с ХП принимаются?Не, отставить ХП. Тормозно получается. SKIP не умеет читать по индексу. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 17:05 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
На почти миллионе мелких записей select first 150 * from table1 order by rand() 13000msec Select First 150 * From Table Where mod(PK,150)=0 10ms - конечно случайности мало Where (PK = 150000*rand()) 2.3 sec, результата нет Select First 150 * From Table Where mod(PK,rand()*10000+1)=0 31ms - случайность есть, но относительный порядок записей сохраняется а теперь финалист select * from (Select First 150 * From Table Where mod(PK,rand()*10000+1)=0) order by rand(); тоже 31ms PK у меня не было, я его эмулировал extract(second from msgdate) * extract(yearday from msgdate) FB 2.5RC2 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 17:47 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
SiemarglSelect First 150 * From Table Where mod(PK,rand()*10000+1)=0 31ms - случайность есть, но относительный порядок записей сохраняется а теперь финалист select * from (Select First 150 * From Table Where mod(PK,rand()*10000+1)=0) order by rand(); тоже 31msСтрого говоря оба этих супер-быстрых методов не дают гарантии, что получишь заказанное количество строк. ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 17:57 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Senya_L, Конечно, надо соотносить величину делителя и кол-ва записей в таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 18:18 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
SiemarglSenya_L, Конечно, надо соотносить величину делителя и кол-ва записей в таблице.И даже если соотнесешь - гарантии нет. Особенно на небольших таблицах. Кроме того, есть подозрение, что мат. ожидание для всех записей вряд ли будет одинаковым. Проще говоря, для первых записей вероятность попасть в выборку будет больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 19:23 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Как вариант, попробовал портировать решение, которое используется на mysql. Генерируем нужное кол-во случайных чисел из отрезка min(ID) .. max(ID) и получаем что-то типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Заметил небольшие тормоза, если под условие id > xxx попадает много записей, как я понял, first не оптимизируется. Если интервал ограничить сверху, получается неплохо. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Prepare time = 0ms Execute time = 16ms P.S. из-за дырок может получится меньше записей, + могут появится повторы. Как вариант, можно сразу запрашивать больше записей или повторить процедуру еще раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 21:23 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
У меня есть таблица с крайне дырявым ПК, в ней примерно 400 тыс строк. Решил добавить к ней индекс по убыванию поля ID (чтобы быстрее определялся MAX(ID)). Затем сделал ХП, в которой генерится числовой ряд от 1 до 100 тыс со случайными значениями: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Код: plaintext 1. 2.
Код: plaintext 1. 2. 3.
Хотя, конечно же, никакой гарантии на то, что 100 тыс строк дадут при соединении не менее 150, нету. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 22:30 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
А как сделать что бы вероятность была одинакова для всех чисел диапазона? Мне нужно целое в диапазоне 10-13 . Делаю так: SELECT (ROUND(10+(RAND(CHECKSUM(NEWID()))*3),0)) Но все равно числа 10 и 13 выпадают реже чем 11 и 12 . ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2015, 10:48 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
tosick4, Что значит "реже"? Сколько опытов было проведено прежде чем придти к такому выводу? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2015, 11:31 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
Около 50 тыс. Мне подсказали - использовать вместо round функцию cast! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2015, 11:43 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
tosick4числа 10 и 13 выпадают реже чем 11 и 12 . Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2015, 13:49 |
|
select... random - как сделать?
|
|||
---|---|---|---|
#18+
tosick4, Таблоид уже дал тебе ответ, но я поясню его: если для любого числа внутри диапазона, например, 11, попадают значения от 10.5 до 11.5 (не включая), то для "граничного числа" 10 попадают только от 10 до 10.5 (не включая), т.е. в 2 раза меньше. Потому нужно раздвинуть по 0.5 границы генерируемых значений. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2015, 14:07 |
|
|
start [/forum/topic.php?fid=40&fpage=71&tid=1562636]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 261ms |
total: | 404ms |
0 / 0 |