<?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=408634&amp;view=findpost&amp;p=3666873</guid>
        <pubDate>Wed, 20 Apr 2016 14:20:51 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666873</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666859'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T15:50:33+03:00">20.04.16, 12:50</time></span><div class='quote '>се же писать софт правильно более бюджетное решение ;)</div></div><br>
<br>
Ну таки да :)]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666859</guid>
        <pubDate>Wed, 20 Apr 2016 12:50:33 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666859</link>
        <description><![CDATA[Павел Калугин: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666845'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T11:59:59+00:00">20.04.16, 11:59</time></span><div class='quote '>или уменьшать поступающую инфу, либо строить/расширять кластер. ИМХО, если сервак работает более чем на 50% загрузки - это уже &quot;звонок&quot; о том, что не все так хорошо в датском королевстве.</div></div><br>
Все же писать софт правильно более бюджетное решение ;)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666845</guid>
        <pubDate>Wed, 20 Apr 2016 11:59:59 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666845</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666841'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T11:48:22+00:00">20.04.16, 11:48</time></span><div class='quote '>нет вопрос как раз про потери потому что ыйд сервер не способен принят такое количество запросов. с инсертами в одни и те же таблицы и параллельным поиском по ним</div></div><br>
<br>
Это вопрос из разряда &quot;как записать, если стоит защита от записи&quot;  :lol: Ну если сервак не тянет физически поступаемый объем инфы, или уменьшать поступающую инфу, либо строить/расширять кластер. ИМХО, если сервак работает более чем на 50% загрузки - это уже &quot;звонок&quot; о том, что не все так хорошо в датском королевстве.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666841</guid>
        <pubDate>Wed, 20 Apr 2016 11:48:22 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666841</link>
        <description><![CDATA[Павел Калугин: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666831'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T11:01:36+00:00">20.04.16, 11:01</time></span><div class='quote '>По поводу возможных потерь ... ну если система кривая по настройке и по энергообеспечению. Но это другая композиция из другой оперы.</div></div><br>
нет вопрос как раз про потери потому что ыйд сервер не способен принят такое количество запросов. с инсертами в одни и те же таблицы и параллельным поиском по ним ;)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666832</guid>
        <pubDate>Wed, 20 Apr 2016 11:06:28 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666832</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666831'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T11:01:36+00:00">20.04.16, 11:01</time></span><div class='quote '>Осталось только научить syslogd сбрасывать не в системный журнал (как правило это /var/log/messages) или выделенные лог-файлы, а завернуть это пакетными запросами к серверу БД.</div></div><br>
&quot;<a class='tag-url' href='http://www.balabit.com/network-security/syslog-ng/opensource-logging-system/features/comparison' target='_blank'>syslog vs syslog-ng</a>&quot; - походу все уже есть  :lol:]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666831</guid>
        <pubDate>Wed, 20 Apr 2016 11:01:36 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666831</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666826'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T10:53:45+00:00">20.04.16, 10:53</time></span><div class='quote '>Есть вэбсервер Он , обычно, пишет текстовый лог. посещений</div></div><br>
В случае вебсервера - уже есть возможность &quot;не писать лог&quot;, а скормить его syslogd, а там хоть трава не расти. В свою очередь, syslogd - асинхронен по сути (сбрасывает кэш по своим правилам). Осталось только научить syslogd сбрасывать не в системный журнал (как правило это /var/log/messages) или выделенные лог-файлы, а завернуть это пакетными запросами к серверу БД. Тормозов как раз тут - по самому минимуму, ибо все происходит асинхронно.<br>
<br>
По поводу возможных потерь ... ну если система кривая по настройке и по энергообеспечению. Но это другая композиция из другой оперы.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666826</guid>
        <pubDate>Wed, 20 Apr 2016 10:53:45 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666826</link>
        <description><![CDATA[Павел Калугин: <strong class='tag-b'>JoeUser</strong> и ? топикстартеру от этого уже все ясно эт раз<br>
что у нас вообще по физике происходит.<br>
Есть вэбсервер Он , обычно, пишет текстовый лог. посещений<br>
Если мне не изменяет память, можно перенаправить эту запись в биде.<br>
Или надо вклиниваться в  каждую страницу с кодом который &quot;отгрузит лог&quot;. <br>
Или увы, по расписанию брать серверный лог и пакетом его грузить. <br>
что дальше? <br>
Если грузим пакетами нам насрать. Може м и разобрать можем и ....<br>
Если вклиниваемся в работу вэбсервера любой затык на отгрузке лога будет тормозить сервак при синхронном соединении или приведет к потерям данных при асинхронном<br>
Тут нужен анализ что нам дороже. Возможно потеря 10-15 данных на результате анализа и не скажется а возможно нужно все &quot;до копейки&quot;.<br>
Если вклиниватся в работу страничек - практически тоже что и с вэбсервером. Или загрузка страницы увеличивается на ожидание отклика или есть риск потерь данных<br>
Вот как бы и все  ;) <br>
Где тут найден &quot;клиент&quot; и тем более &quot;тонкий клиент&quot; не понимаю.<br>
Лайт, не лайт тоже не понятно. <br>
<br>
Но то что любая обработка затормозит вставку эт факт. На сколько - померяем хохмы для. <br>
К чему ведут &quot;тормоза&quot; при вставке лога - выше указал <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-04-20T10:54:51+00:00">20.04.16, 10:54</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666822'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T10:33:39+00:00">20.04.16, 10:33</time></span><div class='quote '>Для чудес по скоростям достаточно создать таблицу для первичного приёма логов на MEMORY-движке, и пачками переливать из неё поступившие сведения в основную таблицу.</div></div><br>
ну или так.. А на обработке &quot;пачки&quot; скорость уже не настолько критична.  ;)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666824</guid>
        <pubDate>Wed, 20 Apr 2016 10:42:36 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666824</link>
        <description><![CDATA[JoeUser: Меня тут &quot;осенило&quot; ... сборку логов пакетами можно осуществлять уже имеющимися средствами &quot;а-ля тонких клиентов&quot;. Нужно всего лишь скрестить &quot;<a class='tag-url' href='http://ru.wikipedia.org/wiki/Syslog' target='_blank'>syslog</a>&quot; или какой-нить его форк типа &quot;<a class='tag-url' href='http://www.balabit.com/ru/network-security/syslog-ng' target='_blank'>syslog-ng</a>&quot; с существующим сервером БД. Тогда первичные запросы на запись логов будет принимать не сам сервак БД, а посредник (syslog*). Времени пока особо нет, так поверхностное гугление дало два интересных линка &quot;<a class='tag-url' href='http://www.kiwisyslog.com/' target='_blank'>kiwisyslog</a>&quot; и &quot;<a class='tag-url' href='http://www.rsyslog.com/doc/v8-stable/tutorials/database.html' target='_blank'>Writing syslog messages to MySQL, PostgreSQL or any other supported Database</a>&quot; ... походу мы упорно изобретаем велосипед из дерева  :lol: <br>
<br>
Пакетные вставки действительно должны дать ощутимый прирост скорости. <br>
А &quot;лайт-нормализацию&quot; можно делать и на тонком клиенте, там же формировать и пачки для записи. <br>
<br>
Такие дела.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666822</guid>
        <pubDate>Wed, 20 Apr 2016 10:33:39 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666822</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666819'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T10:18:07+00:00">20.04.16, 10:18</time></span><div class='quote '>Есть предположение что, если грамотно реализовать сборку единичных логов в &quot;пакеты&quot;, то можно будет выжимать чудеса по скоростям</div></div><br>
Для чудес по скоростям достаточно создать таблицу для первичного приёма логов на MEMORY-движке, и пачками переливать из неё поступившие сведения в основную таблицу.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666821</guid>
        <pubDate>Wed, 20 Apr 2016 10:31:07 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666821</link>
        <description><![CDATA[Павел Калугин: <strong class='tag-b'>JoeUser</strong>Ну это уже про шаманство на очень высоких нагрузках ;) Ну и вставку пакетами сервак делать умеет ;)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666819</guid>
        <pubDate>Wed, 20 Apr 2016 10:18:07 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666819</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666816'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T09:57:00+00:00">20.04.16, 09:57</time></span><div class='quote '>буду вливать его построчно</div></div><br>
Кстати, <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=397155' target='_blank'>ознакомься с этой темой</a>. <br>
Есть предположение что, если грамотно реализовать сборку единичных логов в &quot;пакеты&quot;, то можно будет выжимать чудеса по скоростям :)]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666816</guid>
        <pubDate>Wed, 20 Apr 2016 09:57:00 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666816</link>
        <description><![CDATA[Павел Калугин: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666813'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T09:33:07+00:00">20.04.16, 09:33</time></span><div class='quote '>Если у тя есть реальный железный сервак БД (выделенный) - имеет смысл заморачиваться, ибо результаты будут более правдивы, чем у меня с ВМ. </div></div><br>
есть, но он стаааренький :) <br>
Примерно как буду делать - возьму живой лог со своих сайтов, догененрю до разумного числа обращений , запихаю в &quot;массив строк&quot; и ... буду вливать его построчно<br>
соответственно с трех - четырех - пяти компуков можно будет прогнать каку. Но тут сразу погрешности будут на &quot;шнурки&quot;.]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666813</guid>
        <pubDate>Wed, 20 Apr 2016 09:33:07 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666813</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666804'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T08:52:17+00:00">20.04.16, 08:52</time></span><div class='quote '>Вот над таким собираюсь на вторые майские посидеть.</div></div><br>
Если у тя есть реальный железный сервак БД (выделенный) - имеет смысл заморачиваться, ибо результаты будут более правдивы, чем у меня с ВМ. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666804'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T08:52:17+00:00">20.04.16, 08:52</time></span><div class='quote '>и не нитей а приложений</div></div><br>
Вот тут не согласен. Для движка БД абсолютно фиолетово от кого ловить соединение. А вот на клиенте накладных расходов (в случае нитей) будет гораздо меньше, что даст большую чистоту теста. Мы же пытаемся имитировать одно соединение с 10..100 компьютеров. Нам накладные расходы по управлению процессами не нужны ни разу. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-04-20T09:42:39+00:00">20.04.16, 09:42</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666804'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T08:52:17+00:00">20.04.16, 08:52</time></span><div class='quote '>- тест 2 выполняется &quot;нормализация&quot; с поиском и вставкой если не нашли</div></div><br>
И тут момент. ИМХО, вставка URL в свой &quot;каталог URLs&quot; нужно делать в момент создания &quot;материала&quot; (будь то статическая страница, будь то динамическая тема форума, к примеру). А именно поиск+вставка прокатит, если мы хотим собрать статистику по ошибочным обращениям.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666804</guid>
        <pubDate>Wed, 20 Apr 2016 08:52:17 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666804</link>
        <description><![CDATA[Павел Калугин: Тест крайне простой<br> - &quot;нагрузка&quot; нужна не с 10 а, хотябы со 100 и не нитей а приложений.<br> - тест 1 выполняется &quot;инсерт&quot; в таблицу<br> - тест 2 выполняется &quot;нормализация&quot; с поиском и вставкой если не нашли<br> - тест 3 выполняется &quot;инсерт&quot; с &quot;подавлением ошибки&quot; и последующим поиском<br><br>Тестовое приложение умеет принять код &quot;теста&quot; 1,2,3, принять параметр &quot;кол-во запущенных&quot;, задержку до начала теста  начать отсчет времени,выполнтить тест, завершить отсчет  положить в лог тест, кол-во запросов, время на исволнение<br>&quot;Пускалка&quot; должна принять номер теста, кол-во &quot;запросов&quot; в тесте, количество стартов, подготовить данные и запустить заданное количество &quot;тестов&quot;<br>Задержка нужна чтобы все тесты стартовали +- одновременно<br><br>Вот над таким собираюсь на вторые майские посидеть. <br>Сейчас времени нет, удочки собираю :)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666793</guid>
        <pubDate>Wed, 20 Apr 2016 07:49:34 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666793</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666790'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T07:36:28+00:00">20.04.16, 07:36</time></span><div class='quote '>но, насколько я понял, ты замеряешь время загрузки большого массива в пустые таблицы.</div></div><br>
Да, сперва чистка, потом вакуум, потом загрузка.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666790'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-20T07:36:28+00:00">20.04.16, 07:36</time></span><div class='quote '>Надо мерить время загрузки сравнительно небольшой порции (скажем, 10 тыс.) в заполненную большим количеством (скажем, 1 млн.) записей структуру.</div></div><br>
Попробую вечером посмотреть че можно сделать. Дело в том, что у меня в виртуальных машинах свободного дискового пространства по минимуму - оттого и не могу грузить много. Надо проинспектировать ) Есть еще 4 VM под управлением разных версий линухов, и одна - под Mac OS X. Может быть там есть место, просто не помню.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666790</guid>
        <pubDate>Wed, 20 Apr 2016 07:36:28 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666790</link>
        <description><![CDATA[Akina: У меня с перлом не сложилось... но, насколько я понял, ты замеряешь время загрузки большого массива в пустые таблицы. Если так - это неверно. Надо мерить время загрузки сравнительно небольшой порции (скажем, 10 тыс.) в заполненную большим количеством (скажем, 1 млн.) записей структуру.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666751</guid>
        <pubDate>Tue, 19 Apr 2016 20:09:09 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666751</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666722'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T14:20:17+00:00">19.04.16, 14:20</time></span><div class='quote '>Такой эксперимент будет хоть как-то адекватен, особенно если сможешь организовать многопоточную вставку. </div></div><br>
Вощем заинтересовался и сделал. Генерируется 10 нитей (threads), каждая нить параллельно пишет лог в БД по 100000 записей. Увы, БД крутится под FreeBSD 9.0, которая запущена под VMWare - отсюда точность хреновенькая. <br>
<br>
Вот код:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#!/usr/bin/perl -w</div><div class="code_line">&nbsp;</div><div class="code_line"># Подключаем библиотеки</div><div class="code_line">&nbsp;</div><div class="code_line">use Time::HiRes qw(gettimeofday);</div><div class="code_line">use threads;</div><div class="code_line">use threads::shared;</div><div class="code_line">use DBI;</div><div class="code_line">&nbsp;</div><div class="code_line"># список создаваемых URL</div><div class="code_line">&nbsp;</div><div class="code_line">@URLs = ();</div><div class="code_line">@Req = ();</div><div class="code_line">&nbsp;</div><div class="code_line"># реквизиты БД</div><div class="code_line">&nbsp;</div><div class="code_line">$DBName &nbsp; = &quot;testo&quot;;</div><div class="code_line">$UserName = &quot;pgsql&quot;;</div><div class="code_line">$DBHost &nbsp; = &quot;192.168.1.47&quot;;</div><div class="code_line">$DBPort &nbsp; = &quot;5432&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line"># счетчики замеров</div><div class="code_line">&nbsp;</div><div class="code_line">$TimeRaw &nbsp;= 0;</div><div class="code_line">$TimeId &nbsp; = 0;</div><div class="code_line">$SizeRaw &nbsp;= 0;</div><div class="code_line">$SizeId &nbsp; = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">###############################################################################</div><div class="code_line">$|++; if ($^O =~ /win/i) { system(&quot;cls&quot;); } else { system(&quot;clear&quot;); }</div><div class="code_line">print &quot;\nПоехали тестировать ============================================\n\n&quot;;</div><div class="code_line">###############################################################################</div><div class="code_line">&nbsp;</div><div class="code_line"># 1.Генерируем 1000 URL&#39;ов произвольной длины в диапазоне 12...255</div><div class="code_line">GenerateUrls(\@URLs);</div><div class="code_line">&nbsp;</div><div class="code_line"># 2.Гененируем таблицу запросов (индексы из @URLs)</div><div class="code_line">GenerateReq(\@Req);</div><div class="code_line">&nbsp;</div><div class="code_line"># 3.Чистим таблицы и записываем &quot;каталог&quot; URLs в БД</div><div class="code_line">PrepareTables(\@URLs);</div><div class="code_line">&nbsp;</div><div class="code_line"># 4.Запускаем 10 потоков за запись &quot;сырых&quot; логов и засекаем время их исполнения</div><div class="code_line">ThreadRawFunc();</div><div class="code_line">&nbsp;</div><div class="code_line"># 5.Вызываем вакуум и вычисляем размер полученной таблицы LogsRaw</div><div class="code_line">$SizeRaw = GatheringStats(&quot;LogsRaw&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line"># 6.Чистим таблицы и записываем &quot;каталог&quot; URLs в БД</div><div class="code_line">PrepareTables(\@URLs);</div><div class="code_line">&nbsp;</div><div class="code_line"># 7.Запускаем 10 потоков за запись &quot;нормализованных&quot; логов</div><div class="code_line">ThreadIdFunc();</div><div class="code_line">&nbsp;</div><div class="code_line"># 8.Вызываем вакуум и вычисляем размер полученной таблицы LogsId</div><div class="code_line">$SizeId = GatheringStats(&quot;LogsId&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line"># 9.Отчет</div><div class="code_line">print &quot;\n Время записи RAW-логов: $TimeRaw сек (полученный размер: $SizeRaw Mb)\n Время записи \&quot;нормализованных\&quot;-логов: $TimeId сек (полученный размер: $SizeId Mb)\n\n&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">###############################################################################</div><div class="code_line">&nbsp;</div><div class="code_line">sub GenerateUrls {</div><div class="code_line">&nbsp;&nbsp;print &quot; * Генерируем URL&#39;ы ... &quot;;</div><div class="code_line">&nbsp;&nbsp;my $Array = shift;</div><div class="code_line">&nbsp;&nbsp;srand();</div><div class="code_line">&nbsp;&nbsp;for my $I (1..1000) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $S = &quot;&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for my $J (0..rand(244)+11) { &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;$S .= chr(ord(&#39;a&#39;)+rand(ord(&#39;z&#39;)-ord(&#39;a&#39;)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;push @{$Array}, $S;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n&quot;;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub GenerateReq {</div><div class="code_line">&nbsp;&nbsp;print &quot; * Генерируем произвольный массив индексов запросов URLs ... &quot;;</div><div class="code_line">&nbsp;&nbsp;my $Array = shift;</div><div class="code_line">&nbsp;&nbsp;srand();</div><div class="code_line">&nbsp;&nbsp;for my $I (1..100000) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;push @{$Array}, int(rand(999));</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n&quot;;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub PrepareTables {</div><div class="code_line">&nbsp;&nbsp;my $Array = shift;</div><div class="code_line">&nbsp;&nbsp;my $Dbh = DBI-&#62;connect(&quot;dbi:Pg:dbname=$DBName;host=$DBHost;port=$DBPort&quot;,&quot;$UserName&quot;,&quot;&quot;,{PrintError =&#62; 0});</div><div class="code_line">&nbsp;&nbsp;die &quot;$DBI::errstr\n&quot; if (defined($DBI::err));</div><div class="code_line">&nbsp;&nbsp;# -- чистим таблицу URL</div><div class="code_line">&nbsp;&nbsp;print &quot;\n * Подготавливаем БД:\n&quot;;</div><div class="code_line">&nbsp;&nbsp;print &quot; &nbsp; - чистим таблицу URLs ... &quot;;</div><div class="code_line">&nbsp;&nbsp;my $query = &quot;DELETE FROM \&quot;URLs\&quot;&quot;;</div><div class="code_line">&nbsp;&nbsp;my $sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;my $rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n&quot;;</div><div class="code_line">&nbsp;&nbsp;# -- чистим таблицу LogsRaw</div><div class="code_line">&nbsp;&nbsp;print &quot; &nbsp; - чистим таблицу LogRaw ... &quot;;</div><div class="code_line">&nbsp;&nbsp;$query = &quot;DELETE FROM \&quot;LogsRaw\&quot;&quot;;</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n&quot;;</div><div class="code_line">&nbsp;&nbsp;# -- чистим таблицу LogsId</div><div class="code_line">&nbsp;&nbsp;print &quot; &nbsp; - чистим таблицу LogId ... &quot;;</div><div class="code_line">&nbsp;&nbsp;$query = &quot;DELETE FROM \&quot;LogsId\&quot;&quot;;</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n&quot;;</div><div class="code_line">&nbsp;&nbsp;# -- сбрасываем счетчики Id таблиц</div><div class="code_line">&nbsp;&nbsp;print &quot; &nbsp; - сбрасываем счетчики Id таблиц ... &quot;;</div><div class="code_line">&nbsp;&nbsp;$query = &quot;ALTER SEQUENCE public.\&quot;URLs_Id_seq\&quot; INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 RESTART 1 CACHE 1 NO CYCLE&quot;;</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;$query = &quot;ALTER SEQUENCE public.\&quot;LogsId_Id_seq\&quot; INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 RESTART 1 CACHE 1 NO CYCLE&quot;;</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;$query = &quot;ALTER SEQUENCE public.\&quot;Logs_Id_seq\&quot; INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 RESTART 1 CACHE 1 NO CYCLE&quot;;</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n&quot;;</div><div class="code_line">&nbsp;&nbsp;# -- вакуум</div><div class="code_line">&nbsp;&nbsp;print &quot; &nbsp; - вакуум + сбор статистики ... &quot;;</div><div class="code_line">&nbsp;&nbsp;$query = &quot;VACUUM FULL ANALYZE&quot;;</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n&quot;;</div><div class="code_line">&nbsp;&nbsp;# -- заполняем таблицу URLs</div><div class="code_line">&nbsp;&nbsp;print &quot; &nbsp; - запоняем таблицу URLs ... &quot;;</div><div class="code_line">&nbsp;&nbsp;$query = &quot;INSERT INTO \&quot;URLs\&quot; (\&quot;URL\&quot;) VALUES &quot;;</div><div class="code_line">&nbsp;&nbsp;for(my $I=0; $I&#60;scalar(@{$Array}); $I++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;$query.=&quot;(&#39;&quot;.${$Array}[$I].&quot;&#39;)&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$query.= &quot;, &quot; if ($I+1&#60;scalar(@{$Array})); &nbsp;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n&quot;;</div><div class="code_line">&nbsp;&nbsp;# -- переиндексируем таблицу URL</div><div class="code_line">&nbsp;&nbsp;print &quot; &nbsp; - переиндексируем таблицу URLs ... &quot;;</div><div class="code_line">&nbsp;&nbsp;$query = &quot;REINDEX TABLE \&quot;URLs\&quot;&quot;;</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;$Dbh-&#62;disconnect();</div><div class="code_line">&nbsp;&nbsp;print &quot;Ок\n &nbsp; - пауза 30 сек ... &quot;;</div><div class="code_line">&nbsp;&nbsp;sleep(30);</div><div class="code_line">&nbsp;&nbsp;print &quot;Ok\n\n&quot;;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub ThreadRawFunc {</div><div class="code_line">&nbsp;&nbsp;print &quot; * Записываем LogsRaw &quot;;</div><div class="code_line">&nbsp;&nbsp;my @Threads;</div><div class="code_line">&nbsp;&nbsp;my $Threads=10;</div><div class="code_line">&nbsp;&nbsp;# Создаём нужное количество потоков</div><div class="code_line">&nbsp;&nbsp;for my $T (1..$Threads) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;push @Threads, threads-&#62;create(\&amp;WriteLogsRaw, $T);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;# Дожидаемся окончания работы всех потоков</div><div class="code_line">&nbsp;&nbsp;my $Start = gettimeofday;</div><div class="code_line">&nbsp;&nbsp;foreach my $T (@Threads) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;$T-&#62;join();</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;$TimeRaw = gettimeofday() - $Start;</div><div class="code_line">&nbsp;&nbsp;print &quot; Ok\n&quot;;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub ThreadIdFunc {</div><div class="code_line">&nbsp;&nbsp;print &quot; * Записываем LogsId &quot;;</div><div class="code_line">&nbsp;&nbsp;my @Threads;</div><div class="code_line">&nbsp;&nbsp;my $Threads=10;</div><div class="code_line">&nbsp;&nbsp;# Создаём нужное количество потоков</div><div class="code_line">&nbsp;&nbsp;for my $T (1..$Threads) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;push @Threads, threads-&#62;create(\&amp;WriteLogsId, $T);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;# Дожидаемся окончания работы всех потоков</div><div class="code_line">&nbsp;&nbsp;my $Start = gettimeofday;</div><div class="code_line">&nbsp;&nbsp;foreach my $T (@Threads) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;$T-&#62;join();</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;$TimeId = gettimeofday() - $Start;</div><div class="code_line">&nbsp;&nbsp;print &quot; Ok\n&quot;;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub WriteLogsRaw {</div><div class="code_line">&nbsp;&nbsp;print &quot;.&quot;;</div><div class="code_line">&nbsp;&nbsp;my $Dbh = DBI-&#62;connect(&quot;dbi:Pg:dbname=$DBName;host=$DBHost;port=$DBPort&quot;,&quot;$UserName&quot;,&quot;&quot;,{PrintError =&#62; 0});</div><div class="code_line">&nbsp;&nbsp;die &quot;$DBI::errstr\n&quot; if (defined($DBI::err));</div><div class="code_line">&nbsp;&nbsp;foreach my $I (@{Req}) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $query = &quot;INSERT INTO \&quot;LogsRaw\&quot; (\&quot;URL\&quot;,\&quot;Timestamp\&quot;) VALUES (&#39;&quot;.$URLs[$I].&quot;&#39;, NOW())&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp; &nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;$Dbh-&#62;disconnect();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub WriteLogsId {</div><div class="code_line">&nbsp;&nbsp;print &quot;.&quot;;</div><div class="code_line">&nbsp;&nbsp;my $Dbh = DBI-&#62;connect(&quot;dbi:Pg:dbname=$DBName;host=$DBHost;port=$DBPort&quot;,&quot;$UserName&quot;,&quot;&quot;,{PrintError =&#62; 0});</div><div class="code_line">&nbsp;&nbsp;die &quot;$DBI::errstr\n&quot; if (defined($DBI::err));</div><div class="code_line">&nbsp;&nbsp;foreach my $I (@{Req}) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $query = &quot;INSERT INTO \&quot;LogsId\&quot; (\&quot;IdUrl\&quot;,\&quot;Timestamp\&quot;) VALUES ((SELECT u.\&quot;Id\&quot; FROM \&quot;URLs\&quot; AS u WHERE u.\&quot;URL\&quot; = &#39;&quot;.$URLs[$I].&quot;&#39;), NOW())&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp; &nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;$Dbh-&#62;disconnect();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub GatheringStats {</div><div class="code_line">&nbsp;&nbsp;my $Name = shift;</div><div class="code_line">&nbsp;&nbsp;print &quot; * Поизводим вакуум и вычисляем размер таблицы \&quot;&quot;.$Name.&quot;\&quot; ... &quot;;</div><div class="code_line">&nbsp;&nbsp;my $Dbh = DBI-&#62;connect(&quot;dbi:Pg:dbname=$DBName;host=$DBHost;port=$DBPort&quot;,&quot;$UserName&quot;,&quot;&quot;,{PrintError =&#62; 0});</div><div class="code_line">&nbsp;&nbsp;die &quot;$DBI::errstr\n&quot; if (defined($DBI::err));</div><div class="code_line">&nbsp;&nbsp;my $query = &quot;VACUUM FULL ANALYZE&quot;;</div><div class="code_line">&nbsp;&nbsp;my $sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;my $rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;$query = &quot;SELECT (relpages * 8192 / (1024*1024))::int as size_mb FROM pg_class WHERE relname LIKE &#39;&quot;.$Name.&quot;&#39;&quot;;</div><div class="code_line">&nbsp;&nbsp;$sth = $Dbh-&#62;prepare($query);</div><div class="code_line">&nbsp;&nbsp;$rv = $sth-&#62;execute();</div><div class="code_line">&nbsp;&nbsp;die &quot;Error query on \&quot;$query\&quot;: &quot; . $Dbh-&#62;errstr . &quot;\n&quot; unless(defined $rv);</div><div class="code_line">&nbsp;&nbsp;my @array = $sth-&#62;fetchrow_array();</div><div class="code_line">&nbsp;&nbsp;$sth-&#62;finish();</div><div class="code_line">&nbsp;&nbsp;$Dbh-&#62;disconnect();</div><div class="code_line">&nbsp;&nbsp;print &quot; Ok\n&quot;;</div><div class="code_line">&nbsp;&nbsp;return $array[0];</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Вот результаты:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Поехали тестировать ============================================</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;* Генерируем URL&#39;ы ... Ok</div><div class="code_line">&nbsp;* Генерируем произвольный массив индексов запросов URLs ... Ok</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;* Подготавливаем БД:</div><div class="code_line">&nbsp;&nbsp; - чистим таблицу URLs ... Ok</div><div class="code_line">&nbsp;&nbsp; - чистим таблицу LogRaw ... Ok</div><div class="code_line">&nbsp;&nbsp; - чистим таблицу LogId ... Ok</div><div class="code_line">&nbsp;&nbsp; - сбрасываем счетчики Id таблиц ... Ok</div><div class="code_line">&nbsp;&nbsp; - вакуум + сбор статистики ... Ok</div><div class="code_line">&nbsp;&nbsp; - запоняем таблицу URLs ... Ok</div><div class="code_line">&nbsp;&nbsp; - переиндексируем таблицу URLs ... Ок</div><div class="code_line">&nbsp;&nbsp; - пауза 30 сек ... Ok</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;* Записываем LogsRaw .......... Ok</div><div class="code_line">&nbsp;* Поизводим вакуум и вычисляем размер таблицы &quot;LogsRaw&quot; ... &nbsp;Ok</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;* Подготавливаем БД:</div><div class="code_line">&nbsp;&nbsp; - чистим таблицу URLs ... Ok</div><div class="code_line">&nbsp;&nbsp; - чистим таблицу LogRaw ... Ok</div><div class="code_line">&nbsp;&nbsp; - чистим таблицу LogId ... Ok</div><div class="code_line">&nbsp;&nbsp; - сбрасываем счетчики Id таблиц ... Ok</div><div class="code_line">&nbsp;&nbsp; - вакуум + сбор статистики ... Ok</div><div class="code_line">&nbsp;&nbsp; - запоняем таблицу URLs ... Ok</div><div class="code_line">&nbsp;&nbsp; - переиндексируем таблицу URLs ... Ок</div><div class="code_line">&nbsp;&nbsp; - пауза 30 сек ... Ok</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;* Записываем LogsId .......... Ok</div><div class="code_line">&nbsp;* Поизводим вакуум и вычисляем размер таблицы &quot;LogsId&quot; ... &nbsp;Ok</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Время записи RAW-логов: 312.937685012817 сек (полученный размер: 176 Mb)</div><div class="code_line">&nbsp;Время записи &quot;нормализованных&quot;-логов: 391.566915035248 сек (полученный размер: 45 Mb)</div></ol></div></div></div></div><br>
<br>
Запускал несколько раз, заметил закономерность - чем больше итераций в нити, тем ближе время записи &quot;нормализованного&quot; лога к &quot;сырому&quot;. На итерациях порядка 1000 разница была чуть ли не в треть. Больше ждать лениво, да и как говорил - виртуализация портит точность. А на живом железе запустить нет возможности.<br>
<br>
Тем не менее ... худший результат (&quot;нормализованная&quot; запись логов) дает нам скорость 2557 записи/сек. Для таких условий, как проводилось тестирование, я считаю результат вполне приемлем.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666733</guid>
        <pubDate>Tue, 19 Apr 2016 16:00:58 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666733</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666729'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T14:51:52+00:00">19.04.16, 14:51</time></span><div class='quote '>На сайте, коль регистрируется доступ к ресурсам, от силы 1к своих URL, и то это черезчур. Нам надо сделать таблицу 1к URL и сымитировать доступ к ним, с записью лога &quot;сырого&quot; и &quot;нормализованного&quot;. </div></div><br>
Я имел в виду 1кк уже существующих записей лога, а не уникальных URL. Впрочем, согласен, что 10к уников - многовато.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666729</guid>
        <pubDate>Tue, 19 Apr 2016 14:51:52 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666729</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666722'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T14:20:17+00:00">19.04.16, 14:20</time></span><div class='quote '>Сгенери таблицу на, скажем, 1кк URL</div></div><br>
<br>
Э неее ... На сайте, коль регистрируется доступ к ресурсам, от силы 1к своих URL, и то это черезчур. Нам надо сделать таблицу 1к URL и сымитировать доступ к ним, с записью лога &quot;сырого&quot; и &quot;нормализованного&quot;. В своей тестовой программе я лишь заценил возможный пересчет перед записью (на сколько пересчет будет трудоемким). Не думаю, что авторы полнотекстового поиска в БД тупее реализаторов такого же поиска в std::map.<br>
<br>
А на счет предложенного тобою теста - боюсь он буден неадекватен, ибо у меня все БД сервера (PostgreSQL и MySQL) запущены под виртуальными машинами, а виртуализация вносит хаос в тесты, уже не раз проверено. Разные запуски одного и того же могут давать результаты вплоть до обратного. <br>
<br>
Хотя можно попробовать. Подумаю]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666722</guid>
        <pubDate>Tue, 19 Apr 2016 14:20:17 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666722</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666719'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T13:59:22+00:00">19.04.16, 13:59</time></span><div class='quote '>Как говорится, получите и распишитесь</div></div><br>
Всё это никакого отношения к обсуждаемому выше не имеет.<br>
Если очень хочется, то проделай всё то же на любом SQL-сервере. MySQL, FB, MS SQL CE... неважно, каком. Сгенери таблицу на, скажем, 1кк URL, а потом замерь время вставки 10к записей, из которых 9к дубли, по первой и по второй технологии. Такой эксперимент будет хоть как-то адекватен, особенно если сможешь организовать многопоточную вставку.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666719</guid>
        <pubDate>Tue, 19 Apr 2016 13:59:22 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666719</link>
        <description><![CDATA[JoeUser: Теперь с нормализацией получилось даже еще красивше)))<br>
<br>
RAW: <strong class='tag-b'>50499</strong> ms<br>
ID : <strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">23428</span></strong> ms<br>
<br>
Как говорится, получите и распишитесь  :lol: Правда второй лог вырос до 0.76Gb, но не суть&#33;<br>
<br>
Просто переделал бинарный вывод. Вот переделанный код.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;fstream&#62;</div><div class="code_line">#include &#60;random&#62;</div><div class="code_line">#include &#60;chrono&#62;</div><div class="code_line">#include &#60;limits&#62;</div><div class="code_line">#include &#60;iomanip&#62;</div><div class="code_line">#include &#60;map&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;// генерируем набор произвольных Url длиной 10-128 символов</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::map&#60;std::string,uint64_t&#62; ReverseMap;</div><div class="code_line">&nbsp;&nbsp;std::vector&#60;std::string&#62; Urls;</div><div class="code_line">&nbsp;&nbsp;std::random_device Rd;</div><div class="code_line">&nbsp;&nbsp;for (int i=0; i&#60;1000; i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string S;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int Len = Rd() % 118+10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int j=0; j&#60;Len; j++) S += (char)(&#39;a&#39;+ (Rd() % (&#39;z&#39;-&#39;a&#39;)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; std::setw(6) &#60;&#60; i &#60;&#60; &quot;: &quot; &#60;&#60; S &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Urls.push_back(S);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReverseMap[S] = i;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// генерируем произвольные посещения 1000000</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::vector&#60;int&#62; Get;</div><div class="code_line">&nbsp;&nbsp;Get.reserve(1000000);</div><div class="code_line">&nbsp;&nbsp;for(int i=0; i&#60;1000000; i++) Get.push_back(Rd() % 1000);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;char *Buffer = new char[32768*1024];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// записываем &quot;сырые&quot; URL 10000000 шт</div><div class="code_line">&nbsp;&nbsp;std::ofstream fs1(&quot;test-raw.dat&quot;, std::ios::out|std::ios::binary);</div><div class="code_line">&nbsp;&nbsp;if (!fs1) { std::cout &#60;&#60; &quot;беда-1&quot; &#60;&#60; std::endl; delete Buffer; return 1;}</div><div class="code_line">&nbsp;&nbsp;fs1.rdbuf()-&#62;pubsetbuf(Buffer,32768*1024);</div><div class="code_line">&nbsp;&nbsp;auto start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;for (int x=0; x&#60;100; x++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i=0; i&#60;1000000; i++) fs1.write(Urls[Get[i]].c_str(),Urls[Get[i]].length());</div><div class="code_line">&nbsp;&nbsp;fs1.flush();</div><div class="code_line">&nbsp;&nbsp;fs1.close();</div><div class="code_line">&nbsp;&nbsp;auto stop = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;RAW:&quot; &#60;&#60; std::chrono::duration_cast&#60;std::chrono::milliseconds&#62;(stop - start).count()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;&#60; &quot;ms&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; std::endl &#60;&#60; &quot;Press any key to continue...&quot;;</div><div class="code_line">&nbsp;&nbsp;std::cin.get();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// записываем &quot;Id&quot; URL &nbsp;10000000 шт</div><div class="code_line">&nbsp;&nbsp;std::ofstream fs2(&quot;test-id.dat&quot;, std::ios::out|std::ios::binary);</div><div class="code_line">&nbsp;&nbsp;if (!fs2) { std::cout &#60;&#60; &quot;беда-1&quot; &#60;&#60; std::endl; delete Buffer; return 1;}</div><div class="code_line">&nbsp;&nbsp;fs2.rdbuf()-&#62;pubsetbuf(Buffer,32768*1024);</div><div class="code_line">&nbsp;&nbsp;start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;for (int x=0; x&#60;100; x++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i=0; i&#60;1000000; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fs2.write(reinterpret_cast&#60;const char *&#62;(&amp;(ReverseMap[Urls[Get[i]]])), sizeof(uint64_t));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//fs2.write(ReverseMap[Urls[Get[i]]], sizeof(uint64_t));</div><div class="code_line">&nbsp;&nbsp;fs2.flush();</div><div class="code_line">&nbsp;&nbsp;fs2.close();</div><div class="code_line">&nbsp;&nbsp;stop = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;ID :&quot; &#60;&#60; std::chrono::duration_cast&#60;std::chrono::milliseconds&#62;(stop - start).count()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;&#60; &quot;ms&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;delete Buffer;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Бинго&#33;  :lool:<br>
<span class="b-attach" data-size="215556" data-hits="204" data-attach-id="49311" data-attach-post-id="3666719">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3666719&amp;attach_id=49311' title='Скачать файл' target='_blank'>TestNormalisation_2.exe.7z</a> (, : 204)
		</span>]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666713</guid>
        <pubDate>Tue, 19 Apr 2016 13:21:11 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666713</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666690'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T10:22:54+00:00">19.04.16, 10:22</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666676'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T09:20:16+00:00">19.04.16, 09:20</time></span><div class='quote '>Меня смущает запись в логи URL в сыром виде. Туда не URL писать нужно, IdURL, а сам список возможных URL хранить в отдельной таблице.</div></div><br>
