powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Что быстрее будет работать?
8 сообщений из 8, страница 1 из 1
Что быстрее будет работать?
    #33280950
ВВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По смыслу, что должно быстрее работать:

$fetched = $dbh->do("update table1 ...where ...");
if (!defined($fetched)){
$dbh->do("insert into table1 ...");
}

или тоже самое, но через
select count(*) ... where...
если что-то есть - update, нет - insert?

Отношение новых записей к существующим примерно 10\1.
Вставка 500-1000 записей в таблицу 1-3 миллиона.
...
Рейтинг: 0 / 0
Что быстрее будет работать?
    #33281083
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первый конечно... очевидно что в первом случае среднее количество запросов на одну итерацию меньше двух ,а во втором случае равно двум... плюс select count(*) from x where condition по времени почти тожесамое что и select id from x where condition (к сожалению), да и по количиству строк в перле первый случай выигрывает...

P.s. вообще полезно иногда самому думать,експерементить.. а потом тока такие вопросы задавать.. есть еще такая штука в посгресе как документации, в которой есть описание и как пользоватся explain и что это такое,даже есть раздел про оптимизацию запросов...
...
Рейтинг: 0 / 0
Что быстрее будет работать?
    #33281147
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wbearпервый конечно.

Я бы так не сказал.

В условии задачи не сказано, как соотносится частота update'ов и insert'ов. Если insert, скажем, случается в 99% случаев, то предварительный select повляет на ситуацию благотворно.

Ну и, само собой, не нужно делать count(*) - SELECT 1 совместно с LIMIT 1 будет более уместен. Ведь не нужно пересчитывать все строки, а достаточно узнать, есть ли хотя бы одна, удовлетворяющая условию, правда?
...
Рейтинг: 0 / 0
Что быстрее будет работать?
    #33281262
ВВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, как всё просто-то оказывается...

Если это настолько очевидно, наверное где-то описано в документации? Где?
Или тобой уже когда-то был проведён такой эксперимент? Каков был объём данных? Не поделишься результатами?

При чём тут explain с оптимизацией запросов?
...
Рейтинг: 0 / 0
Что быстрее будет работать?
    #33281270
ВВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejn опередил, пока я писал. Спасибо, про то, в общем и вопрос был.
Пока данных не очень много, это мало волнует. Да и соотношение 10\1 может со временем поменяться.
count(*) конечно писать не нужно, это я так, для примера взял.
...
Рейтинг: 0 / 0
Что быстрее будет работать?
    #33281453
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ввilejn опередил, пока я писал. Спасибо, про то, в общем и вопрос был.
Пока данных не очень много, это мало волнует. Да и соотношение 10\1 может со временем поменяться.
count(*) конечно писать не нужно, это я так, для примера взял.

wbear прав. Придраться можно только к слову "конечно". А вот постановка задачи не очень хороша. Cоотношение 10/1 между чем и чем?
...
Рейтинг: 0 / 0
Что быстрее будет работать?
    #33281881
ВВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejnCоотношение 10/1 между чем и чем?

ввОтношение новых записей к существующим примерно 10\1
То есть тех, которые будут insert к тем, которые update.
Я это написал с учётом регулярно повторяющихся в этом форуме вопросов, типа "Тормозит update, жутко тормозит insert, что делать?"

Прав, неправ... Я потому и спросил, что для меня это не совсем очевидно. Вообще, мне тоже кажется что 1-й вариант предпочтительнее, но кто его знает. Мало-ли что... Я даже уверен, что до эксперементов дело-таки дойдёт, когда тормоза начнутся.

А насчёт постановки задачи... Если уж на такие вопросы отвечают "полезно иногда самому думать", спрашивать что-то более конкретное не совсем правильно. Зачем людей своими проблемами нагружать? А так, если точно знаешь - скажи, не знаешь - тоже хорошо.

Короче, спасибо. Что мне надо было, я узнал
...
Рейтинг: 0 / 0
Что быстрее будет работать?
    #33283240
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я решил проблему по другому, но с предположением, что в течении одного
сеанса закачки данных нет повторяющихся по ключу (условие where в update и select).
Заводим таблицу-кэш - копия первой + 2 поля - id сеанса и наличие.

id сеанса нужно для разделения данных из разных сеансов закачки, если вдруг
в предыдущем произошел сбои и кеш-таблица не очистилась. Теоретически он не нужен.

Процесс:
закачиваем данные в кеш - все инсертами. Таблица небольшая, так что все шустро.
Повторяющихся данных нет - и нам не надо делать проверки. В принципе и индексы можно
делать не unique (да и нужно) - скорость увеличится.
Делаем
update "кеш-таблица" set наличие=True from "наша-таблица" where <измененное под
join таблиц условие поиска> and id-сеанса=<текущее id>
update "наша-таблица" set <присваиваем нужным полям значения из кеша> from "кеш-таблица"
where "кеш-таблица"."наличие"=True and <измененное под join таблиц условие поиска> and
and id-сеанса=<текущее id>
insert into "наша-таблица" select <поля без id сеанса и наличие в нужном порядке>
from "кеш-таблица" where "кеш-таблица"."наличие"=False and id-сеанса=<текущее id>

Таким образом, много INSERT-ов идет на маленькую таблицу (которую можно/нужно часто вакуумить). На таблицу с 2-3 миллионами запись у нас три запроса: один на селект (в апдейте кеша),
один на апдейт и один на инсерт.
Примечание: если сохраняешь план запроса (а это происходит в функции на plpgsql при первом
запуске и на все последующие), то лучше, если в большой таюлице есть данные; планы,
созданные для пустой таблицы быстро становятся не оптимальными.
Как вариант - после первой вставки перекомпилить функцию plpgsql. Команду точно не помню.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Что быстрее будет работать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]