Создайте sql запрос который помещает в таблицу users миллион записей
Как сформировать и вставить в таблицу заданное количество строк на T-SQL
Всем привет! Сегодня я расскажу о том, как можно на языке T-SQL сгенерировать большое количество строк с какими-то схожими данными и вставить в таблицу, при этом вся эта процедура будет выполняться всего несколько секунд!
Иногда возникает необходимость создать таблицу и сформировать для нее определенное количество строк с тестовыми, псевдослучайными или просто схожими данными, в основном это требуется для тестирования какого-нибудь функционала или для решения какой-то определенной задачи.
Однако в любом случае возникает вопрос – как сформировать строки с подобными данными на T-SQL и вставить их в таблицу?
Если речь идет о 10, 20, 30 записях, то проблемы, конечно же, никакой нет, Вы можете просто 10 раз выполнить одну инструкцию INSERT, но когда речь заходит о сотнях тысяч строк или миллионах, то простой инструкцией здесь не обойтись, поэтому у тех, кто впервые сталкивается с такой задачей, возникает вопрос: какой же механизм использовать, чтобы сформировать и вставить строки в таблицу.
В этой статье я как раз и хочу рассказать о механизме, который позволяет сформировать любое количество строк, которые в свою очередь можно легко добавить в таблицу.
Предлагаю рассмотреть данный механизм на решении конкретной задачи.
Условие задачи
Есть база данных в Microsoft SQL Server, необходимо создать таблицу с 1 миллионом строк.
Данные должны содержать:
- Последовательность чисел от 1 до миллиона;
- Последовательность дат с точностью до часа и интервалом в час;
- Любые текстовые данные.
Формирование строк с данными на T-SQL и добавление их в таблицу
Первое, что приходит на ум для решения данной задачи – это использовать цикл, и в нем с помощью какого-нибудь алгоритма сформировать последовательность чисел и дат.
Однако, если мы будем использовать этот механизм, то нас ждёт разочарование.
Дело в том, что для формирования и добавления данных в таблицу в нашем случае необходимо запустить цикл, в котором будет очень много итераций и операций вставки данных в таблицу. Как результат, инструкция будет выполняться долго, более того, если Вы запустите такую инструкцию, то скорей всего Вы просто не дождетесь окончания ее выполнения.
Отсюда можно сделать вывод.
Не нужно использовать цикл для формирования большого количества строк.
Ну а теперь давайте рассмотрим рабочий вариант решения, который подразумевает использование стандартных механизмов языка SQL, в частности – соединение таблиц.
Для решения нашей задачи нам потребуется обобщенное табличное выражение (CTE), объединение CROSS JOIN, ну и конструктор табличных значений (VALUES) для более компактной реализации.
Суть решения в следующем: мы сформируем десять строк данных с помощью конструктора табличных значений, можно использовать и объединение UNION, но вариант с VALUES более компактный. Затем мы с помощью CROSS JOIN будем соединять эти данные друг с другом, а как Вы помните, результат CROSS JOIN – это декартово произведение. Таким образом, чтобы создать 1 миллион строк нам достаточно 5 раз сделать CROSS JOIN.
Этот механизм Вы можете использовать для создания любого количества строк, он работает достаточно быстро.
Для создания последовательности чисел мы будем использовать обычное IDENTITY в таблице, а для последовательности дат используем небольшое сочетание оконной функции ROW_NUMBER и функции DATEADD.
Решение задачи

Как Вы могли заметить, для соединения CROSS JOIN я использовал классический способ, т.е. явно не указывал инструкцию CROSS JOIN, я просто в секции FROM перечислил таблицы и никаких условий не ставил, а как Вы, наверное, знаете, если не указывать условия при таком синтаксисе, будет происходить как раз соединение CROSS JOIN. Это сделано специально для формирования более компактной инструкции. Однако в обычных ситуациях при соединениях разных таблиц рекомендовано использовать синтаксис с явным указанием инструкции JOIN, т.е. INNER JOIN, LEFT JOIN и так далее.
В результате мы сформировали и вставили в таблицу 1 миллион записей, при этом у нас есть последовательность чисел и последовательность дат, в нашем случае в каждой строке у нас хранится временная отметка с интервалом в час, начиная с 1907 года)). Просто с этого года до нашего времени прошло 1 миллион часов.
Инструкция добавления данных даже на моем обычном компьютере (не сервере), работала всего 1 секунду, плюс еще выборка работала несколько секунд, итого вся инструкция выполняется за 5-6 секунд. Для миллиона строк, я думаю, неплохо, если сравнивать с циклом))
Если у Вас возникла необходимость добавить не миллион строк, а больше, то просто добавьте еще одно соединение CROSS JOIN с этими же данными, т.е. с CTE. Если наоборот необходимо добавить меньше строк данных, то уберите одно или несколько соединений.
В тех случаях, когда требуется сформировать и вставить в таблицу точное количество строк, допустим 850 123, Вы можете использовать обычное условие WHERE, чтобы ограничить выборку для вставки в таблицу.