Ну как бы это решение вообще необсуждаемое. Таблица посещений - самая в текущем бизнес-процессе высоконагруженная, следовательно, просто обязана быть максимально компактной. Так что только компактные типы (BIGINT, DATETIME), а всякий текстовый хлам - наружу, и по ссылке.</div></div><br>
Именно&#33;&#33;&#33;<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666680'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T09:32:49+00:00">19.04.16, 09:32</time></span><div class='quote '>JoeUser Как верно Акина написал выше - гадание на кофейной гуще. </div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666710'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T12:15:48+00:00">19.04.16, 12:15</time></span><div class='quote '>Интересно было бы смоделировтаь нагрузку, при которой такая вставка &quot;захлебнется&quot;<br>
И сровнить с просто записью лога без &quot;разбора на иды&quot;.. Но, это наверное после майских можно будет поразвлечься. </div></div><br>
<br>
<strong class='tag-b'>Павел</strong>, а зачем гадать если можно посчитать?  :lol: <br>
<br>
Я вот не поленился и поставил эксперимент. Суть такова:<br>
<br>
<strong class='tag-b'>Гипотеза</strong> <br>
<br>
Основное &quot;тонкое&quot; место любой системы, использующей I/O - дисковая подситема - и в первую очередь при простейших счетных операциях. В принципе, это ни разу не гипотеза (для меня, по крайней мере). А не при простейших? Давайте посчитаем плюсы/минусы, да и вообще уместность сбрасывать &quot;нормализованные&quot; логи.<br>
<br>
<strong class='tag-b'>Эксперимент</strong><br>
<br>
При грамотной настройке кэширования движка БД малые таблицы со времени очередного обращения полностью улетают в память, большие таблицы кэшируются частично (скорее всего на уровне индексов). Акей) Пусть аналогом закэшированной таблицы будет структура из STL C++ под названием std::map, считаем та же проиндексированная таблица БД . Для эксперимента собираем и запускаем программу, суть которой в том, что <br>
<br>
* в первом проходе записываются сырые URL&#39;ы на диск, без каких либо поисков<br>
* во втором проходе осуществляется поиск индекса в std::map по URL, который является ключем, а в файл записывается его численное значение из std::map<br>
<br>
Файлы открываются в режиме бинарного I/O, для работы с файлом выделяется программый буффер в 32 метра.<br>
<br>
Вот код программы:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;fstream&#62;</div><div class="code_line">#include &#60;random&#62;</div><div class="code_line">#include &#60;chrono&#62;</div><div class="code_line">#include &#60;map&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// генерируем набор произвольных Url длиной 10-128 символов</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::map&#60;std::string,int&#62; ReverseMap;</div><div class="code_line">&nbsp;&nbsp;std::vector&#60;std::string&#62; Urls;</div><div class="code_line">&nbsp;&nbsp;std::random_device Rd;</div><div class="code_line">&nbsp;&nbsp;for (int i=0; i&#60;1000; i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string S;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int Len = Rd() % 118+10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int j=0; j&#60;Len; j++) S += (char)(&#39;a&#39;+ (Rd() % (&#39;z&#39;-&#39;a&#39;)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; S &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Urls.push_back(S);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReverseMap[S] = i;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// генерируем произвольные посещения 1000000</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::vector&#60;int&#62; Get;</div><div class="code_line">&nbsp;&nbsp;Get.reserve(1000000);</div><div class="code_line">&nbsp;&nbsp;for(int i=0; i&#60;1000000; i++) Get.push_back(Rd() % 1000);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;char *Buffer = new char[32768*1024];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// записываем &quot;сырые&quot; URL 100000000 шт</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::ofstream fs1(&quot;test-raw.dat&quot;, std::ios::out|std::ios::binary);</div><div class="code_line">&nbsp;&nbsp;if (!fs1) { std::cout &#60;&#60; &quot;беда-1&quot; &#60;&#60; std::endl; delete Buffer; return 1;}</div><div class="code_line">&nbsp;&nbsp;fs1.rdbuf()-&#62;pubsetbuf(Buffer,32768*1024);</div><div class="code_line">&nbsp;&nbsp;auto start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;for (int x=0; x&#60;100; x++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i=0; i&#60;1000000; i++) fs1 &#60;&#60; Urls[Get[i]];</div><div class="code_line">&nbsp;&nbsp;fs1.flush();</div><div class="code_line">&nbsp;&nbsp;fs1.close();</div><div class="code_line">&nbsp;&nbsp;auto stop = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;RAW:&quot; &#60;&#60; std::chrono::duration_cast&#60;std::chrono::milliseconds&#62;(stop - start).count()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;&#60; &quot;ms&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; std::endl &#60;&#60; &quot;Press any key to continue...&quot;;</div><div class="code_line">&nbsp;&nbsp;std::cin.get();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// записываем &quot;Id&quot; URL &nbsp;100000000 шт</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::ofstream fs2(&quot;test-id.dat&quot;, std::ios::out|std::ios::binary);</div><div class="code_line">&nbsp;&nbsp;if (!fs2) { std::cout &#60;&#60; &quot;беда-1&quot; &#60;&#60; std::endl; delete Buffer; return 1;}</div><div class="code_line">&nbsp;&nbsp;fs2.rdbuf()-&#62;pubsetbuf(Buffer,32768*1024);</div><div class="code_line">&nbsp;&nbsp;start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;for (int x=0; x&#60;100; x++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i=0; i&#60;1000000; i++) fs2 &#60;&#60; ReverseMap[Urls[Get[i]]] &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;fs2.flush();</div><div class="code_line">&nbsp;&nbsp;fs2.close();</div><div class="code_line">&nbsp;&nbsp;stop = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;ID :&quot; &#60;&#60; std::chrono::duration_cast&#60;std::chrono::milliseconds&#62;(stop - start).count()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;&#60; &quot;ms&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;delete Buffer;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
В результате работы имеем:<br>
<br>
* Запись &quot;сырых&quot; URL заняла <strong class='tag-b'>48566</strong> ms (созданный лог <strong class='tag-b'>6.53</strong>Gb)<br>
* Просчет индексов URL + их запись заняла <strong class='tag-b'>185067</strong> ms (созданный лог <strong class='tag-b'>0.37</strong> Gb)<br>
<br>
Скорость записи &quot;сырых&quot; URL почти в 4 раза быстрее (26% от от записи ID).<br>
Объем данных, подлежащих записи, для записи по ID в 20 раз меньше (5% от RAW)<br>
<br>
По скольку скорость итераций ни чем ограничена не была - считаем что запросы обрабатывались во всю дурь мощности компьютера. А если добавить тормоза, обеспечиваемые сетевым обменом? Если без тормозов, то:<br>
<br>
Обеспечивается запись &quot;сырых&quot; URL: <span class="tag-color tag-color-named" data-value="red" style="color: red"><strong class='tag-b'>206180</strong></span> обращений в секунду<br>
Обеспечивается запись &quot;индексов&quot; URL: <strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">54050</span></strong> обращений в секунду<br>
<br>
Это все на домашнем компе Intel Core i7, 8Gb ram, FakeRaid (RAID0) 1Tb, Win 8.1 x64<br>
<br>
<strong class='tag-b'>End of гадание на кофейной гуще&#33;</strong>  :thanks: <br>
<br>
ЗЫ: Бинарник для Win x64 (upx -9) прилагается (<a class='tag-url' href='http://virustotal.com/ru/file/b91a15ebc91247f96b5da8a6600d051d7f839c605f15138a6ad17125f017aa4f/analysis/1461070475/' target='_blank'>VirusTotal.com</a>)<br>
<br>
<br>
<span class="b-attach" data-size="248006" data-hits="228" data-attach-id="49310" data-attach-post-id="0">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=0&amp;attach_id=49310' title='Скачать файл' target='_blank'>TestNormalisation.exe.7z</a> (, : 228)
		</span> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-04-19T13:44:41+00:00">19.04.16, 13:44</time></span></span><br>
