<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891682</guid>
        <pubDate>Wed, 07 Jun 2023 14:48:58 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891682</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=435069&view=findpost&p=3891670'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2023-06-07T14:11:52+03:00">07.06.23, 11:11</time></span><div class='quote '>В любом случае процесс уже запущен - жди... если его оборвать, фиг знает что получится на выходе. Но что ничего хорошего - сто пудов.</div></div><br>
Обрывал. Таблица оставалась неизменной. Видимо какие-то внутренние транзакции откатывали по обрыву сессии. Попробовал дропнуть не из GUI-клиента, а из командной строки. И о чудо&#33;&#33;&#33;<br>
<br>
<img class='tag-img' src='https://s1.hostingkartinok.com/uploads/images/2023/06/21c4ba99e98074f9739d42745b8fd7b5.jpg' alt='user posted image'><br>
<br>
Потом заказчик написал в свою техподдержку и все исправилось  :lol: и <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">DROP TABLR tablename</span></span> и <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">TRUNCATE TABLE tablename</span></span> с таблицей с 1 600 000+ записями отрабатывают за секунду. Чудеса  :-? <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=435069&view=findpost&p=3891670'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2023-06-07T11:11:52+00:00">07.06.23, 11:11</time></span><div class='quote '>Ну-ну... дать бы по башке за подобные советы.</div></div><br>
 :yes:]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891670</guid>
        <pubDate>Wed, 07 Jun 2023 11:11:52 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891670</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=435069&view=findpost&p=3891645'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-06-06T19:27:53+00:00">06.06.23, 19:27</time></span><div class='quote '>можно ли как-то ускорить DROP TABLE table_name?</div></div><br>
