Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Что быстрее будет работать?
|
|||
|---|---|---|---|
|
#18+
По смыслу, что должно быстрее работать: $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 миллиона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 12:42 |
|
||
|
Что быстрее будет работать?
|
|||
|---|---|---|---|
|
#18+
первый конечно... очевидно что в первом случае среднее количество запросов на одну итерацию меньше двух ,а во втором случае равно двум... плюс select count(*) from x where condition по времени почти тожесамое что и select id from x where condition (к сожалению), да и по количиству строк в перле первый случай выигрывает... P.s. вообще полезно иногда самому думать,експерементить.. а потом тока такие вопросы задавать.. есть еще такая штука в посгресе как документации, в которой есть описание и как пользоватся explain и что это такое,даже есть раздел про оптимизацию запросов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 13:22 |
|
||
|
Что быстрее будет работать?
|
|||
|---|---|---|---|
|
#18+
wbearпервый конечно. Я бы так не сказал. В условии задачи не сказано, как соотносится частота update'ов и insert'ов. Если insert, скажем, случается в 99% случаев, то предварительный select повляет на ситуацию благотворно. Ну и, само собой, не нужно делать count(*) - SELECT 1 совместно с LIMIT 1 будет более уместен. Ведь не нужно пересчитывать все строки, а достаточно узнать, есть ли хотя бы одна, удовлетворяющая условию, правда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 13:39 |
|
||
|
Что быстрее будет работать?
|
|||
|---|---|---|---|
|
#18+
Эх, как всё просто-то оказывается... Если это настолько очевидно, наверное где-то описано в документации? Где? Или тобой уже когда-то был проведён такой эксперимент? Каков был объём данных? Не поделишься результатами? При чём тут explain с оптимизацией запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 14:10 |
|
||
|
Что быстрее будет работать?
|
|||
|---|---|---|---|
|
#18+
ilejn опередил, пока я писал. Спасибо, про то, в общем и вопрос был. Пока данных не очень много, это мало волнует. Да и соотношение 10\1 может со временем поменяться. count(*) конечно писать не нужно, это я так, для примера взял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 14:14 |
|
||
|
Что быстрее будет работать?
|
|||
|---|---|---|---|
|
#18+
ввilejn опередил, пока я писал. Спасибо, про то, в общем и вопрос был. Пока данных не очень много, это мало волнует. Да и соотношение 10\1 может со временем поменяться. count(*) конечно писать не нужно, это я так, для примера взял. wbear прав. Придраться можно только к слову "конечно". А вот постановка задачи не очень хороша. Cоотношение 10/1 между чем и чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 15:02 |
|
||
|
Что быстрее будет работать?
|
|||
|---|---|---|---|
|
#18+
ilejnCоотношение 10/1 между чем и чем? ввОтношение новых записей к существующим примерно 10\1 То есть тех, которые будут insert к тем, которые update. Я это написал с учётом регулярно повторяющихся в этом форуме вопросов, типа "Тормозит update, жутко тормозит insert, что делать?" Прав, неправ... Я потому и спросил, что для меня это не совсем очевидно. Вообще, мне тоже кажется что 1-й вариант предпочтительнее, но кто его знает. Мало-ли что... Я даже уверен, что до эксперементов дело-таки дойдёт, когда тормоза начнутся. А насчёт постановки задачи... Если уж на такие вопросы отвечают "полезно иногда самому думать", спрашивать что-то более конкретное не совсем правильно. Зачем людей своими проблемами нагружать? А так, если точно знаешь - скажи, не знаешь - тоже хорошо. Короче, спасибо. Что мне надо было, я узнал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 16:26 |
|
||
|
Что быстрее будет работать?
|
|||
|---|---|---|---|
|
#18+
Я решил проблему по другому, но с предположением, что в течении одного сеанса закачки данных нет повторяющихся по ключу (условие 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. Команду точно не помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 12:07 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33281147&tid=2006993]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 347ms |

| 0 / 0 |
