Рандомизирование содержимого таблицы и хранение их обратно в таблице

dba.stackexchange https://dba.stackexchange.com/questions/612

Вопрос

У меня есть таблица с не менее миллиона записей. Эти строки были созданы пользовательским приложением, которое считывает несколько коллекций сайтов SharePoint и хранит URL -адреса элемента в таблице. Теперь, так как мы читаем коллекции сайтов последовательным образом, первые несколько тысяч рядов принадлежат к коллекции первого сайта, следующие несколько тысяч принадлежат к коллекции второго сайта и так далее.

У меня есть еще одно приложение, которое считывает эту таблицу последовательным образом. Тем не менее, таким образом я в конечном итоге отправляю HTTP -запросы в ту же коллекцию сайтов в течение более длительного времени.

Я знаю, что смогу получить случайные результаты из таблицы в моем втором приложении. Но это не вариант. Я не могу изменить способ работает второе приложение.

Теперь вопрос в том, как я могу взять все ряды в столе, перетасовать их и хранить в столе?

Обновление: SQL Server 2008 R2 - мой сервер базы данных

Это было полезно?

Решение

Если приложение для вызова явно устанавливает определенный заказ в его запросе (если вы запускаете MSSQL, вы можете проверить это, проведя сеанс Profiler, пока приложение делает свое дело, другие DMBS будут иметь аналогичные параметры журнала), то вы ничего не можете. Сделайте, и если это не так, вы не можете полностью гарантировать какой -либо конкретный заказ.

Если не будет указано явный приказ по пункту, то данные выйдут в приказ, который официально является «неопределенным» - это будет какой -то заказ, который сервер находит наиболее сознанием. Для одного табличного запроса это, скорее всего, будет порядок первичного ключа. В MSSQL, если у вас есть кластерный индекс, результаты, скорее всего, выйдут в этом порядке для одного запроса на таблицу. Для многотолочных запросов это еще менее четко сокращено, так как зависит от того, каким образом планировщик запросов предпочитает получить ваши результаты (которые без явных подсказок индекса могут варьироваться со временем, как баланс данных в таблицах, как оценивается Индекс статистика Сервер сохраняется, изменения).

Если таблица не имеет кластерного индекса или первичного ключа, то данные, вероятно, появятся в произвольном порядке, сравнимым на заказ, в который были вставлены данные. В этом случае вы можете попробовать:

SELECT * INTO temp_table FROM table_to_be_reordered
DELETE table_to_be_reordered
INSERT table_to_be_reordered SELECT * FROM temp_table ORDER BY NEWID()

или это может быть быстрее

INSERT table_to_be_reordered SELECT * FROM temp_table ORDER BY NEWID()
DROP TABLE table_to_be_reordered
EXEC sp_rename 'temp_table', 'table_to_be_reordered'

В вышеупомянутом Newid () функция MSSQL для возврата UUID, и по умолчанию использует случайные, а не последовательные идентификаторы - в других DMBSS вы должны найти аналогичную функцию, которую вы можете использовать. Будьте осторожны с выбором функции: например, под MSSQL Функция RAND () провалена один раз на запрос, а не один раз на строку, поэтому SELECT * FROM somewhere ORDER BY RAND() не имел бы приезда (вы можете понять, почему, используя что -то вроде SELECT RAND(), * FROM some_table).

Если вы используете MSSQL (ваш вопрос не указал, на какую СУБД вы нацелены) и у вас еще нет кластерного индекса в таблице, и либо имел достаточно случайный столбец (например, столбец UUID), либо может добавить его без расстройства. Приложение для вызова, вы можете создать кластерный индекс о том, что было бы быстрее, чем Select Into / Delete / Select в выше. Но опять же: это будет никакого эффекта вообще Если приложение явно запрашивает результаты в определенном порядке и все равно может не иметь никакого эффекта в противном случае.

Другие советы

Вы не указываете, какая база данных, но в Oracle вы можете сделать это:

CREATE TABLE RAND_TABLE AS (SELECT * FROM ORIG_TABLE ORDER BY DBMS_RANDOM.RANDOM());

Вам понадобится достаточно места в вашем временном табличном пространстве, чтобы справиться с сортировкой. Тогда, если вы хотите, чтобы вы могли переименовать таблицы ORIG_TABLE а также RAND_TABLE обмениваться их. Я не думаю, что можно перетасовать стол «на месте».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top