Что быстрее update или insert oracle

Обновлено: 07.07.2024

1) Delete 1 строка, а потом вставка строки с другими значениями в таблицу.

2) Update той же строки в той же таблице "изменить надо два поля" (два значения)

Буду благодарен если объясните почему то или иное дороже. по слухам update всё равно дороже даже учитывая что в 1 варианте два действия.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

ON DELETE и ON UPDATE
Доброго всем времени суток! При попытке создания таблицы CREATE TABLE ggroups (id varchar(10).

Trigger INSERT, DELETE
Подскажите как в триггере понять на что он сработал на DELETE или INSERT? Чтоб можно сделать.

Запросы с INSERT, UPDATE, DELETE
Помогите пожалуйста составить запросы на команды с INSERT, UPDATE, DELETE Таблица 1 - Predlozhenie.

UPDATE vs DELETE & INSERT
Есть таблица с несколькими полями, без первичного ключа. По ходу задачи необходимо обновлять.

Это только слухи. В нормальной ситуации используется UPDATE, связка DELETE / INSERT только в особых случаях, определяемых бизнес-условиями.
По поводу почему - это надо много объяснять про архитектуру Oracle, лучше самому почитать том доки "Concepts"
Например, и DELETE, и INSERT приводят к корректировке индексов таблицы, тогда как UPDATE - только если затронуты поля, участвующие в индексе, да и в этом случае будет одна корректировка, но не две.
И DELETE, и INSERT требуют возможной корректировки свободного пространства (свободных блоков) таблицы, а UPDATE -нет.
И т.д. Например, и DELETE, и INSERT приводят к корректировке индексов таблицы, тогда как UPDATE - только если затронуты поля, участвующие в индексе, да и в этом случае будет одна корректировка, но не две.
И DELETE, и INSERT требуют возможной корректировки свободного пространства (свободных блоков) таблицы, а UPDATE -нет.

Не много, но за эту инфу спасибо.

Подскажите Update разве не открывает сначала таблицу типа в режиме edit, вносит изменения потом закрывает и ждёт commit?
Тогда как Delete вроде так не делает, но тоже ждёт commit?
Ну и к примеру из разряда может ли так? Если в таблице 2 поля то update быстрее сработает ежели там было бы 150 полей?
Тот же вопрос и к Delete скорей всего удалить 1 строку с 2 полями быстрее чем с 150 полями?

Подскажите Update разве не открывает сначала таблицу типа в режиме edit, вносит изменения потом закрывает и ждёт commit?

И это всё не учитвая индексом, constraint, matview и т.д. что влияет на скорость транзакций.

Что-то не сходится всё свершается после того как commit случился.))
Что значит?

Один раз "всё"? всё - это много? Сколько это действий?

Допустим, что я возьму за чистую монету про "буфере блоков" даже соглашусь с тем что есть undo и redo ведь как-то откат он делает.

То есть получается, что при delete создаются две записи undo и redo и потом при insert ещё две записи undo и redo

Прошу помощи у Оракл-программистов. Ситуация - нужно импортировать данные из внешнего источника в таблицу. Надо сделать insert или update в зависимости от того, имеется ли уже строка с таким же ключом, как у импортируемой или нет. Цель - максимизировать скорость импорта.

Вижу 3 варианта:
1. Сначала всегда делаем insert, если вылетаем с primary key violation - делаем update.
2. Сначала всегда делаем update, проверяем, обновилось ли что-нибудь (переменная SQL_FOUND), если ничего - делаем insert.
3. Пытаемся найти существующую строку select-ом, в зависимости от результата делаем insert или update.

Сейчас реализован вариант 2. Но может 1 или 3-й лучше по скорости? Или есть еще какие-нибудь варианты?

CTAC_P Уже с Приветом Posts: 6789 Joined: Fri Jun 01, 2001 1:01 am

Post by CTAC_P » Wed Jul 16, 2003 1:59 pm


4. Затолкать все не глядя в неиндексированую таблицу, а потом сделать select distinct.
Быстрее это или нет - не знаю. tengiz Уже с Приветом Posts: 4468 Joined: Thu Sep 21, 2000 1:01 am Location: Sammamish, WA

Post by tengiz » Wed Jul 16, 2003 2:17 pm

Post by oMoses » Wed Jul 16, 2003 2:18 pm

[b]"Счастье для всех, даром, и пусть никто не уйдет обиженный!"[/b]
[i]А. и Б. Стругацкие, "Пикник на обочине"[/i]