Заметка! Если Вас интересует язык SQL, то рекомендую почитать книгу «SQL код» – это самоучитель по языку SQL для начинающих программистов. В ней язык SQL рассматривается как стандарт, чтобы после прочтения данной книги можно было работать с языком SQL в любой системе управления базами данных.
Создайте sql запрос который помещает в таблицу users миллион записей
можно и на pl\sql используя bulk collect и forall
[sql]DECLARE
TYPE prod_tab IS TABLE OF products%ROWTYPE;
products_tab prod_tab := prod_tab();
BEGIN SELECT * BULK COLLECT INTO products_tab FROM products;
FORALL i in products_tab.first .. products_tab.last
INSERT INTO products VALUES products_tab(i);
Aleksey
- 03.09.2010
- #6
MySQL – Как быстро вставить миллионы строк?
- Создать скрипт для генерации данных
- Использовать вывод для вставки в базу данных
- Просто запустите ночь
- Наслаждайтесь этой пинтой, когда она делает свой материал
- MySQL: эффективно заполнять таблицу в хранимой процедуре
- Скорость заявлений INSERT
- Вопрос задан более трёх лет назад
- 786 просмотров
- Вконтакте
- Вконтакте




- Вконтакте
- Вконтакте
utyfua: Warning: mysql_query(): MySQL server has gone away in C:\OpenServer\domains\messall.loc\index.php on line 13
Warning: mysql_query(): Error reading result set’s header in C:\OpenServer\domains\messall.loc\index.php on line 13
utyfua: 0 результатов в БД. Функция выполнилась 10раз.INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);
Скрипт выполнялся 0.0029051303863525сек
Name already in use
MySQL_IC_HomeWorks / HW_les_09_Оптимизация_запросов / hw_09_les.sql
- Go to file T
- Go to line L
- Copy path
- Copy permalink
Copy raw contents
Copy raw contents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Быстро вставить 1 000 000 значений в mysql [дубликат]
Есть такая задача.
БД MySQL в ней одна таблица (int) , и нужно заполнить значениями с 1 до 1 000 000 . Подключаюсь и работаю с БД через jdbc .
Мне приходит на ум два решения: придумать запрос на формирование такой таблицы и передать его в БД через statement , или можно сделать типа цикла в java и записать значения через цикл.
Допустим:
Собственно вопрос, как сделать такую вставку быстрее?
В задаче важна скорость. Есть у кого идеи?
Оптимизация: Можно в одном запросе добавлять сразу несколько строк.
Выполни сохраненную процедуру
При таком варианте 1 000 000 строк добавятся за 14 секунд. 1000 итерации c 1000 values – 74 секунды. 100 по 10 000 строк – 22 секунды.
Можно в одном запросе все миллион строк добавлять. То есть можно и через JDBC такой запрос послать, ограничение на длину запроса в MySQL 32 МБ вроде.
Неактуальная информация: Создай хранимую процедуру
Добавление 1000 записей заняло у меня 47 секунд, то есть 1 000 000 записей добавятся за 13 часов.
Создайте sql запрос который помещает в таблицу users миллион записей
можно и на pl\sql используя bulk collect и forall
[sql]DECLARE
TYPE prod_tab IS TABLE OF products%ROWTYPE;
products_tab prod_tab := prod_tab();
BEGIN SELECT * BULK COLLECT INTO products_tab FROM products;
FORALL i in products_tab.first .. products_tab.last
INSERT INTO products VALUES products_tab(i);
Aleksey
- 03.09.2010
- #6
MySQL – Как быстро вставить миллионы строк?
- Создать скрипт для генерации данных
- Использовать вывод для вставки в базу данных
- Просто запустите ночь
- Наслаждайтесь этой пинтой, когда она делает свой материал
- MySQL: эффективно заполнять таблицу в хранимой процедуре
- Скорость заявлений INSERT
- Вопрос задан более трёх лет назад
- 786 просмотров
- Вконтакте
- Вконтакте




- Вконтакте
- Вконтакте
utyfua: Warning: mysql_query(): MySQL server has gone away in C:\OpenServer\domains\messall.loc\index.php on line 13
Warning: mysql_query(): Error reading result set’s header in C:\OpenServer\domains\messall.loc\index.php on line 13
utyfua: 0 результатов в БД. Функция выполнилась 10раз.INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);INSERT INTO t(ticket_id) VALUES(rand()*1000000);
Скрипт выполнялся 0.0029051303863525сек
Name already in use
MySQL_IC_HomeWorks / HW_les_09_Оптимизация_запросов / hw_09_les.sql
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters