Как удалить много записей из базы данных [закрыт]
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 7 лет назад .
Простое удаление работает очень долго (около 40 секунд из одной таблицы, в которой примерно 1,5 миллиона записей), нужно сделать быстрее (нужно удалить все данные пользователя). База MSSQL.
Отслеживать
user177221
задан 12 фев 2016 в 10:22
43 1 1 серебряный знак 6 6 бронзовых знаков
А удаляемых записей сколько. Имеются ли внешние ключи, ссылающиеся на таблицу с удаляемыми записями. Сколько индексов создано на этой таблице.
12 фев 2016 в 10:28
Да, поподробнее бы: из таблицы удаляются вообще все данные, или часть данных удаляется, а часть остаётся? Как выбираются строки для удаления (по ключу или по другим полям), есть ли индексы?
12 фев 2016 в 10:31
Задан один индекс, по двух полях.
12 фев 2016 в 10:48
@AndrijM А сколько времени работает select count(1) from table where user_id=XX ? Индекс конечно замедлит саму операцию удаления, и вставки в таблицу заодно, но зато он позволит найти те записи, которые надо удалять гораздо быстрее. Если select count() то же сильно тормозит, попробуйте создать индекс и посмотреть что получится
12 фев 2016 в 11:03
На мой взгляд — если удаление частая операция, либо относительно нечастая, но всё же критичная по времени, то индекс стоит добавить. «Если 20к?» я бы добавил. Только не спрашивайте «а если 100к?». 🙂 Да возможно будет некий порог, после которого query processor может решить, что быстрее будет пойти table scan-ом, чем index seek. Порог этот будет зависеть от данных и достоверности статистик.
12 фев 2016 в 11:43
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Если нужно удалить ВСЕ записи из некоторой таблицы, используйте TRUNCATE, предварительно удалив внешние ключи, которые ссылаются на таблицу. Это самый быстрый способ. Он, в частности, игнорирует триггеры.
Если просто большое количество, то нужно удалять пачками. Оптимизировал я job, который удалял устаревшие данные, порядка ~100млн. строк в неделю. запускался на выходных. Опытным путём пришёл к выводу, что быстрее всего строки удаляется пачками по 100-500 штук.
Создаём временную табличку с ID’ами записей которые будем удалять. Пишем туда 100-500 ID’ов. и вызываем:
DELETE T2 FROM #Table T1 INNER LOOP JOIN Table T2 ON T1.ID = T2.ID
Здесь нужен именно LOOP. Хотя сервер скорее всего и без хинтов догадается. Вместо ID таблицы Table, может быть любой уникальный ключ. В случае, если ключ кластерный, то в таблицу #Table желательно вставлять ID’ы пачек строк, которые записаны в Table «рядом».
Если целиком пачку удалить не удалось, вызываем удаление по одной записи и логируем результаты.(ну я так делал:)) потом утром анализируем.
UPD: по поводу быстрого поиска удаляемых записей. Стоит создать индекс по UserId и посмотреть станет лучше или нет.
UPD: чуть-чуть про то, почему именно пачками.
Удаление по одной записи — это N транзакций. Выполняется довольно медленно. Таким был job до того, как я начал его оптимизировать. Пытаться удалить одним DML оператором ~1млн строк тоже плохо. Т.к. сама транзакция становится очень большой и рискуем получить нехватку памяти. Да и выполняется это долго.
В итоге задавая размер пачки, я к каждой таблице подобрал оптимальное число одновременно удаляемых записей. Начальник был доволен(с) 🙂
Как удалить данные из таблицы sql
Для удаления используется оператор DELETE . Можно удалить данные по условию, например, так:
DELETE FROM products WHERE brand = 'Apple';
Здесь мы удалили все строки в которых у товара указан бренд Apple.
Если нужно удалить все данные, вне зависимости от условий, то делается это следующим образом:
DELETE FROM products;
Как удалить данные из таблицы MySql?
Вопрос такой, есть код добавления данных в БД MySQL. Как мне удалить определенную строку по «id_product». Допустив ввожу в окно textbox9 число 1, нажимаю на button4 и удаляется строка под id_product = 1. Из БД «shop», таблицы «products».
private void button1_Click(object sender, EventArgs e) < if (textBox1.Text == "") < MessageBox.Show("Введите наименование товара"); return; >if (textBox2.Text == "") < MessageBox.Show("Введите цену товара"); return; >DB db = new DB(); MySqlCommand command = new MySqlCommand("INSERT INTO products (`name`, `price`, `proizv`, `color`, `amount`) VALUES(@name, @price, @proizv, @color, @amount)", db.getConnection()); command.Parameters.Add("@name", MySqlDbType.VarChar).Value = textBox1.Text; command.Parameters.Add("@price", MySqlDbType.VarChar).Value = textBox2.Text; command.Parameters.Add("@proizv", MySqlDbType.VarChar).Value = textBox3.Text; command.Parameters.Add("@color", MySqlDbType.VarChar).Value = textBox4.Text; command.Parameters.Add("@amount", MySqlDbType.VarChar).Value = textBox5.Text; db.openConnection(); if (command.ExecuteNonQuery() == 1) MessageBox.Show("Товар добавлен"); else MessageBox.Show("Товар не добавлен"); db.closeConnection(); >
Код с Delete. Не могу подправить его под свой интерфейс приложения
private void DeleteRow(string idproduct) < string conStr = "datasource=127.0.0.1;port=3306;username=root;database=shop;"; using (MySqlConnection con = new MySqlConnection(conStr)) < try < //параметризованный запрос string sql = "DELETE FROM user " + "WHERE id_product = @id_product"; //открываем соединение с базой данных con.Open(); //создаём команду MySqlCommand cmd = new MySqlCommand(sql, con); //создаем параметр и добавляем его в коллекцию cmd.Parameters.AddWithValue("@id_product", idproduct); //выполняем sql запрос cmd.ExecuteNonQuery(); >catch (Exception ex) < MessageBox.Show(ex.Message); >> > private void button4_Click(object sender, EventArgs e) < if (!String.IsNullOrEmpty(textBox9.Text)) < DeleteRow(textBox9.Text); >>
Удалить последовательность баз данных (Управление данными)
Удаляет последовательность баз данных из базы геоданных.
Использование
- Инструмент может использоваться с файловыми базами геоданных и базами геоданных в IBM Db2 , Microsoft SQL Server , Oracle , PostgreSQL и SAP HANA .
- Вы можете использовать функцию ListDatabaseSequences для получения списка последовательностей баз данных в файловой базе геоданных. Это позволит вам подтвердить имя последовательности и просмотреть ее свойства перед удалением.
Параметры
Входная рабочая область
- Db2 – право доступа DBADM
- Oracle – должен быть владельцем последовательности или иметь системные права DROP ANY SEQUENCE
- PostgreSQL – должен быть владельцем последовательности
- SAP HANA – должен быть пользователем standard
- SQL Server – права ALTER OR CONTROL для схемы той базы данных, где хранится последовательность
Имя последовательности
Имя последовательности баз данных, которую вы собираетесь удалить. После удаления последовательность нельзя использовать для создания идентификаторов последовательности путем вызова ее из существующих пользовательских приложений или выражений.
Производные выходные данные
Обновленная входная рабочая область.
arcpy.management.DeleteDatabaseSequence(in_workspace, seq_name)
in_workspace
- Db2 – право доступа DBADM
- Oracle – должен быть владельцем последовательности или иметь системные права DROP ANY SEQUENCE
- PostgreSQL – должен быть владельцем последовательности
- SAP HANA – должен быть пользователем standard
- SQL Server – права ALTER OR CONTROL для схемы той базы данных, где хранится последовательность
Имя последовательности баз данных, которую вы собираетесь удалить. После удаления последовательность нельзя использовать для создания идентификаторов последовательности путем вызова ее из существующих пользовательских приложений или выражений.
Производные выходные данные
Обновленная входная рабочая область.
Пример кода
Пример DeleteDatabaseSequence (окно Python)
Удаляет последовательность баз данных custom_sequence из многопользовательской базы геоданных.
import arcpy arcpy.DeleteDatabaseSequence_management(r"C:/myconnections/mygdb.sde", "custom_sequence")
Пример DeleteDatabaseSequence (окно Python)
Удаляет последовательность my_ids из файловой базы геоданных myfilegdb.
import arcpy arcpy.DeleteDatabaseSequence_management(r"C:/geodatabases/myfilegdb.gdb", "my_ids")