ЗЫ: Хотя, сорь, во втором случае в лог попадают не бинарные индексы, а символьные числа. Переделаю, отпишу скорости.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666710</guid>
        <pubDate>Tue, 19 Apr 2016 12:15:48 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666710</link>
        <description><![CDATA[Павел Калугин: в таком варианте да. <br>Интересно  было бы смоделировтаь нагрузку, при которой такая вставка &quot;захлебнется&quot; <br>И сровнить с просто записью лога без &quot;разбора на иды&quot;.. Но, это наверное после майских можно будет поразвлечься.]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666706</guid>
        <pubDate>Tue, 19 Apr 2016 12:04:31 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666706</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666704'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T11:43:07+00:00">19.04.16, 11:43</time></span><div class='quote '>Вот это не понятно. Как по мне - надо сначала найти урл, если не найден то вставить. Это &quot;тормоз вставки&quot; раз. Потом или повторить поиск или выцепить свежесозданный ид. Это &quot;тормоз вставки&quot; 2</div></div><br>
Эту проблему решает структура<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">CREATE TABLE URLs (</div><div class="code_line">&nbsp;&nbsp; &nbsp;ID integer auto_increment primary key,</div><div class="code_line">&nbsp;&nbsp; &nbsp;URL varchar(255),</div><div class="code_line">&nbsp;&nbsp; &nbsp;INDEX URL (URL) UNIQUE </div><div class="code_line">);</div></ol></div></div></div></div><br>
Соответственно просто делаем тупое <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">INSERT INTO URLs (URL) VALUES (:url);</div></ol></div></div></div></div><br>
Если текущий УРЛ отсутствует - вставка выполняется. Если уже присутствует - при выполнении возникает ошибка нарушения уникального индекса, которую мы проигнорируем. Но вне зависимости от того, какой имеется вариант, после выполнения запроса URL в таблице ЕСТЬ. И можно спокойно выполнять<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">INSERT INTO clicks(dt, url_id) </div><div class="code_line">SELECT now(), id</div><div class="code_line">FROM URLs</div><div class="code_line">WHERE URLs.URL = :url;</div></ol></div></div></div></div>]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666704</guid>
        <pubDate>Tue, 19 Apr 2016 11:43:07 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666704</link>
        <description><![CDATA[Павел Калугин: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666698'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T11:07:13+00:00">19.04.16, 11:07</time></span><div class='quote '>ошибку дублирования злостно игнорируем</div></div><br>
Вот это не понятно. Как по мне - надо сначала найти урл, если не найден то вставить. Это &quot;тормоз вставки&quot; раз. Потом или повторить поиск или выцепить свежесозданный ид. Это &quot;тормоз вставки&quot; 2<br>
Если окажутся &quot;неуникальные&quot; урлы то данные тормоза возрастут или будут ошибки. Опять же затормозится сильно последующая обработка так как всю эту &quot;неуникальность&quot; придется отдельно анализировать]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666698</guid>
        <pubDate>Tue, 19 Apr 2016 11:07:13 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666698</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666697'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T10:55:52+00:00">19.04.16, 10:55</time></span><div class='quote '>не сильно ли замедлит запись подбирать иды под весь этот текстовый хлам и что писать если ида не оказалось? Надо жеж тогда &quot;справочник&quot; обновить - а это еще большее раздувание транзакции</div></div><br>
? не понял... чего там подбирать? автоинкремент с этим справится на раз-два. Так что просто делаем вставку в таблицу УРЛов, ошибку дублирования злостно игнорируем, зато гарантированно имеем запись - а затем уже делаем вставку в таблицу лога. А поскольку имеем два несвязанных INSERT, а между ними SELECT заведомо статической записи (а если средства позволяют - то сразу получение генерированного ID соотв. функцией) - то каждый INSERT является самостоятельной транзакцией, так что транзакции по сути и не нужны вовсе.<br>
<br>
Вьюхи (которые к тому же любят в самый неподходящий момент захотеть материализоваться) или триггеры - это явно лишнее. Ну то есть триггер вроде бы и мог быть по месту - но, как мне кажется, от записи лога трудно ожидать пакетного поступления записей, а в этих условиях триггер только породит ненужные накладные расходы.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666697</guid>
        <pubDate>Tue, 19 Apr 2016 10:55:52 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666697</link>
        <description><![CDATA[Павел Калугин: ну как бы спорный вопрос. не сильно ли замедлит запись подбирать иды под весь этот текстовый хлам и что писать если ида не оказалось? Надо жеж тогда &quot;справочник&quot; обновить  - а это еще большее раздувание транзакции<br>Мне кажется или писать во вьюху с инстед тригером тоже не будет оптимальным решением?]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666690</guid>
        <pubDate>Tue, 19 Apr 2016 10:22:54 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666690</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666676'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T09:20:16+00:00">19.04.16, 09:20</time></span><div class='quote '>Меня смущает запись в логи URL в сыром виде. Туда не URL писать нужно, IdURL, а сам список возможных URL хранить в отдельной таблице.</div></div><br>
Ну как бы это решение вообще необсуждаемое. Таблица посещений - самая в текущем бизнес-процессе высоконагруженная, следовательно, просто обязана быть максимально компактной. Так что только компактные типы (BIGINT, DATETIME), а всякий текстовый хлам - наружу, и по ссылке.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666680</guid>
        <pubDate>Tue, 19 Apr 2016 09:32:49 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666680</link>
        <description><![CDATA[Павел Калугин: <strong class='tag-b'>JoeUser</strong> Как верно Акина написал выше - гадание на кофейной гуще. <br>
если там 100 просмотров страниц в день - любое решение будет работать. Если сотни-тысячи в секунду - ой как думать надо шо с этим делать и как.<br>
Вопрос в том, что все предложенные решения (в том числе и решение автора) работают в неких границах по нагрузке. И чем больше обработки при записи потока данных в бд тем уже эти пределы. ;)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666676</guid>
        <pubDate>Tue, 19 Apr 2016 09:20:16 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666676</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666631'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T06:22:06+00:00">19.04.16, 06:22</time></span><div class='quote '>Потому что нет. Лог только на инсеррт.</div></div><br>
<br>
Не вижу противоречий. Да и &quot;нормализация&quot; тут совсем ненапряжная. Меня смущает запись в логи URL в сыром виде. Туда не URL писать нужно, IdURL, а сам список возможных URL хранить в отдельной таблице. Не думаю, что по ней поиск будет заметным для БД, если нормально отстроить кэширование движка БД.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666668</guid>
        <pubDate>Tue, 19 Apr 2016 08:54:08 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666668</link>
        <description><![CDATA[Павел Калугин: Ну как о чем? О структуре бидэ, о порядке предподготовки данных (я это срезами назвал), о логике построения отчетов ....  ;) <br>Хотя если окажется что сервер типа укоза а логи это посещение всех сайтов укоза тут все равно все придется перерисовывать  ;)  :D]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666642</guid>
        <pubDate>Tue, 19 Apr 2016 06:55:11 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666642</link>
        <description><![CDATA[Akina: <strong class='tag-b'>Павел Калугин</strong><br>
Да не вижу я предмета для спора. Чтобы иметь хоть какие-то данные для него, надо как минимум знать, о каком конкретно сервере идёт речь, и иметь хоть какие-то данные о БД и нагрузке на неё. А счас что? конь - идеальный, вакуум - сферический...]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666641</guid>
        <pubDate>Tue, 19 Apr 2016 06:45:42 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666641</link>
        <description><![CDATA[Павел Калугин: <strong class='tag-b'>Akina</strong>, собственно, я написал ровно тоже что и ты ;)  Хочешь поспорить?]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666639</guid>
        <pubDate>Tue, 19 Apr 2016 06:41:14 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666639</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666631'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-19T06:22:06+00:00">19.04.16, 06:22</time></span><div class='quote '>Лог только на инсеррт. А все разборы нормализация потом джобами или еще чем главное чтоб не блокировало таблицу лога на инсерт и не тормозило его. </div></div><br>
Обсчёт статистики не дешевле её предрасчёта, а его могут запустить в любой момент (да ещё, как показывает опыт, несколько штук параллельно).]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666631</guid>
        <pubDate>Tue, 19 Apr 2016 06:22:06 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666631</link>
        <description><![CDATA[Павел Калугин: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T20:40:14+00:00">18.04.16, 20:40</time></span><div class='quote '>Хотя, если есть вариант, нормализовать на-лету - почему бы и нет.</div></div><br>
Потому что нет. Лог только на инсеррт. А все разборы нормализация потом джобами или еще чем главное чтоб не блокировало таблицу лога на инсерт и не тормозило его.  Пока обращений десяток два в час фихня. Когда несколько сотен в секунду - любые тормоза на записи в лог акунутся потерями и дедлоками <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-04-19T06:27:15+00:00">19.04.16, 06:27</time></span></span><br>
<strong class='tag-b'>Akina</strong> в таких сайтах одно посещение это обращение юзера к 3-5 страницам как минимум, нагрузки считаем по &quot;верхнему&quot; пределу итого 100К посещений это 400К обращений в сутки, половина из которых в &quot;пиковые&quot; 4 часа  = 50К в час, то есть примерно 14 обращений в секунду. Да, немного. Но уже и не мало ;)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666625</guid>
        <pubDate>Tue, 19 Apr 2016 05:57:02 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666625</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666574'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T16:03:32+00:00">18.04.16, 16:03</time></span><div class='quote '>а что делать с накапливаемой информацией?</div></div><br>
Я бы вообще рекомендовал двухуровневую структуру.<br>
На первом уровне - сбор логов, т.е. каждое посещение даёт запись в таблицу.<br>
На втором - предрасчётную статистику прошедших периодов с минимальной либо наиболее часто используемой дискретизацией. Для описанного выше случая (чаще всего требуется статистика за предыдущую неделю) предрасчитывать статистику по неделям (если под неделей понимается строго с пн по вс, например) или по дням (если неделя - это строго 7 суток с плавающей границей). <br>
При таком подходе подавляющее большинство запросов будут быстро получать данные из таблицы с предрасчётными значениями, а нестандартные запросы могут как обсчитывать таблицу логов, так и брать основные данные из таблицы предрасчёта, а &quot;хвосты&quot; - из таблицы логов.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666574'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T16:03:32+00:00">18.04.16, 16:03</time></span><div class='quote '>вопрос может встать, когда в день будет регистрироваться 10000-100000 посещений,</div></div><br>
30кк записей в год - объём не чрезмерный. К тому же таблица логов может партиционироваться по времени.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666610</guid>
        <pubDate>Mon, 18 Apr 2016 20:40:14 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666610</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666597'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T18:55:15+00:00">18.04.16, 18:55</time></span><div class='quote '>Правильный вариант хранить лог по полям как отдает его сервер</div></div><br>
Во во. <br>
Хотя, если есть вариант, нормализовать на-лету - почему бы и нет.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666597</guid>
        <pubDate>Mon, 18 Apr 2016 18:55:15 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666597</link>
        <description><![CDATA[Павел Калугин: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666574'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T16:03:32+00:00">18.04.16, 16:03</time></span><div class='quote '><strong class='tag-b'>Предлагаю такой вариант</strong></div></div><br>
Правильный вариант хранить лог по полям как отдает его сервер  ;)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666574</guid>
        <pubDate>Mon, 18 Apr 2016 16:03:32 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666574</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666573'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T15:53:25+00:00">18.04.16, 15:53</time></span><div class='quote '>На текущий момент информация от ТС предполагает, что суточной дискретизации ему достаточно.</div></div><br>
Как говорится - &quot;аппетит приходит во время еды начальства&quot;  :lol: <br>
<br>
<hr><br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666537'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:36:58+00:00">18.04.16, 11:36</time></span><div class='quote '>Исходные данные таблица post с полями id,read. Обновление поля read происходит update post set read=read+1 про просмотре поста.</div></div><br>
Да нет же&#33;&#33;&#33; Исходные данные - это не то, что ты сделал. Нет еще этой таблицы. <br>
<strong class='tag-b'>Есть, к примеру:</strong> сервер, который отдает какую информацию по URL.<br>
Нужно не вводить поля read1, read2, ... read78 (это тоже твоя костыльная реализация). <br>
<strong class='tag-b'>А нужно, к примеру:</strong> мочь рассчитать рейтинг запросов в разрезе URL за период времени.<br>
<br>
<strong class='tag-b'>Предлагаю такой вариант</strong><br>
<br>
Данные посещений собираются в следующую таблицу &quot;Logs&quot; (здесь и далее - синтаксис PostgreSQL, и &quot;нормализация&quot; тут хромает, ибо URL&#39;ы желательно вынести в отдельную таблицу и организовать с таблицей логов отношения, спецом не делал, чтобы было нагляднее):<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">CREATE TABLE public.&quot;Logs&quot; (</div><div class="code_line">&nbsp;&nbsp;&quot;Id&quot; BIGSERIAL, </div><div class="code_line">&nbsp;&nbsp;&quot;URL&quot; VARCHAR NOT NULL, </div><div class="code_line">&nbsp;&nbsp;&quot;Timestamp&quot; TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL, </div><div class="code_line">&nbsp;&nbsp;CONSTRAINT &quot;Logs_pkey&quot; PRIMARY KEY(&quot;Id&quot;)</div><div class="code_line">) WITHOUT OIDS;</div></ol></div></div></div></div><br>
В результате мы учитываем все посещения, и имеем отметку времени вплоть до секунд. <br>
<br>
Далее, к примеру, нам нужен рейтинг всех URL, которые были бы посещены хотя бы один (или более) раз за последние две календарные недели, без учета текущей календарной недели. <br>
<br>
Делаем запрос:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">WITH Rec AS (</div><div class="code_line">&nbsp;&nbsp;SELECT</div><div class="code_line">&nbsp;&nbsp; &nbsp;*,</div><div class="code_line">&nbsp;&nbsp; &nbsp;extract(week from NOW()) - extract(week from L.&quot;Timestamp&quot;) AS &quot;WeekNum&quot;</div><div class="code_line">&nbsp;&nbsp;FROM</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;Logs&quot; AS L</div><div class="code_line">&nbsp;&nbsp;WHERE</div><div class="code_line">&nbsp;&nbsp; &nbsp;extract(week from NOW()) - extract(week from L.&quot;Timestamp&quot;) BETWEEN 1 AND 2</div><div class="code_line">)</div><div class="code_line">SELECT</div><div class="code_line">&nbsp;&nbsp;*</div><div class="code_line">FROM (</div><div class="code_line">&nbsp;&nbsp;SELECT</div><div class="code_line">&nbsp;&nbsp; &nbsp;Rec.&quot;WeekNum&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;Rec.&quot;URL&quot;, </div><div class="code_line">&nbsp;&nbsp; &nbsp;COUNT(*) AS &quot;Cnt&quot;</div><div class="code_line">&nbsp;&nbsp;FROM</div><div class="code_line">&nbsp;&nbsp; &nbsp;Rec</div><div class="code_line">&nbsp;&nbsp;GROUP BY</div><div class="code_line">&nbsp;&nbsp; &nbsp;Rec.&quot;WeekNum&quot;, Rec.&quot;URL&quot;</div><div class="code_line">) AS J</div><div class="code_line">ORDER BY</div><div class="code_line">&nbsp;&nbsp;J.&quot;WeekNum&quot; DESC, J.&quot;Cnt&quot; DESC</div></ol></div></div></div></div><br>
Получаем нечто типа:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">week &nbsp;URL &nbsp; &nbsp; &nbsp;Count</div><div class="code_line">====================</div><div class="code_line">2 &nbsp; &nbsp; post.php &nbsp;3</div><div class="code_line">2 &nbsp; &nbsp; mail.php &nbsp;1</div><div class="code_line">2 &nbsp; &nbsp; info.php &nbsp;1</div><div class="code_line">1 &nbsp; &nbsp; mail.php &nbsp;1</div><div class="code_line">1 &nbsp; &nbsp; post.php &nbsp;1</div><div class="code_line">1 &nbsp; &nbsp; info.php &nbsp;1</div></ol></div></div></div></div><br>
<br>
Все&#33; Нужный рейтинг получен. Т.е. задачу получение нужных цифр мы решили. <br>
<br>
Теперь нужно предусмотреть, а что делать с накапливаемой информацией? Допустим, в день регистрируется 10 посещений. Вообще ниче делать не надо - ибо, 3650 записей в год, 365000 записей может появится за ближайшие 100 лет. Однако, вопрос может встать, когда в день будет регистрироваться 10000-100000 посещений, тогда действительно таблица логов будет пухнуть. А вот тут уже по желанию:<br>
<br>
* считать статистику и запоминать ее в таблице статистики<br>
* &quot;старые данные&quot; переностить в архивнуюю БД<br>
* &quot;старые данные&quot; просто удалять после пересчета статистики<br>
<br>
Короч, варианты &quot;обслуживания&quot; таблицы логов нужно решать исходя из условий эксплуатации. Тут однозначного ответа нет.<br>
Ну вот как-то так. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-04-18T16:15:07+00:00">18.04.16, 16:15</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666573'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T15:53:25+00:00">18.04.16, 15:53</time></span><div class='quote '>В пределе - фиксация штампа времени каждого отдельного обращения. </div></div><br>
Ну да, в принципе я это выше и описал.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666573</guid>
        <pubDate>Mon, 18 Apr 2016 15:53:25 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666573</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666569'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T15:24:07+00:00">18.04.16, 15:24</time></span><div class='quote '>&quot;почасовые&quot; данные у тебя теряются.</div></div><br>
На текущий момент информация от ТС предполагает, что суточной дискретизации ему достаточно. Если нужно более мелко - соответствующим образом дробится и диапазон сбора статистики. В пределе - фиксация штампа времени каждого отдельного обращения.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666570</guid>
        <pubDate>Mon, 18 Apr 2016 15:28:33 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666570</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666537'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:36:58+00:00">18.04.16, 11:36</time></span><div class='quote '>Исходные данные таблица post с полями id,read. Обновление поля read происходит update post set read=read+1 про просмотре поста.</div></div><br>
Да нет же&#33;&#33;&#33; Исходные данные - это не то, что ты сделал. Нет еще этой таблицы. <br>
<strong class='tag-b'>Есть, к примеру:</strong> сервер, который отдает какую информацию по URL.<br>
Нужно не вводить поля read1, read2, ... read78 (это тоже твоя костыльная реализация). <br>
<strong class='tag-b'>А нужно, к примеру:</strong> мочь рассчитать рейтинг запросов в разрезе URL за период времени.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666569</guid>
        <pubDate>Mon, 18 Apr 2016 15:24:07 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666569</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666540'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:40:59+00:00">18.04.16, 11:40</time></span><div class='quote '>Вот именно предложенная мной схема и позволит такой график построить. </div></div><br>
Не. Если ты будешь<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:00:06+00:00">18.04.16, 11:00</time></span><div class='quote '>Если прошло обращение к УРЛу - плюсим единицу за текущую дату</div></div><br>
... то &quot;почасовые&quot; данные у тебя теряются.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666545</guid>
        <pubDate>Mon, 18 Apr 2016 12:10:21 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666545</link>
        <description><![CDATA[Павел Калугин: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:00:06+00:00">18.04.16, 11:00</time></span><div class='quote '>Для фиксации просмотров должна существовать таблица истории обращений (УРЛ-дата-количество). Если прошло обращение к УРЛу - плюсим единицу за текущую дату, если запись отсутствует - создаём её с количеством = 1.</div></div><br>
Даже не так. Каждое обращение отдельной записью. Количество обращений в день  - count по этой таблице за день<br>
Для ускорения обработки можно делать разные &quot;срезы&quot; вида кол-во обращений за день/неделю/месяц, &quot;кол-во обращений с группировкой по источнику&quot; и т.д. и т.п. <br>
Расчет срезов проводить в &quot;наименее активное время&quot;.<br>
Соответственно для оперативной отчетности остается к последнему срезу добавить данные за текущий. <br>
В общем задача тривиальна и многократно в разных вариациях решена в разных учетных системах. По сути отчет &quot;покажи дебетовый оборот по расчетным счетам  за период ...  в порядке ...&quot; <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-04-18T12:22:35+00:00">18.04.16, 12:22</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666529'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:20:42+00:00">18.04.16, 11:20</time></span><div class='quote '> Я не хочу создавать отдельную таблицу для сохранения просмотров - это глупо и лишняя нагрузка. </div></div><br>
это единственное разумное решение. Тупо заливать лог просмотров. Один быстрый инсерт<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666529'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:20:42+00:00">18.04.16, 11:20</time></span><div class='quote '>Но после сохранения (бэкапа) read-read2 равны и сортировка соответственно не адекватна.</div></div> Это не бекап.. посмотрите внимательно на это <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666518'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T10:48:08+00:00">18.04.16, 10:48</time></span><div class='quote '>update table set read2 = read, <strong class='tag-b'>read = 0</strong></div></div><br>
и все, вот ваш костыль.. Вам надо не копировать а переносить данные. ;)  Но все равно это кривизна полная так считать <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666529'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:20:42+00:00">18.04.16, 11:20</time></span><div class='quote '>Решил вопрос пока таким образом - добавил поле read3. </div></div><br>
Завтра будете read4 добавлять и так далее? Пока в допустимую &quot;ширину&quot; таблицы не упретесь?<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>n0wheremany,<br>
1460978442 &#064; <time class="tag-quote__quoted-time" datetime="1970-02-12T10:28:49+00:00">12.02.70, 10:28</time></span><div class='quote '>Но хотелось бы по текущей каким то образом - есть ли варианты без создания доп таблицы</div></div><br>
Это не доп. таблица. Это исходные данные об обращениях к сайту, на базе которых можно построить любую отчетность с любой сортировкой.  ;) <br>
Например я встречал, когда народ на очень нагруженных сайтах изучает поминутно статистику, с привязками к часовым поясам пользователя и т.д. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666540'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:40:59+00:00">18.04.16, 11:40</time></span><div class='quote '>Вот именно предложенная мной схема и позволит такой график построить. </div></div><br>
а почасовой график? А в разрезе географии?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666537'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:36:58+00:00">18.04.16, 11:36</time></span><div class='quote '>Задача - отсортировать таблицу по изменению за неделю поля read без создания дополнительных таблиц с минимальной нагрузкой</div></div><br>
минимальной нагрузкой на что? На сервер или на руки разработчика? Или на усилия пользователя отчетности? Или на дальнейшее масштабирование отчетности?]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666540</guid>
        <pubDate>Mon, 18 Apr 2016 11:40:59 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666540</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666525'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:03:46+00:00">18.04.16, 11:03</time></span><div class='quote '>Хотя я так бы не делал. Вдруг взбредет потом построить график обращений к URL за сутки?</div></div><br>
Вот именно предложенная мной схема и позволит такой график построить. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666529'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:20:42+00:00">18.04.16, 11:20</time></span><div class='quote '>Я не хочу создавать отдельную таблицу для сохранения просмотров - это глупо и лишняя нагрузка.</div></div><br>
Ну вместо того, чтобы решить задачу оптимальным образом, который, кстати, соответствует модели бизнес-процесса, Вы его решаете кривым костылём... ну чё, хозяин - барин.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666537</guid>
        <pubDate>Mon, 18 Apr 2016 11:36:58 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666537</link>
        <description><![CDATA[n0wheremany: <strong class='tag-b'>JoeUser</strong> Сори если не понятно )<br>
<br>
Исходные данные таблица post с полями id,read. Обновление поля read происходит <strong class='tag-b'>update post set read=read+1</strong> про просмотре поста.<br>
<br>
Задача - отсортировать таблицу по изменению за неделю поля read без создания дополнительных таблиц с минимальной нагрузкой]]></description>
        <author>n0wheremany</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666535</guid>
        <pubDate>Mon, 18 Apr 2016 11:32:51 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666535</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>n0wheremany</strong>, ты написал что ты сделал. Но не указал исходные данные и каков желаемый результат. Одну и туже задачу можно решать разными путями. Соберись с мыслями и напиши вменяемую постановку задачи.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666529</guid>
        <pubDate>Mon, 18 Apr 2016 11:20:42 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666529</link>
        <description><![CDATA[n0wheremany: хм... Поясню по сабжу.<br>
<br>
Есть только 1 таблица post с полями id,read. Я не хочу создавать отдельную таблицу для сохранения просмотров - это глупо и лишняя нагрузка. Т. к. поле read и даёт информацию по просмотрам (аналогично SELECТ count(*)).<br>
Сейчас нужно получить изменение этого поля и отсортировать по нему. Т. к. в таблицу post добавляются строки не часто, сортировать по полю read смысла нет - получится что старые строки всегда будут в верху.<br>
Добавил поле read2 что бы сохранять туда данные раз в неделю запросом <strong class='tag-b'>update table set read2 = read</strong> и сортирую строки <strong class='tag-b'>ORDER BY (read-read2)</strong>. Но после сохранения (бэкапа) read-read2 равны и сортировка соответственно не адекватна.<br>
<br>
Решил вопрос пока таким образом - добавил поле read3. Обновление такое <strong class='tag-b'>update table set read3 = read2, read2 = read</strong>и сортировка соответственно ORDER BY (read2-read3). Т. е. сортировка по изменению предыдущей недели.<br>
<br>
Но хотелось бы по текущей каким то образом - есть ли варианты без создания доп таблицы]]></description>
        <author>n0wheremany</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666525</guid>
        <pubDate>Mon, 18 Apr 2016 11:03:46 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666525</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:00:06+00:00">18.04.16, 11:00</time></span><div class='quote '>Дурацкая (извините за грубость) структура с учётом поставленной задачи.</div></div><br>
Вот и я о том же <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-04-18T11:07:21+00:00">18.04.16, 11:07</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T11:00:06+00:00">18.04.16, 11:00</time></span><div class='quote '>Если прошло обращение к УРЛу - плюсим единицу за текущую дату, если запись отсутствует - создаём её с количеством = 1.</div></div><br>
Хотя я так бы не делал. Вдруг взбредет потом построить график обращений к URL за сутки? Мне кажется, лучше просто добавлять. А уже вопрос роста БД-лога решать иными способами (бэкап &quot;оперативных&quot; данных в &quot;архивные&quot; + чистка &quot;оперативных&quot; данных).]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666522</guid>
        <pubDate>Mon, 18 Apr 2016 11:00:06 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666522</link>
        <description><![CDATA[Akina: Дурацкая (извините за грубость) структура с учётом поставленной задачи.<br>Для фиксации просмотров должна существовать таблица истории обращений (УРЛ-дата-количество). Если прошло обращение к УРЛу - плюсим единицу за текущую дату, если запись отсутствует - создаём её с количеством = 1. Для сортировки по описанному принципу - просто суммируем обращения за последние 7 дней. Общее количество получаем, суммируя без учёта даты (ну или для повышения оперативной производительности храним переопределённое поле общего количества обращений).]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666521</guid>
        <pubDate>Mon, 18 Apr 2016 10:57:59 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666521</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666518'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Павел Калугин &#064; <time class="tag-quote__quoted-time" datetime="2016-04-18T10:48:08+00:00">18.04.16, 10:48</time></span><div class='quote '>И все. Какие суммы? какие группировки?</div></div><br>
Нахрена дополнительные поля (я имею ввиду read2)? Я так понимаю, речь идет о банальном логе просмотров. Лог и лог, чего тут городить что-то дополнительно, если задача расчета тривиальнейша?]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666518</guid>
        <pubDate>Mon, 18 Apr 2016 10:48:08 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666518</link>
        <description><![CDATA[Павел Калугин: <strong class='tag-b'>JoeUser</strong> и? <br>
структура по первому посту<br>
Table(URL, read, read2)<br>
при новом просмотре происходит <br>
update table set read = read+1 where URL = ...<br>
И раз в неделю <br>
update table set read2 = read, read = 0<br>
И все. Какие суммы? какие группировки?]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666517</guid>
        <pubDate>Mon, 18 Apr 2016 10:38:44 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666517</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666447'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-17T20:50:18+00:00">17.04.16, 20:50</time></span><div class='quote '>Суть проблемы - если таблица с полем read (записывается кол-во просмотров). Т. к. это поле только увеличивается со временем. необходимо сортировать по разнице за неделю. Т. е. каждую неделю поле read бэкапится в поле read2. Сортировка по полю получится такая ORDER by (read-read2). Но возникает проблема - после очередного бэкапа - сортировка не очевидна, т. к. поля read и read2 равны.<br>
Как решить проблему?</div></div><br>
<br>
Решается простым запросом. В котором все записи группируются по неделям (из записанной даты извлекается номер недели), в группе же сортируются по дате, в группе берется последний элемент, первый элемент, высчитывается разница просмотров. В результате запроса получается что-то типа &quot;Номер недели&quot;, &quot;Количество просмотров за неделю&quot;.<br>
<br>
ЗЫ: Никакие бэкапы для решения данной задачи не нужны. Бэкапы решают вопросы безопасности данных, либо сброс данных в архив (в бэкап) для предотвращения нежелательного роста БД.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666480</guid>
        <pubDate>Mon, 18 Apr 2016 07:00:34 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666480</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=408634&view=findpost&p=3666447'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>n0wheremany &#064; <time class="tag-quote__quoted-time" datetime="2016-04-17T20:50:18+00:00">17.04.16, 20:50</time></span><div class='quote '>возникает проблема - после очередного бэкапа - сортировка не очевидна, т. к. поля read и read2 равны.</div></div><br>
Что за бред? бэкап никак не влияет на данные&#33; А если при &quot;бэкапе&quot; данные изменяются - это ни хрена не бэкап.]]></description>
        <author>Akina</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666461</guid>
        <pubDate>Mon, 18 Apr 2016 04:53:52 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666461</link>
        <description><![CDATA[Павел Калугин: Потом 4е поле, потом 5 и так далее. Есть подозрение что не с того конца задача решается. Я б подошел отсюда:<br>Бухучёт наше всё. В данном случае устройство таблички проводок ;)  дата, время, страничка откуда, страничка куда<br>Соответственно количество посещений за любой период - по данной табличке с группировкой по иду &quot;куда&quot; <br>И фильтром по периоду  ;)]]></description>
        <author>Павел Калугин</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666447</guid>
        <pubDate>Sun, 17 Apr 2016 20:50:18 +0000</pubDate>
        <title>Проблема сортировки по разнице изменения числа</title>
        <link>https://forum.sources.ru/index.php?showtopic=408634&amp;view=findpost&amp;p=3666447</link>
        <description><![CDATA[n0wheremany: Добрый вечер.<br><br>Суть проблемы - если таблица с полем read (записывается кол-во просмотров). Т. к. это поле только увеличивается со временем. необходимо сортировать по разнице за неделю. Т. е. каждую неделю поле read бэкапится в поле read2. Сортировка по полю получится такая ORDER by (read-read2). Но возникает проблема - после очередного бэкапа - сортировка не очевидна, т. к. поля read и read2 равны.<br>Как решить проблему?<br><br>На текущий момент тупо добавил поле read3 (read - текущее, read2 - неделю назад, read3 - 2 недели назад). Сортируется так ORDER By (read2-read3), т. е. по разнице за пред неделю. Но как сделать адекватную сортировку?]]></description>
        <author>n0wheremany</author>
        <category>Базы данных: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	