Формально это весьма быстрая операция. Затормозить её, тем более на 20 минут, могут разве что эффекты блокирования параллельными транзакциями, да и то вряд ли настолько долго.<br>
<br>
В любом случае процесс уже запущен - жди... если его оборвать, фиг знает что получится на выходе. Но что ничего хорошего - сто пудов.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=435069&view=findpost&p=3891645'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-06-06T19:27:53+00:00">06.06.23, 19:27</time></span><div class='quote '>В сети присоветовали выполнить заранее <span class="tag-color tag-color-named" data-value="blue" style="color: blue">SET foreign_key_checks = 0;</span></div></div><br>
Ну-ну... дать бы по башке за подобные советы. Такие вещи можно делать лишь точно зная, что ты делаешь и почему, и имея гарантии, что нигде от этого не возникнет проблем.<br>
<br>
Этот запрос отключает контроль внешних ключей, причём глобально, на всём сервере, на всех базах и таблицах. Так что поиметь себе проблем - как два пальца. Ибо при обратном включении корректность внешних ключей НЕ ПРОВЕРЯЕТСЯ. Соответственно если в таблицу попали записи, которые нарушают целостность данных, это НЕ БУДЕТ ОБНАРУЖЕНО. До тех пор, пока отсутствие связанной записи где-нибудь не аукнется ошибкой, или заведомо неверным результатом, который просто невозможно будет проигнорировать.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891645</guid>
        <pubDate>Tue, 06 Jun 2023 19:27:53 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891645</link>
        <description><![CDATA[Majestio: Попутный вопрос: можно ли как-то ускорить <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">DROP TABLE table_name</span></span>? В таблице 388 000 записей, в записи одно поле INT (11), индекс BTREE по этому полю. Как-то я с такой ситуацией не сталкивался ... запустил запрос, он вот выполняется уже 1245 сек, когда закончится - я не знаю, конечно дождусь. Но это какая-то засада  :wall:  В сети присоветовали выполнить заранее <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">SET foreign_key_checks = 0;</span></span>, но от этого не легче.]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891064</guid>
        <pubDate>Thu, 25 May 2023 15:04:50 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891064</link>
        <description><![CDATA[Majestio: Спасибо, буду разбираться. Триггеры - интересно. Возможно и временных таблиц не понадобится тогда.]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891054</guid>
        <pubDate>Thu, 25 May 2023 10:26:07 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891054</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=435069&view=findpost&p=3891021'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-05-24T06:00:57+00:00">24.05.23, 06:00</time></span><div class='quote '>Заказчик требует детальных логов на каждую сессию. Что вставлено, что изменено, что удалено.</div></div><br>
Непонятно, на каком уровне нужно логирование. Таблиц на уровне SQL-сервера? или объектов на уровне приложения?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=435069&view=findpost&p=3891021'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-05-24T06:00:57+00:00">24.05.23, 06:00</time></span><div class='quote '>С &quot;пакетными&quot; изменениями напрямую я это не могу получить, верно?</div></div><br>
Если  речь о логировании уровня таблиц, причём логировать надо только фактические изменения - то не вижу проблемы от слова &quot;совсем&quot;. <br>
<br>
На каждую таблицу вешаем пакет триггеров, который будет копировать в таблицу логов дату-время, пользователя и внесённые изменения. Это прекрасно работает и с пакетными изменениями - серверу для запуска триггера пофиг, откуда прилетело изменение. Исключение - операции по атрибутам внешних ключей (ON DELETE/UPDATE), они не вызывают срабатывания триггеров в каскадно изменяемых таблицах.<br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=435069&view=findpost&p=3891021'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-05-24T06:00:57+00:00">24.05.23, 06:00</time></span><div class='quote '>Делаю &quot;снимок&quot; таблицы во временную по полям point_id и not_fount. Выполняю преобразования по твоему совету выше. Потом сравниваю временную таблицу и реальную и нахожу изменения для логов.</div></div><br>
Вот тебе делать нечего... есть же версионка. <a class='tag-url' href='https://mariadb.com/kb/en/temporal-tables/' target='_blank'>Temporal Tables</a>+]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891021</guid>
        <pubDate>Wed, 24 May 2023 06:00:57 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891021</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Akina</strong>, нужен еще твой совет.<br>
<br>
Вот какая ситуация. Заказчик требует детальных логов на каждую сессию. Что вставлено, что изменено, что удалено. С &quot;пакетными&quot; изменениями напрямую я это не могу получить, верно? Пока на ум взбрело два подхода:<br>
<br>
<ol class="tag-list" type="1"><li>Делаю &quot;снимок&quot; таблицы во временную по полям point_id и not_fount. Выполняю преобразования по твоему совету выше. Потом сравниваю временную таблицу и реальную и нахожу изменения для логов.</li><li>Вытаскиваю в память всю таблицу (только поля point_id и not_fount). По ним уже формирую INSERT без IGNORE в памяти порциями, ну и UPDATE как-нибудь, либо порциями, либо формированием временной таблицы и запросом. Ну а логи сразу формируются по результатам сравнений.</li></ol><br>
<strong class='tag-b'>Детали</strong><br>
<br>
Таблица в БД больше чем 2 500 000 записей не планируется расширятся, заказчик мамой клянется<br>
Движок БД, уточнил - MariaDB v.10.4.25<br>
Доступ к БД будет гарантировано монопольный<br>
<br>
Какие соображения? :-?]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891016</guid>
        <pubDate>Tue, 23 May 2023 16:34:45 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891016</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Akina</strong>, благодарю&#33;&#33;&#33; Ты как всегда даешь супер ответы  :good:]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891015</guid>
        <pubDate>Tue, 23 May 2023 16:29:36 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891015</link>
        <description><![CDATA[Akina: WHERE IN и WHERE NOT IN - это самый медленный вариант связывания/антисвязывания. Тут разве что умный сервер сообразитЮ что по сути перед ним тупой JOIN.<br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=435069&view=findpost&p=3891014'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-05-23T16:10:56+00:00">23.05.23, 16:10</time></span><div class='quote '>Какие варианты? Может как-то со временными таблицами поиграться? </div></div><br>
Зависит от СУБД. И даже от точной версии. Ну и от статистики данных.<br>
<br>
Например, первая задача в MySQL прекрасно решается вульгарным INSERT IGNORE. Вторая же лучше всего сработает через индексированную временную таблицу и, в зависимости от количества записей в основной таблице, либо LEFT JOIN WHERE IS NULL, либо WHERE NOT EXISTS.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891014</guid>
        <pubDate>Tue, 23 May 2023 16:10:56 +0000</pubDate>
        <title>Несколько вопросов по вопросу работы с большими данными</title>
        <link>https://forum.sources.ru/index.php?showtopic=435069&amp;view=findpost&amp;p=3891014</link>
        <description><![CDATA[Majestio: Всем привет&#33;<br><br>Собственно, возникли вопросы по оптимизации. Ибо делать поэлементно - не наш метод...<br><br>Исходные данные:<br><br>* Есть таблица в БД пусть `table`, в ней есть в записях поле biginteger `point_id` уникальное, и поле `not_found`. Остальные поля не важны.<br>* В памяти висит список порядка из 500 000 номеров (а точнее записей, в которых есть номер).<br><br>Нужно организовать две операции:<br><br>1) В таблицу `table` добавить все записи из списка в памяти, но только тех, которых еще там нет - по полю `point_id`<br>2) В таблице `table` изменить поле `not_found` на 1 во всех записях, которые отсутствуют в списке висящем в памяти, по полю `point_id`<br><br>Смущает количество 500 000. Были бы десятки или сотни, можно было бы как-то поиграться с IN, NOT IN.<br><br>Какие варианты? Может как-то со временными таблицами поиграться?  :-?]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      </channel>
      </rss>
	