Post by oMoses » Wed Jul 16, 2003 2:19 pm

[b]"Счастье для всех, даром, и пусть никто не уйдет обиженный!"[/b]
[i]А. и Б. Стругацкие, "Пикник на обочине"[/i] Evgen Уже с Приветом Posts: 1219 Joined: Tue Sep 07, 1999 1:01 am Location: Belmont, Ca

Post by Evgen » Wed Jul 16, 2003 4:48 pm

Еще можно создать вьюху на таблице и посадить на нее Instead of insert trigger
exception -> update.
снаружи просто инсерт во вьев tengiz Уже с Приветом Posts: 4468 Joined: Thu Sep 21, 2000 1:01 am Location: Sammamish, WA

Post by tengiz » Wed Jul 16, 2003 5:02 pm

FatCat Уже с Приветом Posts: 3153 Joined: Tue Sep 05, 2000 1:01 am Location: RU -> NJ -> MA -> NY

Post by FatCat » Wed Jul 16, 2003 5:02 pm

sp123 Уже с Приветом Posts: 1959 Joined: Sat Feb 24, 2001 1:01 am Location: Челябинск -> Everett, WA

Post by sp123 » Wed Jul 16, 2003 6:08 pm

Насчет merge сильно рекомендую поискать список багов. Фича свежая и выглядит красиво, но баги там есть достоверно. Какие точно - прямо сейчас сказать не готов, т.к. не пользовался и сходу не нашел, врать не хочу, а тот, кто наступил на граблю, до конца недели в отъезде.

Способы 1 и 2 использую оба, по настроению . 2-й способ имхо лучше, т.к. гарантировнно безгеморройный. Constraint сегодня есть, а завтра его кто-то по ошибке похерил. Виноватого потом найдут, а разбираться с дубликатами потом все равно вам .

Кола Бельды Уже с Приветом Posts: 503 Joined: Wed Jul 09, 2003 5:47 pm

Post by Кола Бельды » Wed Jul 16, 2003 10:12 pm

замечательная тема для интервью по ораклу 9.

будет дополнением к моему любимому вопросу про insert for update и stored proc возвращающий resultset

RGoo Уже с Приветом Posts: 1917 Joined: Tue Jul 08, 2003 9:42 am Location: Canada

Post by RGoo » Thu Jul 17, 2003 7:00 am

Yuri_p33 wrote: Надо сделать insert или update в зависимости от того, имеется ли уже строка с таким же ключом, как у импортируемой или нет.
.
Вижу 3 варианта:
1. Сначала всегда делаем insert, если вылетаем с primary key violation - делаем update.
2. Сначала всегда делаем update, проверяем, обновилось ли что-нибудь (переменная SQL_FOUND), если ничего - делаем insert.
3. Пытаемся найти существующую строку select-ом, в зависимости от результата делаем insert или update.

Сейчас реализован вариант 2. Но может 1 или 3-й лучше по скорости? Или есть еще какие-нибудь варианты?

А самый простой вариант, без primary key violation и SQL_FOUND ? См.(индексов я не делал) :

CREATE TABLE a (a1 NUMBER,a2 CHAR(2));
CREATE TABLE B (b1 NUMBER,b2 CHAR(2));

INSERT INTO a VALUES (1,'a1');
INSERT INTO a VALUES (3,'a2');
INSERT INTO B VALUES (1,'b1');
INSERT INTO B VALUES (2,'b2');

UPDATE B SET b2 = (SELECT a2 FROM a WHERE a.a1 IN (SELECT b1 FROM B));

INSERT INTO B (b1,b2)
SELECT a1,a2
FROM a
WHERE a.a1 NOT IN (SELECT b1 FROM B);

- или это слишком долго в вашей ситуации ??
(я не знаю, может у вас там сотни миллионов записей импортируются)

Репутация: 1
Всего: 6

Сабж.Что быстрее-вставлять данные в новую таблицу или изменять их в старой?(При условии что изменяется все/не все)
Чтобы не создавать новую тему,тут же задам несколько похожий вопрос:Что быстрее:Next или MoveBy(1)?

TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии

Репутация: 3
Всего: 252

INSERT
1.Новую табицу создаёшь
2. Убиваешь старую
3. Присваиваешь новой таблице имя старой (прога же по имени к таблице обращается).

UPDATE
1. Изменяешь записи в старой таблице.

Репутация: 1
Всего: 6

