• Как выбрать незанятый remote port для «ssh -R»

    vip_delete
    @vip_delete Автор вопроса
    Аналог общей задачи: программно в несколько потоков подключаться к различным FTP серверам (которые могут не поддерживать пассивный режим) через промежуточный SSH-сервер.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    По регламенту раз в месяц, но на многих инсталляциях. Пользователи сильно жалуются, что операция выполняется слишком долго и им приходится постоянно ждать по 30 минут (в реале задача немного сложнее описанной). Сейчас все будет проиходить за 8 минут максимум при первом импорте и за 2-3 минуты при всех последующих обновлениях.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    Взял postgresql. Индексов в таблице на колонке deleted нет. Просмотр 2 млн строк действительно занимает секунды. С update сложнее. Я нашел причину столь долгой работы update-запроса. После каждого update-запроса размер таблицы увеличивается, план запроса сильно ухудшается, время запроса сильно увеличивается. На таблице вначале (после ее оптимизации) update-запрос выполнился за 40сек, потом за 2 минуты, потом за 4.5 минуты, тут еще запускается autovacuum (автоматическая оптимизация таблицы), которая тормозит все запросы к таблице. Все последующие запросы выполнялись за 4.5 минуты, autovacuum работает, видимо.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    Данные в файле чаще всего не изменяются, обычно появляется 1000 новых строк, 1000 строк обновятся, 1000 строк удаляются. В вашем случае каждый раз придется весь файл записывать во временную таблицу, а в моем только те данные, которые реально изменяются (около 3000 строк), на практике это намного быстрее получается.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    поправка: память O(1) будет если не грузить таблицу из файла в память, а отсортировать ее на диске с помощью mergesort. Получается, можно хоть миллиардные таблицы так синхронизировать.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    1. Да, в Arktos варианте с deleted флагом так же можно сделать, согласен. Чую только проблемы со скоростью будут, ведь запрос на проставление всем строкам флага deleted по сути изменит почти все «хорошие» строки в таблице. В варианте с map «хорошие» строки не трогаются и по факту все последующие обновления происходят очень быстро.

    2. С одной temp таблицей тоже отличная идея! Замерю время. Только все последующие обновления будут требовать вставки всех значений из файла во временную таблицу. В варианте с map, вставляются только реально те строки, которые нужно удалить/обновить/добавить.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    Если так сделать, то в бд те, строки которые уже помечены как deleted и не присутствуют в файле, будут помечены как не deleted. Косяк.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    решение должно работать на базах: postgresql, mssql, oracle
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    1. Если грузить по одной строке из файла (или пачкой по K), то как узнать те строки из бд, которые нужно пометить как удаленные?

    2. разброс id очень большой.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    Согласен, можно разбить, на MySql заработает, но нужно, чтобы работало в postgresql, mssql, oracle. В любом случае замерю время, спасибо за идею.

    mysql mydatabase < updates.sql, а это съест, по скромным замерам, 400Mb запрос?
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    Надо будет запомнить такой способ, не знал.

    Проблема в том, что весь запрос в память не поместится.
  • Как синхронизировать большие таблицы?

    vip_delete
    @vip_delete Автор вопроса
    Загрузили одну строчку, провели синхронизацию. Как? Запрос в базу для каждой загруженной из файла строки? Получится 2000000 запросов. Долго.

    С хеш-таблицами сейчас так: грузим весь файл в map. Потом просматриваем таблицу из базы по K элементов (один селект, который грузит в память не всю таблицу, а по K строк). Для каждой строки смотрим в map по id, удаляя из него просмотренный элемент. Если нету, то во временную таблицу temp_delete сбрасываем id строки, если есть и значения в колонках не равны, то строку из map сбрасываем во временную таблицу temp_update. Оставшиеся в map строки — новые, добавляем из во временную таблицу temp_insert. Потом выполняем три запроса:
    1. update mytable set deleted=1 from temp_delete t on t.id=mytable.id
    2. update mytable set a=t.a, b=t.b, c=t.c from temp_update t on t.id=mytable.id
    3. insert into mytable (a,b,c) values (select a,b,c from temp_insert)

    итого: 1 sql запрос к таблице + куча запросов к временным таблицам (но они все типа insert batch, и во временных таблицах нет никаких индексов, кроме pk, поэтому достигается 10000запросов/сек) + 3 последних запроса, которые тоже быстрые, так как индексы в mytable обновляются только 1 раз, по времени уходит где-то 5 минут.