новая таблица уже создана.Убивать старую не надо.Так что только запись,в том то и вопрос.Что быстрее-запись или изменение?
TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии

Репутация: нет
Всего: 171


Зависит от многих факторов: базы данных, наличия индексов. К примеру SQL Server может update превратить в последовательность операций - delete/insert.
Индекс соответственно тоже обновляется, при инсерте добавляется новая запись, при апдейте - запись может переместиться вообще не другую страницу.
Влияет также наличие триггера (на инсерте есть, на апдейте нет например), выполняется ли запрос в транзакции.

Репутация: нет
Всего: 2

Вообще, это смотря что за задачу ты хочешь решить. если можно обойтись без создания временной таблицы, то мне кажется лучше просто сделать Update

Репутация: 1
Всего: 6

Разные,согласен,я говорю про их производительность при выполнении одной операции.Я же могу просто обновить(заменить) запись в существующей таблице.Или могу занести новые данные в существующую пустую таблицу.
Чтобы заменить в первом случае пишу
UPDATE T SET a=:a.

Во втором-
INSERT INTO T1(b) VALUE (:b).

Кол-во строк в заполненной таблице-больше 500 тысяч.Индексов нет.

TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии

Репутация: нет
Всего: 2

Попробуй сам выполнить пару запросов к своей базе сделать одинаковых, но один с update, а другой с insert into и посмотри где быстрее выполняется. тебе видно будет разницу

Репутация: 1
Всего: 6

TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)

FAQ раздела лежит здесь!

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

[ Время генерации скрипта: 0.1099 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Немного теории. В операционных системах UNIX существует раздел файловой системы, который физически находится в оперативной памяти, но позволяет работать с ним как с обычным дисковым накопителем. Скорость доступа к блоку жесткого диска приблизительно равна 1 мс. Скорость доступа к памяти — 0.001 мс. Попробуем применить это к БД MySQL, чтобы выжать максимум из операций insert/update.

Сперва проверим скорость случайной записи на жесткий диск:


Теперь то же самое для shared memory (/run/shm или /dev/shm):


Сравним результаты и увидим, что время создания 1000 файлов уменьшилось в 574 раза. Хорошо. Значит, следует ожидать прирост скорости записи в БД.

1) Проверяем размер и свободное место для /run/shm

2) Проверяем сколько места занимает БД

Значит, что базу мы можем перенести в /run/shm

3) Останавливаем MySQL:

4) Создаем директории и копируем данные:

5) Правим конфиг:

6) Правим AppArmor:

7) Запускаем MySQL

* Если сервис не стартует — смотрим /var/log/mysql/error.log

Теперь самое интересное. Проверяем, что получилось.

Тест на жестком диске я провел заранее, поэтому сразу привожу результаты.


Update выполнялся по случайному интервалу [1 000 000 — 9 000 000] для первичного ключа (id). Крайние значения отброшены, чтобы движок «копался» внутри таблицы.

Существенный прирост скорости на INSERT и еще больший на UPDATE.
Меньше для вставки, т.к. MySQL производит пересчет индексов и организацию данных.

В настройках MySQL выставлено:
innodb_buffer_pool_size = 1024M
Если ставить меньше, то скорость UPDATE для HDD естественно падает.

innodb_flush_log_at_trx_commit = 2
Как таковых транзакций здесь у нас нет и на скорость это не влияет. Тем не менее, оставляем это значение равным 2.

При такой схеме критически важно писать бинарный лог и регулярно делать бэкап. Максимально снизить издержки записи мы можем только указав для бинарника отдельный жесткий диск. Последовательная скорость записи на винчестер намного выше случайной. Поэтому ставим в систему дополнительный жесткий диск, монтируем его, например, в /mnt/hddbin/, и указываем в my.ini путь для бинарного лога: log_bin = /mnt/hddbin/mysql-bin.log

Не забываем добавить скрипты для перезагрузки и останова системы. Смотрим папку /etc/rc*. Обычно это 0 (отключение системы) и 6 (перезагрузка). Мануал, как добавить скрипты легко найти в гугле. Скрипт перед перезагрузкой или выключением системы останавливает MySQL, затем копирует папку /run/shm/mysql-lib на жесткий диск. При включении системы скрипт восстанавливает данные с жесткого диска в папку /run/shm/mysql-lib и после запускает MySQL.

Так же добавляем простенький bash или perl скрипт для мониторинга свободной памяти в /run/shm. Можно подключить Zabbix.

Читайте также: