<?xml version='1.0' encoding='utf-8' ?>
<rss version="2.0">
  <channel>
    <title>The Postgresmen Articles</title>
    <link>http://postgresmen.ru/</link>
    <description>The Speech of Postgresmen</description>
    <lastBuildDate>Wed, 1 Jul 2009 00:28:20 GMT</lastBuildDate>
    <generator>Postgresmen / Postgresmen.ru</generator>
        <item>
      <title>PostgreSQL 8.4: Материалы для прессы</title>
      <link>http://postgresqlrussia.org/articles/view/151</link>
      <description>&lt;br /&gt;&lt;h2&gt;Официальный пресс-релиз&lt;/h2&gt;  &lt;p&gt;     &lt;strong&gt;1 июля 2009&lt;/strong&gt; &amp;mdash; Всемирная группа разработчиков PostgreSQL выпустила новую версию PostgreSQL, продолжая активную разработку самой развитой системы управления базами данных с открытым исходным кодом. Новая версия содержит множество улучшений, делающих администрирование, написание запросов и программирование баз данных PostgreSQL более простым, чем когда-либо. Благодаря 293 новым функциям и улучшениям, содержащимся в версии 8.4, причин выбрать PostgreSQL для вашего нового проекта стало ещё больше.&lt;/p&gt;  &lt;p&gt; Львиная доля изменений в PostgreSQL 8.4 &amp;mdash; это новые или улучшенные инструменты и команды для администрирования и мониторинга. Каждый пользователь может найти для себя те возможности, которые сделают именно его ежедневную работу с PostgreSQL более лёгкой и продуктивной.&lt;/p&gt;  &lt;p&gt;     &lt;em&gt;&amp;laquo;Мы используем PostgreSQL уже семь лет и с нетерпением ожидаем появления многих новшеств версии 8.4, в особенности таких возможностей как права доступа на столбцы, индивидуальные настройки локали у баз данных, поиск по частичному совпадению с помощью GIN-индексов и определяемые пользователем исключения,&lt;/em&gt; &amp;mdash; говорит Джеффри Уэбстер (Jeffrey Webster), исполнительный директор проекта ZooLoo.com. &amp;mdash; &lt;em&gt;PostgreSQL дал нам возможность расти, не заставляя приносить в жертву целостность данных.&amp;raquo;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;     Среди самых популярных улучшений можно выделить следующие.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;Многопоточное восстановление базы данных&lt;/strong&gt;, обеспечивающее до 8-кратного увеличения скорости реставрации базы данных из резервной копии.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Права доступа на столбцы&lt;/strong&gt;, предоставляющие более тонкий контроль над важными данными.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Раздельные локали для баз данных&lt;/strong&gt;, что упрощает работу с PostgreSQL в многоязычных окружениях.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Обновления &amp;laquo;на месте&amp;raquo;&lt;/strong&gt; с помощью бета-версии инструмента pg_migrator, который позволяет перейти с версии 8.3 на 8.4 без существенного простоя системы.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Новые инструменты мониторинга запросов&lt;/strong&gt;, помогающие администраторам получить лучшее представление об активности запросов.&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;     В версии 8.4 стало проще анализировать данные с помощью развитых средств стандарта ISO/ANSI SQL2003: &lt;strong&gt;&amp;laquo;оконных&amp;raquo; функций (windowing functions)&lt;/strong&gt;, &lt;strong&gt;общих табличных выражений (common table expressions)&lt;/strong&gt; и &lt;strong&gt;рекурсивных запросов с операциями соединения&lt;/strong&gt;. &lt;em&gt;&amp;laquo;Такие структуры запросов существенно повышают выразительную мощь PostgreSQL-диалекта языка SQL, позволяя пользователям формулировать интересные запросы лишь в одном SQL-предложении, что ранее представлялось совершенно невозможным,&lt;/em&gt; &amp;mdash; поясняет Сейлеш Кришнамёрфи (Sailesh Krishnamurthy), основатель компании Truviso. Улучшения хранимых процедур, такие как &lt;strong&gt;значения параметров по умолчанию&lt;/strong&gt; и &lt;strong&gt;переменное число параметров (variadic parameters)&lt;/strong&gt;, делают программирование баз данных более простым, а код становится более компактным.&amp;raquo;&lt;/p&gt;  &lt;p&gt; С выходом новой версии также улучшается общая производительность приложений. Администратор баз данных Системы судопроизводства штата Висконсин Кевин Гриттнер (Kevin Grittner) отмечает: &lt;em&gt;&amp;laquo;PostgreSQL продолжает улучшать производительность с выходом очередной основной версии. Версия 8.4 включает несколько оптимизаций, таких как полусоединения (semi-joins) и антисоединения (anti-joins), что позволяет значительно сократить время обработки некоторых из наших наиболее важных запросов к базам данных.&amp;raquo;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt; Появление новых возможностей означает, что PostgreSQL 8.4 будет служить большему числу пользователей, чем когда-либо. И среди таких новых пользователей &amp;mdash; проект OpenStreetMap. &lt;em&gt;&amp;laquo;Когда мы планировали новую версию API для OpenStreetMap, стало очевидно, что нам нужна первоклассная система управления базами данных, которая не только предоставит все нужные нам возможности, но и будет хорошо работать на необходимых нам масштабах. Хотя существует много систем с открытым исходным кодом, выбор для нас очевиден, это PostgreSQL,&amp;raquo;&lt;/em&gt; &amp;mdash; говорит Том Хьюз (Tom Hughes), системный администратор проекта OpenStreetMap.&lt;/p&gt;  &lt;p&gt;     PostgreSQL давно и активно используется &lt;a href=&quot;http://wiki.postgresqlrussia.org/index.php/%D0%9A%D1%82%D0%BE_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D1%82_PostgreSQL%3F&quot;&gt;во многих российских компаниях&lt;/a&gt;. Вот как комментирует выпуск PostgreSQL 8.4 администратор баз данных социальной сети MirTesen.ru Сергей Коноплёв: &lt;em&gt;&amp;laquo;С выходом PostgreSQL 8.4 в первую очередь я планирую провести оптимизацию, направленную на использование GIN-индексов и contrib-модуля btree_gin. Это должно обеспечить существенных прирост скорости многих функций нашего проекта. Конечно же, поэкспериментирую с новыми настройками autovacuum и &amp;quot;картами видимости&amp;quot;, посмотрю на статистику от pg_stat_statements и на CTE. И забуду о pgAdmin III, т.к. у меня теперь будет \ef в psql :-)&amp;raquo;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Расширенный пресс-релиз&lt;/h2&gt;  &lt;h2&gt;Список нововведений&lt;/h2&gt; &lt;p&gt;     Версия 8.4 оказалась рекордсменом по числу нововведений. Для удобства они были собраны в каталог на отдельных страницах:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/about/press/features84&quot;&gt;Полный список нововведений (англ.)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/about/featurematrix&quot;&gt;Матрица возможностей (англ.)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/docs/8.4/static/release-8-4.html&quot;&gt;Информация о новой версии&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt; &lt;h2&gt;Где скачать&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/download&quot;&gt;Основная страница для загрузки&lt;/a&gt; со ссылками на инсталляторы и инструменты.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/ftp/source/v8.4.0&quot;&gt;Исходный код&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/download/windows&quot;&gt;Инсталляторы для Windows&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/download/linux&quot;&gt;Инсталляторы для Linux&lt;/a&gt; и репозиторий пакетов&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/download/solaris&quot;&gt;Пакеты для Solaris&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/download/macosx&quot;&gt;Инсталляторы для Mac OSX&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://postgresql.org/download/freebsd&quot;&gt;Порты для FreeBSD&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://pgfoundry.org/projects/pg-migrator/&quot;&gt;Проект pg_migrator&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.pgfoundry.org/&quot;&gt;Дополнительные компоненты&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.postgresql.org/download/product-categories&quot;&gt;Сопутствующие и коммерческие программы&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;  &lt;h2&gt;Документация&lt;/h2&gt;  &lt;p&gt; Документация в формате HTML и страницы с руководством устанавливаются вместе с PostgreSQL. Кроме того, вы можете скачивать, искать и комментировать подробную интерактивную &lt;a href=&quot;http://postgresql.org/docs/8.4/interactive&quot;&gt;онлайн-документацию&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h2&gt;Лицензия&lt;/h2&gt; &lt;p&gt;     PostgreSQL использует &lt;a href=&quot;http://postgresql.org/about/licence&quot;&gt;лицензию BSD&lt;/a&gt;, которая требует только сохранения в лицензируемом исходном коде информации об авторских правах и о самой лицензии. Эта &lt;a href=&quot;http://www.opensource.org/licenses/bsd-license.php&quot;&gt;сертифицированная организацией OSI лицензия&lt;/a&gt; широко известна как гибкая и дружественная для бизнеса, поскольку она не запрещает использовать PostgreSQL в патентованных и коммерческих приложениях. Наряду с поддержкой многими компаниями и общественной собственностью на исходный код, лицензия BSD делает PostgreSQL очень популярным среди производителей, желающих внедрить СУБД в свой продукт без каких-либо отчислений, привязки к производителю или риска изменений в лицензировании.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h2&gt;Контакты&lt;/h2&gt;  &lt;p&gt;     Web-страницы&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.postgresql.org/&quot;&gt;Основной сайт PostgreSQL&lt;/a&gt; (англ.)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;../../&quot;&gt;Русскоязычный сайт PostgreSQLRussia.org&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;     Контакты&lt;/p&gt; &lt;p&gt;     Россия&lt;br /&gt; Николай Самохвалов&lt;br /&gt; &lt;a href=&quot;http://people.postgresqlrussia.org/_/ru@postgresql.org&quot;&gt;ru@postgresql.org&lt;/a&gt;&lt;br /&gt; +7-905-783-9804&lt;br /&gt; &lt;a href=&quot;../../&quot;&gt;http://PostgreSQLRussia.org&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;     Контакты в других регионах перечислены на &lt;a href=&quot;http://postgresql.org/about/press/contact&quot;&gt;странице контактов&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h2&gt;Полный текст цитат. Информация о цитируемых компаниях&lt;/h2&gt;  &lt;p&gt;     &lt;em&gt;&amp;laquo;С выходом PostgreSQL 8.4 в первую очередь я планирую провести оптимизацию, направленную на использование GIN-индексов и contrib-модуля btree_gin. Это должно обеспечить существенных прирост скорости многих функций нашего проекта. Конечно же, поэкспериментирую с новыми настройками autovacuum и &amp;quot;картами видимости&amp;quot;, посмотрю на статистику от pg_stat_statements и на CTE. И забуду о pgAdmin III, т.к. у меня теперь будет \ef в psql :-)&amp;raquo;&lt;/em&gt; &amp;mdash; комментирует появление новой версии Сергей Коноплёв, администратор баз данных социальной сети MirTesen.ru.&lt;br /&gt; Контакты: &lt;a href=&quot;mailto:pr@mirtesen.ru&quot;&gt;email-адрес&lt;/a&gt; и &lt;a href=&quot;http://mirtesen.ru/&quot;&gt;основной сайт&lt;/a&gt; проекта МирТесен.&lt;/p&gt;  &lt;p&gt;     Приведённые ниже контакты предназначены для общения только на английском языке.&lt;/p&gt;  &lt;p&gt;     &lt;em&gt;&amp;laquo;Мы используем PostgreSQL уже семь лет и с нетерпением ожидаем появления многих новшеств версии 8.4, в особенности таких возможностей, как права доступа на столбцы, индивидуальные настройки локали у баз данных, поиск по частичному совпадению с помощью GIN-индексов и определяемые пользователем исключения,&lt;/em&gt; &amp;mdash; говорит Джеффри Уэбстер (Jeffrey Webster), исполнительный директор проекта ZooLoo.com. &amp;mdash; &lt;em&gt;PostgreSQL позволяет нам расти, не заставляя приносить в жертву целостность данных.&amp;raquo;&lt;/em&gt;&lt;br /&gt;Вы можете связаться с представителем ZooLoo.com &lt;a href=&quot;mailto:melissa@zooloo.com&quot;&gt;Мелиссой (Melissa)&lt;/a&gt; и посетить сайт &lt;a href=&quot;http://www.zooloo.com/&quot;&gt;ZooLoo.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;     &lt;em&gt;&amp;laquo;PostgreSQL продолжает улучшать производительность с выходом очередной основной версии,&lt;/em&gt; &amp;mdash; заявил Кевин Гриттнер (Kevin Grittner), администратор баз данных, Система судопроизводства штата Висконсин. &amp;mdash; &lt;em&gt;Версия 8.4 включает несколько оптимизаций, таких как полусоединения (semi-joins) и антисоединения (anti-joins), что позволяет значительно сократить время обработки некоторых из наших наиболее важных запросов к базам данных.&amp;raquo;&lt;/em&gt;&lt;br /&gt; Вы можете связаться с &lt;a href=&quot;mailto:Kevin.Grittner@wicourts.gov&quot;&gt;Кевином Гриттнером&lt;/a&gt; и посетить &lt;a href=&quot;http://www.wicourts.gov/&quot;&gt;сайт&lt;/a&gt; Системы судопроизводства штата Висконсин. &lt;/p&gt;  &lt;p&gt;     &lt;em&gt;&amp;laquo;Такие структуры запросов существенно повышают выразительную мощь PostgreSQL-диалекта языка SQL, позволяя пользователям формулировать интересные запросы лишь в одном SQL-предложении, что ранее представлялось совершенно невозможным,&amp;raquo;&lt;/em&gt; &amp;mdash; поясняет Сейлеш Кришнамёрфи (Sailesh Krishnamurthy), основатель и вице-президент по технологиям компании Truviso.&lt;br /&gt; Контакты: &lt;a href=&quot;mailto:info@truviso.com&quot;&gt;email-адрес&lt;/a&gt; и &lt;a href=&quot;http://www.truviso.com/&quot;&gt;сайт&lt;/a&gt; компании Truviso.&lt;/p&gt;  &lt;p&gt;     &lt;em&gt;&amp;laquo;Когда мы планировали новую версию API для OpenStreetMap, стало очевидно, что нам нужна первоклассная система управления базами данных, которая не только предоставит все нужные нам возможности, но и будет хорошо работать на необходимых нам масштабах. PostgreSQL позволяет нам сохранить и поддерживать целостность данных, используя внешние ключи и транзакционные операции обновления, и в то же время предоставляет нашим системным администраторам инструменты, необходимые для работы с нашей базой данных размером в 850 гигабайт, и позволяет управлять процессами непрерывного развития наших схем таблиц и операционными аспектами, такими как создание снапшотов базы данных. Хотя существует много систем с открытым исходным кодом, выбор для нас очевиден, это PostgreSQL,&amp;raquo;&lt;/em&gt; &amp;mdash; говорит Том Хьюз (Tom Hughes), системный администратор проекта OpenStreetMap.&lt;br /&gt; Вы можете связаться с &lt;a href=&quot;mailto:webmaster@openstreetmap.org&quot;&gt;Томом Хьюзом&lt;/a&gt; и посетить сайт &lt;a href=&quot;http://www.openstreetmap.org/&quot;&gt;OpenStreetMap&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h2&gt;Корпоративная поддержка&lt;/h2&gt;  &lt;p&gt; PostgreSQL с удовольствием поддерживают многочисленные компании, которые спонсируют разработчиков, предоставляют нам хостинг и финансовую поддержку. Крупнейшие долговременные спонсоры перечислены на нашей &lt;a href=&quot;http://postgresql.org/about/sponsors&quot;&gt;странице спонсоров разработки&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;     Кроме того, существует обширное сообщество &lt;a href=&quot;http://postgresql.org/support/professional_support&quot;&gt;компаний, предоставляющих поддержку разработчикамPostgreSQL&lt;/a&gt;, от индивидуальных консультантов до многонациональных корпораций.&lt;/p&gt;  &lt;p&gt;     &lt;a href=&quot;http://postgresql.org/about/donate&quot;&gt;Пожертвования&lt;/a&gt; также приветствуются.&lt;/p&gt;</description>
      <pubDate>Wed, 1 Jul 2009 00:28:20 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/151</guid>
    </item>
        <item>
      <title>Доклады о PostgreSQL на конференции Highload++ (октябрь 2008)</title>
      <link>http://postgresqlrussia.org/articles/view/132</link>
      <description>&lt;p&gt;Конференция Highload++ собрала около 700 специалистов отрасли. PostgreSQL был представлен целой серией докладов, включая выступления зарубежных коллег, приехавших в Москву по приглашению компании &amp;laquo;Постгресмен&amp;raquo; и организаторов конференции.&lt;/p&gt;&lt;p&gt;Материалы выступлений разработчиков &lt;b&gt;Skype&lt;/b&gt; представлены на отдельной странице:&amp;nbsp; &lt;a href=&quot;http://postgresqlrussia.org/articles/view/131&quot;&gt;http://postgresqlrussia.org/articles/view/131&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;О некоторых приёмах улучшения прозводительности приложений, использующих PostgreSQL, рассказал &lt;b&gt;Николай Самохвалов, &amp;laquo;Постгресмен&amp;raquo;&lt;/b&gt;: &lt;/p&gt;&lt;p&gt;

&lt;object codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; id=&quot;doc_450085013165684&quot; name=&quot;doc_450085013165684&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; align=&quot;middle&quot;	height=&quot;500&quot; width=&quot;100%&quot;&gt;		&lt;param name=&quot;movie&quot;	value=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6409444&amp;access_key=key-14wm1x6xf5es64i6ksq4&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot;&gt; 		&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt; 		&lt;param name=&quot;play&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;loop&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;		&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; 		&lt;param name=&quot;devicefont&quot; value=&quot;false&quot;&gt;		&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot;&gt; 		&lt;param name=&quot;menu&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt; 		&lt;param name=&quot;salign&quot; value=&quot;&quot;&gt;    		&lt;embed src=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6409444&amp;access_key=key-14wm1x6xf5es64i6ksq4&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; play=&quot;true&quot; loop=&quot;true&quot; scale=&quot;showall&quot; wmode=&quot;opaque&quot; devicefont=&quot;false&quot; bgcolor=&quot;#ffffff&quot; name=&quot;doc_450085013165684_object&quot; menu=&quot;true&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; salign=&quot;&quot; type=&quot;application/x-shockwave-flash&quot; align=&quot;middle&quot;  height=&quot;500&quot; width=&quot;100%&quot;&gt;&lt;/embed&gt;	&lt;/object&gt;&lt;div style=&quot;font-size:10px;text-align:center;width:100%&quot;&gt;&lt;a href=&quot;http://www.scribd.com/doc/6409444/Highload-2008-PostgreSQL-&quot;&gt;Highload++ 2008: Производительность PostgreSQL, Николай Самохвалов&lt;/a&gt; - &lt;a href=&quot;http://www.scribd.com/upload&quot;&gt;Upload a Document to Scribd&lt;/a&gt;&lt;/div&gt;

&lt;br /&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; width=&quot;400&quot; height=&quot;330&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://pics.smotri.com/scrubber_custom8.swf?file=v65079887ec&amp;bufferTime=3&amp;autoStart=false&amp;str_lang=eng&amp;xmlsource=http%3A%2F%2Fpics.smotri.com%2Fcskins%2Fblue%2Fskin_color_lightaqua.xml&amp;xmldatasource=http%3A%2F%2Fpics.smotri.com%2Fskin_ng.xml&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot; /&gt;&lt;embed src=&quot;http://pics.smotri.com/scrubber_custom8.swf?file=v65079887ec&amp;bufferTime=3&amp;autoStart=false&amp;str_lang=eng&amp;xmlsource=http%3A%2F%2Fpics.smotri.com%2Fcskins%2Fblue%2Fskin_color_lightaqua.xml&amp;xmldatasource=http%3A%2F%2Fpics.smotri.com%2Fskin_ng.xml&quot; quality=&quot;high&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; wmode=&quot;window&quot;  width=&quot;400&quot; height=&quot;330&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://smotri.com/video/view/?id=v65079887ec&quot; target=&quot;_blank&quot;&gt;Производительность PostgreSQL / Николай Самохвалов (Постгресмен)&lt;/a&gt;&lt;/strong&gt;


 &lt;/p&gt;&lt;p&gt;Технический директор третьей по популярности социальной сети США &lt;b&gt;myYearbook.com Гевин Рой&lt;/b&gt; большое внимание уделил этапам роста своего проекта, используемым технологиями и решениям, среди которых одну из ключевых ролей играют PostgreSQL-продукты:&lt;/p&gt;&lt;p&gt;

&lt;object codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; id=&quot;doc_892778073447711&quot; name=&quot;doc_892778073447711&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; align=&quot;middle&quot;	height=&quot;500&quot; width=&quot;100%&quot;&gt;		&lt;param name=&quot;movie&quot;	value=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=8969561&amp;access_key=key-t0ed3lz0j7fv7f0fy7h&amp;page=1&amp;version=1&amp;viewMode=&quot;&gt; 		&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt; 		&lt;param name=&quot;play&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;loop&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;		&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; 		&lt;param name=&quot;devicefont&quot; value=&quot;false&quot;&gt;		&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot;&gt; 		&lt;param name=&quot;menu&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt; 		&lt;param name=&quot;salign&quot; value=&quot;&quot;&gt;    		&lt;embed src=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=8969561&amp;access_key=key-t0ed3lz0j7fv7f0fy7h&amp;page=1&amp;version=1&amp;viewMode=&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; play=&quot;true&quot; loop=&quot;true&quot; scale=&quot;showall&quot; wmode=&quot;opaque&quot; devicefont=&quot;false&quot; bgcolor=&quot;#ffffff&quot; name=&quot;doc_892778073447711_object&quot; menu=&quot;true&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; salign=&quot;&quot; type=&quot;application/x-shockwave-flash&quot; align=&quot;middle&quot;  height=&quot;500&quot; width=&quot;100%&quot;&gt;&lt;/embed&gt;	&lt;/object&gt;	&lt;div style=&quot;margin: 6px auto 3px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block;&quot;&gt;	&lt;a href=&quot;http://www.scribd.com/upload&quot; style=&quot;text-decoration: underline;&quot;&gt;Publish at Scribd&lt;/a&gt; or &lt;a href=&quot;http://www.scribd.com/browse&quot; style=&quot;text-decoration: underline;&quot;&gt;explore&lt;/a&gt; others:		  &lt;a href=&quot;http://viewer.scribd.com/browse?c=122-computer-science&quot; style=&quot;text-decoration: underline;&quot;&gt;Computer Science&lt;/a&gt;  		  &lt;a href=&quot;http://viewer.scribd.com/browse?c=114-technology&quot; style=&quot;text-decoration: underline;&quot;&gt;Technology&lt;/a&gt;  			&lt;/div&gt;	

&lt;br /&gt;

&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; width=&quot;400&quot; height=&quot;330&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://pics.smotri.com/scrubber_custom8.swf?file=v6492853b0a&amp;bufferTime=3&amp;autoStart=false&amp;str_lang=eng&amp;xmlsource=http%3A%2F%2Fpics.smotri.com%2Fcskins%2Fblue%2Fskin_color_lightaqua.xml&amp;xmldatasource=http%3A%2F%2Fpics.smotri.com%2Fskin_ng.xml&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot; /&gt;&lt;embed src=&quot;http://pics.smotri.com/scrubber_custom8.swf?file=v6492853b0a&amp;bufferTime=3&amp;autoStart=false&amp;str_lang=eng&amp;xmlsource=http%3A%2F%2Fpics.smotri.com%2Fcskins%2Fblue%2Fskin_color_lightaqua.xml&amp;xmldatasource=http%3A%2F%2Fpics.smotri.com%2Fskin_ng.xml&quot; quality=&quot;high&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; wmode=&quot;window&quot;  width=&quot;400&quot; height=&quot;330&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://smotri.com/video/view/?id=v6492853b0a&quot; target=&quot;_blank&quot;&gt;Архитектура MyYearBook.com Масштабирование PostgreSQL: огонь и медные трубы/ Гевин Рой (MyYearBook) (англоязычный доклад)&lt;/a&gt;&lt;/strong&gt;

&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 14:29:45 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/132</guid>
    </item>
        <item>
      <title>Разработчики Skype в России. Материалы выступлений</title>
      <link>http://postgresqlrussia.org/articles/view/131</link>
      <description>&lt;p&gt;В октябре 2008 года эксперты по базам данных компании Skype посетили Москву. За время своего визита Аско Оя (Asko Oja) и Марко Креэн (Marko Kreen) успели многое: сделали доклад на очередной встрече Российского сообщества пользователей PostgreSQL, выступили на конференции &lt;a href=&quot;http://highload.ru/&quot;&gt;Highload++&lt;/a&gt; и провели 4-часовой тренинг.&lt;/p&gt;&lt;p&gt;Здесь собранные материалы выступлений Аско и Марко. Основная тема всех выступлений &amp;mdash; использование PostgreSQL для построения масштабируемой архитектуры высоконагруженного интернет-проекта. Разработчики Skype выпустили и продолжают активно развивать целую линейку продуктов, ориентированных на решение подобных задач: легковесный менеджер соединений &lt;a href=&quot;http://wiki.postgresqlrussia.org/index.php/PgBouncer&quot;&gt;PgBouncer&lt;/a&gt;, псевдоязык  &lt;a href=&quot;http://wiki.postgresqlrussia.org/index.php/PL/Proxy&quot;&gt;PL/Proxy&lt;/a&gt;, пакет инструментов для репликации и горячего резервирования &lt;a href=&quot;http://wiki.postgresqlrussia.org/index.php/SkyTools&quot;&gt;SkyTools&lt;/a&gt;, систему для организации очереди PgQ.&lt;/p&gt;&lt;p&gt;Слайды выступления на октябрьской встрече PostgreSQL-сообщества:&lt;/p&gt;&lt;p&gt;&lt;object codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; id=&quot;doc_281772637671688&quot; name=&quot;doc_281772637671688&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; align=&quot;middle&quot;	height=&quot;500&quot; width=&quot;100%&quot;&gt;		&lt;param name=&quot;movie&quot;	value=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6409001&amp;access_key=key-cz4pi3jnfs0jhbi3e8k&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot;&gt; 		&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt; 		&lt;param name=&quot;play&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;loop&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;		&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; 		&lt;param name=&quot;devicefont&quot; value=&quot;false&quot;&gt;		&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot;&gt; 		&lt;param name=&quot;menu&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt; 		&lt;param name=&quot;salign&quot; value=&quot;&quot;&gt;    		&lt;embed src=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6409001&amp;access_key=key-cz4pi3jnfs0jhbi3e8k&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; play=&quot;true&quot; loop=&quot;true&quot; scale=&quot;showall&quot; wmode=&quot;opaque&quot; devicefont=&quot;false&quot; bgcolor=&quot;#ffffff&quot; name=&quot;doc_281772637671688_object&quot; menu=&quot;true&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; salign=&quot;&quot; type=&quot;application/x-shockwave-flash&quot; align=&quot;middle&quot;  height=&quot;500&quot; width=&quot;100%&quot;&gt;&lt;/embed&gt;	&lt;/object&gt;&lt;div style=&quot;font-size:10px;text-align:center;width:100%&quot;&gt;&lt;a href=&quot;http://www.scribd.com/doc/6409001/Asko-Oja-talk-at-Russian-PostgreSQL-Community-meeting-October-2008-Moscow&quot;&gt;Asko Oja talk at Russian PostgreSQL Community meeting, October 2008, Moscow&lt;/a&gt; - &lt;a href=&quot;http://www.scribd.com/upload&quot;&gt;Upload a Document to Scribd&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;


&lt;p&gt;Слайды и видео выступления на конференции Highload++:&lt;/p&gt;&lt;p&gt;
&lt;div style=&quot;width:425px;text-align:left&quot; id=&quot;__ss_644864&quot;&gt;&lt;a style=&quot;font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/highload/moskva-architecture-highload-presentation?type=powerpoint&quot; title=&quot;Moskva Architecture Highload&quot;&gt;Moskva Architecture Highload&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slideshare.net/swf/ssplayer2.swf?doc=moskva-architecture-highload-1223492448077703-8&amp;stripped_title=moskva-architecture-highload-presentation&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slideshare.net/swf/ssplayer2.swf?doc=moskva-architecture-highload-1223492448077703-8&amp;stripped_title=moskva-architecture-highload-presentation&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;&quot;&gt;View SlideShare &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/highload/moskva-architecture-highload-presentation?type=powerpoint&quot; title=&quot;View Moskva Architecture Highload on SlideShare&quot;&gt;presentation&lt;/a&gt; or &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/upload?type=powerpoint&quot;&gt;Upload&lt;/a&gt; your own.&lt;/div&gt;&lt;/div&gt;&lt;img style=&quot;visibility:hidden;width:0px;height:0px;&quot; border=0 width=0 height=0 src=&quot;http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMjUwOTIxNzAzNTEmcHQ9MTIyNTA5MjE3NDM1MyZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWRmZmUxMjUyNDYyMDRjN2ZhMjJkZGE3ODA2ZjAxZDJh.gif&quot; /&gt;	
&lt;br /&gt;
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; width=&quot;400&quot; height=&quot;330&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://pics.smotri.com/scrubber_custom8.swf?file=v6557084608&amp;bufferTime=3&amp;autoStart=false&amp;str_lang=eng&amp;xmlsource=http%3A%2F%2Fpics.smotri.com%2Fcskins%2Fblue%2Fskin_color_lightaqua.xml&amp;xmldatasource=http%3A%2F%2Fpics.smotri.com%2Fskin_ng.xml&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot; /&gt;&lt;embed src=&quot;http://pics.smotri.com/scrubber_custom8.swf?file=v6557084608&amp;bufferTime=3&amp;autoStart=false&amp;str_lang=eng&amp;xmlsource=http%3A%2F%2Fpics.smotri.com%2Fcskins%2Fblue%2Fskin_color_lightaqua.xml&amp;xmldatasource=http%3A%2F%2Fpics.smotri.com%2Fskin_ng.xml&quot; quality=&quot;high&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; wmode=&quot;window&quot;  width=&quot;400&quot; height=&quot;330&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://smotri.com/video/view/?id=v6557084608&quot; target=&quot;_blank&quot;&gt;Skype Distributed Database Architecture / Аско Оя (Skype)&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;



&lt;p&gt;Слайды тренинга, проведённого Аско Оя, Марко Креэн (Skype) и Иваном Золотухиным (Постгресмен):&lt;/p&gt;&lt;p&gt;&lt;object codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; id=&quot;doc_535728345383042&quot; name=&quot;doc_535728345383042&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; align=&quot;middle&quot;	height=&quot;500&quot; width=&quot;100%&quot;&gt;		&lt;param name=&quot;movie&quot;	value=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=7548321&amp;access_key=key-28y4gl7w9l3svbas1d5t&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot;&gt; 		&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt; 		&lt;param name=&quot;play&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;loop&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;		&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; 		&lt;param name=&quot;devicefont&quot; value=&quot;false&quot;&gt;		&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot;&gt; 		&lt;param name=&quot;menu&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt; 		&lt;param name=&quot;salign&quot; value=&quot;&quot;&gt;    		&lt;embed src=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=7548321&amp;access_key=key-28y4gl7w9l3svbas1d5t&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; play=&quot;true&quot; loop=&quot;true&quot; scale=&quot;showall&quot; wmode=&quot;opaque&quot; devicefont=&quot;false&quot; bgcolor=&quot;#ffffff&quot; name=&quot;doc_535728345383042_object&quot; menu=&quot;true&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; salign=&quot;&quot; type=&quot;application/x-shockwave-flash&quot; align=&quot;middle&quot;  height=&quot;500&quot; width=&quot;100%&quot;&gt;&lt;/embed&gt;	&lt;/object&gt;&lt;div style=&quot;font-size:10px;text-align:center;width:100%&quot;&gt;&lt;a href=&quot;http://www.scribd.com/doc/7548321/Asko-Oja-Training-Talk-Moscow-Russia-October-2008&quot;&gt;Asko Oja Training Talk (Moscow, Russia, October 2008)&lt;/a&gt; - &lt;a href=&quot;http://www.scribd.com/upload&quot;&gt;Upload a Document to Scribd&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 14:05:47 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/131</guid>
    </item>
        <item>
      <title>Слайды сентябрьской PostgreSQL-встречи: полнотекстовый поиск в PostgreSQL</title>
      <link>http://postgresqlrussia.org/articles/view/120</link>
      <description>&lt;p&gt;16-го сентября 2008 года состоялась очередная, сентябрьская встреча Российского сообщества пользователей PostgreSQL.&lt;/p&gt;&lt;p&gt;Основная тема встречи: полнотекстовый поиск. Речь шла прежде всего о возможностях текущей реализации полнотекстового поиска в PostgreSQL версии 8.3.&lt;/p&gt;&lt;p&gt;Фёдор Сигаев и Иван Золотухин представили обширную демонстрацию возможностей и ответили на вопросы слушателей. &lt;/p&gt;&lt;p&gt;Слайды и скрипты демонстрации:&lt;/p&gt;

&lt;object codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; id=&quot;doc_179186776781763&quot; name=&quot;doc_179186776781763&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; align=&quot;middle&quot;	height=&quot;500&quot; width=&quot;100%&quot;&gt;		&lt;param name=&quot;movie&quot;	value=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6069697&amp;access_key=key-2ei8xvbtvda2gigqj4hi&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot;&gt; 		&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt; 		&lt;param name=&quot;play&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;loop&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;		&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; 		&lt;param name=&quot;devicefont&quot; value=&quot;false&quot;&gt;		&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot;&gt; 		&lt;param name=&quot;menu&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt; 		&lt;param name=&quot;salign&quot; value=&quot;&quot;&gt;    		&lt;embed src=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6069697&amp;access_key=key-2ei8xvbtvda2gigqj4hi&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; play=&quot;true&quot; loop=&quot;true&quot; scale=&quot;showall&quot; wmode=&quot;opaque&quot; devicefont=&quot;false&quot; bgcolor=&quot;#ffffff&quot; name=&quot;doc_179186776781763_object&quot; menu=&quot;true&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; salign=&quot;&quot; type=&quot;application/x-shockwave-flash&quot; align=&quot;middle&quot;  height=&quot;500&quot; width=&quot;100%&quot;&gt;&lt;/embed&gt;	&lt;/object&gt;	

&lt;pre&gt;
====================================
\d posts
SELECT count(*) FROM posts;
ALTER TABLE posts ADD COLUMN fts tsvector;
\d posts
UPDATE posts SET fts = to_tsvector('simple', msg_text);
VACUUM ANALYZE;

SELECT count(*) FROM posts WHERE fts @@ plainto_tsquery('simple', 'Мама раму');
CREATE INDEX gistidx ON posts USING gist (fts);
DROP INDEX gistidx; 
CREATE INDEX ginidx ON posts USING gin (fts);

SELECT count(*) FROM posts WHERE fts @@ plainto_tsquery('simple', 'Мама рама');


DROP INDEX ginidx;


\dF
\dF+
SELECT to_tsvector('russian', 'Мама мыла раму');
SELECT plainto_tsquery('russian', 'Мама мыла раму');


UPDATE posts SET fts = to_tsvector('russian', msg_text);
SELECT count(*) FROM posts WHERE fts @@ plainto_tsquery('russian', 'Мама рама');


SELECT to_tsvector('russian', 'валил валившийся вал');
SELECT to_tsvector('russian', 'вокзал в вокзале');
SELECT to_tsvector('russian', 'батарея батарею');

CREATE TEXT SEARCH DICTIONARY ru_ispell (
    TEMPLATE = ispell,
	DictFile = ru_RU,
	AffFile = ru_RU,
	StopWords = russian
);

 ALTER TEXT SEARCH CONFIGURATION ru
	ALTER MAPPING FOR hword, hword_part, word 
	WITH ru_ispell, russian_stem;

SELECT to_tsvector('ru', 'валил валившийся вал');
SELECT to_tsvector('ru', 'вокзал в вокзале');
SELECT to_tsvector('ru', 'батарея батарею');
SELECT to_tsvector('ru', 'незастолбленное слово');

UPDATE posts SET fts = to_tsvector('ru', msg_text);
VACUUM ANALYZE;
CREATE INDEX ginidx ON posts USING gin (fts);


SELECT * FROM ts_debug('ru', 'Мама мыла агромедную раму в room');
SELECT ts_lexize('ru_ispell', 'туши');
ELECT * FROM ts_parse('default', '123 - a number');

SELECT id, ts_rank_cd(fts, q) AS r 
	FROM posts, plainto_tsquery('ru', 'Москва') AS q  
	WHERE fts @@ q ORDER BY r DESC LIMIT 10;

SELECT id, ts_rank_cd(fts, q) AS r 
	FROM posts, plainto_tsquery('ru', 'Москва Питер') AS q  
	WHERE fts @@ q ORDER BY r DESC LIMIT 10;
SELECT id, ts_rank(fts, q) AS r 
	FROM posts, plainto_tsquery('ru', 'Москва Питер') AS q  
	WHERE fts @@ q ORDER BY r DESC LIMIT 10;

SELECT id, ts_headline('ru', msg_text, q) , ts_rank_cd(fts, q) AS r 
	FROM posts, plainto_tsquery('ru', 'Москва Питер') AS q  
	WHERE fts @@ q ORDER BY r DESC LIMIT 10;

SELECT id, ts_headline('ru', msg_text, q), r FROM
	( SELECT *, ts_rank_cd(fts, q) AS r
		FROM posts, plainto_tsquery('ru', 'Москва Питер') AS q
		WHERE fts @@ q ORDER BY r DESC LIMIT 10
	) AS res;

 SELECT * FROM ts_stat('SELECT fts FROM posts') ORDER BY ndoc DESC;
 SELECT * FROM ts_stat('SELECT fts FROM posts ORDER BY id LIMIT 1000') ORDER BY ndoc DESC LIMIT 20;
&lt;/pre&gt;

&lt;p&gt;В завершение встречи Олег Бартунов рассказал о планах по развитию подсистемы полнотекстового поиска, о том, что планируется к выходу в 8.4 и даже о том, что будет после 8.4:&lt;/p&gt;

&lt;object codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; id=&quot;doc_594055110791532&quot; name=&quot;doc_594055110791532&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; align=&quot;middle&quot;	height=&quot;500&quot; width=&quot;100%&quot;&gt;		&lt;param name=&quot;movie&quot;	value=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6069702&amp;access_key=key-hqydrmore8rmfivlu3r&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot;&gt; 		&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt; 		&lt;param name=&quot;play&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;loop&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;		&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; 		&lt;param name=&quot;devicefont&quot; value=&quot;false&quot;&gt;		&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot;&gt; 		&lt;param name=&quot;menu&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt; 		&lt;param name=&quot;salign&quot; value=&quot;&quot;&gt;    		&lt;embed src=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6069702&amp;access_key=key-hqydrmore8rmfivlu3r&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; play=&quot;true&quot; loop=&quot;true&quot; scale=&quot;showall&quot; wmode=&quot;opaque&quot; devicefont=&quot;false&quot; bgcolor=&quot;#ffffff&quot; name=&quot;doc_594055110791532_object&quot; menu=&quot;true&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; salign=&quot;&quot; type=&quot;application/x-shockwave-flash&quot; align=&quot;middle&quot;  height=&quot;500&quot; width=&quot;100%&quot;&gt;&lt;/embed&gt;	&lt;/object&gt;</description>
      <pubDate>Wed, 17 Sep 2008 19:18:31 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/120</guid>
    </item>
        <item>
      <title>Онлайн-встреча с ведущими экспертами PostgreSQL, 30 июня 2008</title>
      <link>http://postgresqlrussia.org/articles/view/107</link>
      <description>&lt;img src=&quot;http://nikolay.samokhvalov.com/wp-content/uploads/2008/07/dscf54481.jpg&quot; border=&quot;1&quot; alt=&quot;Фото с сайта tika-online.de&quot; title=&quot;Фото с сайта tika-online.de&quot; hspace=&quot;20&quot; vspace=&quot;20&quot; width=&quot;200&quot; height=&quot;267&quot; align=&quot;right&quot; /&gt;30 июня компания &lt;a href=&quot;../..//&quot;&gt;&amp;laquo;Постгресмен&amp;raquo;&lt;/a&gt; провела онлайн-сессию &amp;laquo;Вопросы к ведущим мировым экспертам PostgreSQL&amp;raquo;. В течение трёх часов любой желающий мог задать вопрос одному из приглашённых гостей и получить исчерпывающий ответ. В результате было получено более 40 вопросов, ни один из которых не остался без внимания. &lt;br /&gt; &lt;br /&gt; Участники сессии:&lt;br /&gt; &lt;br /&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;Брюс Момджан (&lt;a id=&quot;g1o43&quot; href=&quot;http://momjian.us/&quot; target=&quot;_blank&quot;&gt;Bruce Momjian&lt;/a&gt;)&lt;/strong&gt;, координатор разработки PostgreSQL, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Максим Богук&lt;/strong&gt;, ведущий администратор баз данных компаний Rambler и Мастерхост, известный специалист по PostgreSQL.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Фёдор Сигаев&lt;/strong&gt;, разработчик подсистемы полнотекстового поиска, систем индексации GiST, GIN и множества дополнительных модулей, один из основных членов PostgreSQL Global Development Group.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Марко Креэн (&lt;a id=&quot;g1o412&quot; href=&quot;https://developer.skype.com/SkypeGarage/DbProjects&quot;&gt;Marko Kreen&lt;/a&gt;)&lt;/strong&gt;, один из основных архитекторов баз данных компании &lt;a id=&quot;g1o413&quot; href=&quot;http://www.skype.com/&quot;&gt;Skype&lt;/a&gt;, разработчик и мантейнер таких проектов как PL/Proxy, Skytools, PgBouncer и pgcrypto. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;hr /&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;em&gt;Сергей Коноплёв&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Вопросы к Марко Креэн:&lt;br /&gt; 1) Когда планируется реализовать механизм контекста ошибок (errcontext mechanism) в plpython?&lt;br /&gt;2) Мы используем try-except-print-traceback решение для упрощения поиска мест ошибок в plpyhton процедурах, есть ли более эффективный способ?&lt;br /&gt; &lt;/em&gt;&lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;br /&gt; 1) Я не являюсь активным разработчиком PL/Python, лучше всего об этом может рассказать Ханну Кросинг (Hannu Krosing), который сейчас поддерживает этот проект.&lt;br /&gt; 2) Если Вы говорите об ошибках Python, тогда да, действительно, механизмы работы с исключениями должны быть улучшены, чтобы предоставлять больше подробностей об ошибке. Если имеются в виду SQL-ошибки, в их обработке существуют довольно большие проблемы, и я не знаю, имеет ли Ханну какие-либо планы по их устранению. В настоящий момент лучше пытайтесь обойтись без их отлова.&lt;br /&gt; &lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;2&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;&lt;a id=&quot;casb&quot; href=&quot;http://kai.habrahabr.ru/&quot; title=&quot;kai&quot;&gt;kai&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Появится ли когда нибудь официальный русскоязычный ресурс по Postgres с русской документацией, обсуждениями и русскоязычным сообществом? Ведь продукт сложный, обладает большим функционалом и кучей дополнительных модулей. Подчас сложно бывает разобраться со всем этим обладая только англоязычной документацией и общаясь с англоязычным коммунити. (Однако при установке новой версии при прочтении соглашения ведется ссылка на русский док, а там перенаправление на &lt;/em&gt;&amp;laquo;&lt;em&gt;как обычно&lt;/em&gt;&amp;raquo;&lt;em&gt;.)&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;br /&gt; В русскоязычном списке рассылки &lt;a id=&quot;mmf7&quot; href=&quot;http://archives.postgresql.org/pgsql-ru-general/&quot; title=&quot;http://archives.postgresql.org/pgsql-ru-general/&quot;&gt;http://archives.postgresql.org/pgsql-ru-general/&lt;/a&gt; Вам всегда ответят на все Ваши вопросы. Также достаточно большая активность есть на форуме &lt;a id=&quot;p_dm&quot; href=&quot;http://www.sql.ru/forum/actualtopics.aspx?bid=7&quot; title=&quot;http://www.sql.ru/forum/actualtopics.aspx?bid=7&quot;&gt;http://www.sql.ru/forum/actualtopics.aspx?bid=7&lt;/a&gt;. Дополнительно, обратите внимание на ресурс &lt;a id=&quot;nans&quot; href=&quot;../..//&quot; title=&quot;&amp;laquo;Постгресмена&amp;raquo;&quot;&gt;&amp;laquo;Постгресмена&amp;raquo;&lt;/a&gt; (компании-организатора этой конференции), разделы &amp;laquo;Новости&amp;raquo; и &amp;laquo;Cтатьи&amp;raquo;.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;3&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;em&gt;&lt;strong&gt;&lt;a id=&quot;gzez2&quot; href=&quot;http://kai.habrahabr.ru/&quot; title=&quot;kai&quot;&gt;kai&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;Одна из досадных штук в работе &amp;mdash; это отсутствие конструкции &amp;quot;INSERT OR UPDATE&amp;quot;. В MySQL можно сделать так: &amp;quot;INSERT INTO users (username, email) VALUES (&amp;#39;Jo&amp;#39;, &amp;#39;jo@email.com&amp;#39;) ON DUPLICATE KEY UPDATE email = &amp;#39;jo@email.com&amp;#39;&amp;quot;. Появится ли что-нибудь похожее в PostgreSQL?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;u&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/u&gt;Стандартный (ANSI) способ для таких вещей &amp;mdash; это MERGE или UPSERT. Оба способа находятся у нас в TODO-листе и, насколько я знаю, кто-то работает над этой функциональностью для PostgreSQL 8.4, хотя лично я ещё не видел этого патча. Мы, вне всяких сомнений, нуждаемся в таком синтаксисе.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;em&gt;&lt;strong&gt;&lt;a id=&quot;fyhl4&quot; href=&quot;http://kai.habrahabr.ru/&quot; title=&quot;kai&quot;&gt;kai&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;:&lt;br /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;em&gt;Будет ли улучшена работа с обработкой данных на различных языках? Например, у меня многоязычный сайт, и я был бы рад получать для него форматированные из timestamp даты в зависимости от указанной в SQL запросе локали.&lt;br /&gt; &lt;br /&gt; &lt;/em&gt;&lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;br /&gt; &lt;/strong&gt; Работа над этим ведётся, но в основном она сосредоточена в области COLLATION и полнотекстового поиска. Первое, с чем надо разобраться &amp;mdash; это хотя бы создание базы с локaлью, отличной от локали кластера. А формирование даты обычно намного проще и гибче делается в приложении.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Alexander:&lt;/strong&gt;&lt;br /&gt; &lt;/em&gt;&lt;em&gt;Вопросы к разработчикам Skype:&lt;br /&gt; 1) Хочется оценить масштабы Skype, хотя бы приблизительно. Сколько пользователей сейчас зарегистрировано? Сколько пользователей находятся одновременно онлайн? Сколько транзакций в секунду выполняет Ваш PostgreSQL? Сколько у Вас серверов PostgreSQL?&lt;br /&gt; 2) Как правильно померить количество транзакций в секунду в PostgreSQL?&lt;br /&gt; &lt;/em&gt;&lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;br /&gt; &lt;/strong&gt;1) Общее количество пользователей у нас сейчас в районе 300 миллионов. Я точно не знаю насчёт активных пользователей, но мой Skype-клиент показывает, что сейчас онлайн находятся 10 миллионов пользователей, и это далеко не пиковая нагрузка. У меня нет точных цифр по количеству транзакций в секунду (TPS), но, кажется, наша нагрузка &amp;mdash; где-то в районе 10-20 тысяч TPS. Всего у нас более 100 серверов PostgreSQL, хотя и не все из них работают одновременно.&lt;br /&gt; 2) Используйте анализатор логов или pgBouncer, установленный перед базой данных, он даёт такую статистику.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;&lt;br /&gt; &lt;em&gt;Сергей Коноплёв:&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Планируется ли реализация механизмов для повышения производительности OLAP-функционала? Если да, то где можно найти информацию об этом?&lt;br /&gt; &lt;br /&gt;&lt;/em&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;Не могли бы Вы уточнить, какая OLAP-функциональность Вам необходима? У нас в TODO-листе есть windowing-функции, и кто-то работает над ними для 8.4. У нас также уже есть WITH RECURSIVE патч для PostgreSQL 8.4.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;Сергей Коноплёв:&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Спасибо за ответ. Имелись ввиду внутренние механизмы, улучшающие производительность.&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;u&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/u&gt;Мне кажется, Вы имеете в виду фунциональность CUBE. Вы пробовали contrib/cube?&lt;br /&gt; &lt;br /&gt; &lt;em&gt;&lt;strong&gt;Сергей Коноплёв:&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt; Да, я имел ввиду работу с гиперкубами, насколько я могу судить по названию контриба. Нет, contrib/cube не пробовал, а где страница этого проекта? Я не могу её найти. Не знаю, возможно я перемудриваю, но по-моему было бы полезно реализовать ondisk-гиперкубы в ядре. Насколько я понимаю, это должно представлять собой авто-пополняемую таблицу с индексами по перестановкам всех полей.&lt;/em&gt;&lt;br /&gt; &lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Contrib/cube является частью дистрибутива исходных кодов PostgreSQL.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;em&gt;&lt;strong&gt;Сергей Коноплёв:&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;У нас есть задачи генерации событий на основе операций в БД: добавление/изменение/удаление. Это, конечно, можно делать в триггерах, но на уровне WAL файлов IMHO это было бы эффективнее, не говоря о том, что обработку можно было бы делать отложенной и вынесенной. Вопрос - есть ли хорошо документированный API для работы с WAL файлами и, если есть, насколько сильно он будет меняться от версии к версии? Если да, то где можно найти информацию об этом?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Внешнее API отсутствует, поскольку никогда не предполагался внешний доступ к WAL-файлам. Более того, их формат совместим только для минорных версий, гарантии совместимости форматов между major-версиями никогда даже не предполагалось. В Постгресе даже нет центрального расшифровщика WAL-записей, каждая запись в некотором смысле контейнер, который имеет признак расшифровщика (таблица, btree-индекс, GiST-индекс и т.д.) Строить свою обработку на WAL-логах не очень удобно ещё и по следующей причине: файлы могут использоваться повторно, и Постгрес никак не оповещает внешний мир об этом.&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; То есть, Вы ищете способ чтения WAL-файлов напрямую? Не существует никакого API для этого, так как их внутренний формат достаточно сложен. Я сейчас понял, что возможность чтения логов могла бы быть полезной, возможно, нам стоит рассмотреть вопрос о включении этого пожелания в TODO-лист. У нас есть на самом деле pg_filedump (&lt;a id=&quot;xz6s0&quot; href=&quot;http://sources.redhat.com/rhdb/utilities.html&quot; title=&quot;http://sources.redhat.com/rhdb/utilities.html&quot;&gt;http://sources.redhat.com/rhdb/utilities.html&lt;/a&gt;), но я не уверен, что он дампит WAL-файлы.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;br /&gt; Может быть, это более эффективно, но менее надёжно (например, WAL-файл может сротироваться без вашего ведома). Пожалуйста, попробуйте PgQ из пакета Skytools и поизучайте скрипты, которые используют этот механизм для организации очереди. Это очень эффективная очередь внутри базы данных, легкая в использовании и надёжная. Также в ней существуют встроенный фреймворк для того, чтобы гарантировать транзакции между несколькими базами данных при обработке очереди. Ещё в ней существуют триггеры, которые автоматически определяют структуру таблиц и форматируют данные в легко разбираемом формате (urlencode).&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;8&lt;br /&gt; &lt;em&gt;&lt;br /&gt; &lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;sakalr:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Вопрос по поводу книг. Сегодня мне пришла книга из британского Амазона, пришлось ждать несколько недель. В России из актуальных версий нашёл только книгу за 3900 рублей. В общем, пусть книги будут даже на английском, но я хочу прийти в &amp;laquo;Библио-Глобус&amp;raquo; или в &amp;laquo;Молодую Гвардию&amp;raquo; и увидеть эту книгу на полке, но не за 3900 рублей (на Амазоне эта же книга была в 2 раза дешевле). Есть потребность в разработке на PostgreSQL, но для меня, как для новичка в PgSQL, это сложно. Постоянно приходится общаться на freenode на ломаном английском, осваивать азы, потратив много времени, когда это должно быть просто механическим усвоением. Именно поэтому возникает вопрос про книги. Книги по postgresql (англ./рус.) очень нужны.&lt;br /&gt; &lt;/em&gt;&lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Если Вы уже знакомы с каким-либо диалектом SQL, то работа в Постгресе не должна причинять Вам большие неудобства. Документация в Постгресе очень хороша и ее обычно хватает (при внимательном чтении, конечно). Если Вы не знакомы с SQL, то лучше взять любой учебник по SQL.&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Я полностью согласен с тем, что нужно больше английских и русских книг. В идеале, нам нужно иметь переведённую на русский язык документацию по PostgreSQL.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;9&lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;em&gt;yar-tour:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Здравствуйте! Интересует вопрос про поддержку COLLATION и поддержку установки триггеров на отдельные поля таблицы. Спасибо.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Ух, мы еще не релизовали механизм COLLATION, но кое-кто уже работает над реализацией поддержки локалей (locales) на уровне баз данных для PostgreSQL 8.4. Колоночные триггеры занесены в наш список TODO, но мне не известно, работает ли кто-нибудь над этим в настоящее время.&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; COLLATION &amp;mdash; насколько я помню, такие работы ведутся в 8.4, но пока этот патч не до конца прошёл процедуру принятия. Триггер на поле таблицы отсутствует, и пока его появление не предвидится. Его эмуляция легко строится на основе обычных триггеров: триггерная функция имеет доступ и к старой, и к новой версии записи.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;10&lt;br /&gt; &lt;em&gt;&lt;br /&gt; alexanderfess:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Здравствуйте! Интересует, есть ли в области Postgres что-то мощнее pgAdmin или phpPgAdmin для разработчика БД. ИМХО они довольно слабые. Планируются ли какие-нибудь проекты в данной области?&lt;br /&gt; &lt;/em&gt;&lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Не знаю, я ими не пользуюсь. Да и сам Постгрес не включает себя графического клиента.&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Я не знаю более мощных утилит, кроме, возможно, коммерческих продуктов Navicat или EMS SQL Manager. Я никогда не пользовался такими средствами (&lt;a id=&quot;vdi5&quot; href=&quot;http://www.freshee.info/program.php?id=31408&quot; title=&quot;http://www.freshee.info/program.php?id=31408&quot;&gt;http://www.freshee.info/program.php?id=31408&lt;/a&gt;).&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;11&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;Михаил Дружинин:&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Здравствуйте. К вопросу про генерацию событий на основе операций в БД: добавление/изменение/удаление. Есть ли возможность сделать обработку отложенной/асинхронной? Чтобы результат обработки не мог повлиять на транзакцию и не замедлял ход её выполнения.&lt;br /&gt; &lt;/em&gt;&lt;strong&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Обычно в этом случае разработчики добавляют изменения в таблицу и обрабатывают их большими пачками позднее.&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;br /&gt; Попробуйте Skytools. Они содержат модуль для создания обобщенной очереди (PgQ) и простые в использовании триггеры для вставки событий в эту очередь. Skytools также содержит фреймворк для обработки очереди на языке Python, хотя Вы можете это сделать и на любом другом языке. Чтобы прочитать событие из очереди, достаточно пары вызовов SQL-функций.&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Триггер по определению обязан отработать в транзакции, поэтому чисто триггерное решение отложенной обработки невозможно. Первое, что напрашивается, &amp;mdash; это складывание триггером событий в таблицу или использование механизма LISTEN/NOTIFY. Кстати, в PostgreSQL 8.4 ожидаются улучшения этого механизма: будет возможно добавить строковый параметр к NOTIFY-событию.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Чтобы результат обработки не мог повлиять на транзакцию и не замедлял ход её выполнения, проще всего скидывать триггером задания на обработку в отдельную таблицу и уже далее асинхронно обрабатывать задания внешним процессом + возможно использовать LISTEN/NOTIFY для уведомления процесса-обработчика о появлении нового задания в очереди.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;12&lt;br /&gt; &lt;br /&gt; &lt;em&gt; Артем Ходлевский:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt; Здравствуйте. У меня вопрос такой: могут ли эксперты порекомендовать способ поддержки значительного количества систем, в условиях довольно интенсивной разработки? Код весь находится в SVN-репозитории, а для обновления существующих систем приходится делать большое количество ручной/рутинной работы.&lt;br /&gt; Если нужно, могу уточнить вопрос:&lt;br /&gt; Есть базы данных, уже установленные и работающие, их количество более десяти. Но в процессе дальнейшей разработки структура меняется (добавляются поля, добавляются/модифицируются хранимые процедуры), эти изменения попадают в инициализационный SQL-сценарий (хранится в SVN). Как сделать удобным (возможно, полуавтоматическим) применение этих изменений ко всем системам, то есть, апгрейд существующих БД? Мы частично решили эту проблему &amp;mdash; ведём параллельный SQL-сценарий, который содержит команды, которые выполняют изменения (ALTER / CREATE OR REPLACE), но его поддержка требует от разработчиков очень большого внимания, а малейшие ошибки потом приводят к конфликтам или сбоям.&lt;br /&gt; &lt;/em&gt;&lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&amp;nbsp;Да, это &amp;laquo;больной вопрос&amp;raquo;. Для автоматизации могу только посоветовать &lt;a id=&quot;j.v8&quot; href=&quot;http://apgdiff.sourceforge.net/&quot; title=&quot;http://apgdiff.sourceforge.net/&quot;&gt;http://apgdiff.sourceforge.net/&lt;/a&gt;.&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;em&gt; Артем Ходлевский:&lt;br /&gt; &lt;/em&gt;&lt;/strong&gt;&lt;em&gt; Спасибо за ответ, как-то мы не очень искали сторонние инструменты, думали для этого есть штатный способ. Будем пробовать.&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt; Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;13&lt;br /&gt; &lt;br /&gt; &lt;em&gt;algo:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Когда STATEMENT TRIGGER получат доступ к записям?&lt;br /&gt; &lt;br /&gt;&lt;/em&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;Я слышал о том, что кто-то работает над тем, чтобы STATEMENT TRIGGER мог получать доступ к записям. Точно не знаю, какое именно API мы должны сделать для этого.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;14&lt;br /&gt; &lt;br /&gt; &lt;em&gt;yar-tour:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Вопрос всем и особенно Брюсу, которого я очень рад встретить: каким вы видите развитие PostgreSQL на ближайшие пару лет?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Я предполагаю рост, конечно. Следующие два года имеют один интересный аспект: PostgreSQL имеет шанс заменить MySQL как самую популярную систему управления базами данных с открытым кодом. Но сможем ли мы сделать это? Саморазрушения MySQL, которое происходит в настоящее время, будет недостаточно, нам самим потребуется решить несколько важных проблем &amp;mdash; в частности, создать лёгкую в использовании репликацию, лёгкий при построении кластер, встроенную систему апгрейдов. Всё это сделало бы PostgreSQL более удобным для большего количества пользователей.&lt;u&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/u&gt;&lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;Это, кстати, тема моей последней презентации, &amp;laquo;Путь PostgreSQL в будущее&amp;raquo; (&lt;a id=&quot;s64c1&quot; href=&quot;http://momjian.us/main/writings/pgsql/future_path.pdf&quot; title=&quot;http://momjian.us/main/writings/pgsql/future_path.pdf&quot;&gt;http://momjian.us/main/writings/pgsql/future_path.pdf&lt;/a&gt;). Мне кажется, что Постгрес двигается к тому, чтобы занять лидирующее место в индустрии систем управления базами данных. Всё свидетельствует об этом &amp;mdash; активная разработка, компании, которые используют Постгрес, пресса, мнения людей и т. д. Я только что был на конференции OSCON, и там интерес к Постгресу был просто невероятен. Может быть, у Вас есть какие-нибудь вопросы по моему PDF?&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;em&gt;yar-tour:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Н&lt;/em&gt;&lt;em&gt;е могли бы Вы назвать несколько больших компаний, которые начали интересоваться PostgreSQL в последнее время? Также интересно услышать про приложения сторонних разработчиков.&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Конечно, у нас есть крупные пользователи почти во всех сегментах индустрии. Это технология, производство, правительственные учреждения, розничная торговля, сервисные компании, финансовые учреждения. Например, на конференции OSCON на прошлой неделе оказалось, что глава всего IT-направления компании Google любит Постгрес, хоть в Google и используют MySQL. Он взял футболку с Постгресом и будет носить ее в офисах Google. Кажется, сегодня уже каждый слышал про Постгрес &amp;mdash; совсем не так дело обстояло всего несколько лет назад, когда мы были почти неизвестны. Мы нравимся даже разработчикам MySQL.&lt;br /&gt; &lt;br /&gt; Нам нужно больше приложений сторонних разработчиков &amp;mdash; мы растём недостаточно быстро в этом направлении, хотя многие приложения разрабатываются в расчёте на то, что они будут поддерживать несколько баз данных и вполне поэтому могут добавить себе поддержку Постгреса.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;15&lt;br /&gt; &lt;br /&gt; &lt;em&gt;algo:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Уважаемые разработчики, а хранимые битмап-индексы когда планируются?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Кто-то их уже реализовывал, но тогда возникла проблема с тем, как vacuum будет чистить такие индексы, ведь это индексы с потерями (lossy).&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Разработчик этого патча вроде бы потерял интерес к нему в первую очередь из-за нерешённой проблемы автоматического вычисления длины bitmap и возможного полного перестроения индекса. Воoбще говоря, on-disk bitmap индекс имеет очень ограниченную область применения и очень плохо автоматизируется (если Вы его используете, значит, Вы должны очень хорошо подумать).&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;br /&gt; Существует патч для этого. Вы можете посмотреть в архивах рассылки или спросить разработчиков о его состоянии.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;16&lt;br /&gt; &lt;em&gt;&lt;br /&gt; Юрий Леонович Русинов:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Здравствуйте! Я разрабатываю подсистему поиска в базе геоданных на основе связки PostgreSQL + PostGIS. Хотелось бы запускать поиск на сервере БД в виде отдельного потока, насколько это возможно?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Не понял. Что значит &amp;mdash; отдельного потока? Постгрес сам по себе не умеет использовать больше одного потока (на самом деле &amp;mdash; процесса) для обработки одного SQL-запроса. Видимо, Вас может удовлетворить использование нескольких соединений к Постгресу.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;17&lt;br /&gt; &lt;br /&gt; &lt;em&gt; yar-tour:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Это баг или фича, что AFTER-триггер может прерваться, например, из-за ошибки в процедуре, и записи при этом не добавятся? В случае с BEFORE-триггером это логично, а вот мне кажется, что AFTER-триггер должен работать только после добавления записи в таблицу, это как бы вытекает из его названия.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Это вполне логичная фича. Так как даже AFTER-триггер выполняется внутри транзакции (даже если включен автокоммит, это только значит, что любая команда будет формально в BEGIN; COMMIT; завернута). Поэтому ошибка в AFTER-триггере, как и любая вообще ошибка внутри транзакции, будет вызывать откат транзакции (ROLLBACK). И запись, даже уже внесенная в таблицу, на самом деле не появится.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;em&gt;yar-tour:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Извините, тогда я не очень понимаю различия между AFTER- и BEFORE-триггерами&lt;/em&gt;...&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;br /&gt; Например, если у таблицы есть serial поле или default поле, то при вставке BEFORE-триггер не увидит значения этих полей. А AFTER-триггер уже видит новую запись полностью, включая default поля (и изменения возможно внесенные BEFORE-триггерами). Фактически, BEFORE-триггер работает со значениями, пришедшими от запроса, а AFTER-триггер работает со значениями, реально записанными в базу (а это не одно и то же).&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;18&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;a id=&quot;f-46&quot; href=&quot;http://kai.habrahabr.ru/&quot; title=&quot;kai&quot;&gt;kai&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Вот ещё вопросик, про pgAdmin - планируется ли регулярно собирать пакеты под распространенные версии Linux? Например, в Ubuntu 8.04 сейчас pgAdmin 1.8.2 (глючит), а на сайте pgadmin.org уже лежит pgAdmin 1.8.4.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Мне сказали, что эти проблемы были исправлены в Убунту (Ubuntu), которым, кстати, я сам пользуюсь. Я думаю, единственной проблемой здесь является заставить разработчиков Убунту обновить сервера для апдейтов. Также отлично работает связка пакетов программного обеспечения с Постгресом для Убунту и, возможно, Вам ст&amp;oacute;ит её попробовать. Там есть PostgreSQL-сервер, pgAdmin и много другого ПО в пакетах, подготовленных Дейвом Пейджем (Dave Page), автором pgAdmin, а не разработчиками Убунту.&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;19&lt;br /&gt; &lt;br /&gt; &lt;em&gt;&lt;a id=&quot;drfi&quot; href=&quot;http://alrond.habrahabr.ru/&quot; title=&quot;alrond&quot;&gt;alrond&lt;/a&gt;:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;1) Хотелось бы более детальных рекомендаций по тюнингу производительности, а то везде только о shared_buffers написано (чем больше, тем лучше :), все остальное расплывчато.&lt;br /&gt; 2) Как насчет обновления базы с версии на версию без необходимости в создании дампа, чтобы не было простоев в работе, если система не кластерная. Может, такое есть и я просто еще не знаю. Имеется в виду смена мажорной версии.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;1) Все остальные параметры помимо shared_buffers очень сильно зависят от типа нагрузки на Вашу базу. И единого оптимального решения там нет (иначе бы оно уже давно попало в базовый конфиг). Полное руководство по тюнингу Postgres будет представлять из себя хороший такой том килограмм на 5 (лежит у меня дома один такой по Oracle). Полезность его при отсуствии большого опыта достаточно небольшая, а ресурсов на написание и обновление при выходе новых версий будет уходить много. Опыт + понимание принципов + документация на сайте, как правило, достаточны для решения большинства задач тюнинга.&lt;br /&gt; 2) Ведутся работы по написанию встроенной upgrade-системы. Но пока она явно не готова. Как промежуточное, но вполне рабочее решение для миграции рекомендуется использовать Slony-I (и эта схема вполне работает, даже для очень больших баз). У нас есть положительный опыт активного использования этого метода для подобных задач в Rambler.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;1) По опыту, люди очень часто забывают менять параметр effective_cache_size и work_mem &amp;mdash; они оба очень важны для планировщика/оптимизатора запросов, а второй еще оказывает значительное влияние на время выполнения запроса.&lt;br /&gt; 2) Поддержите работу Зденека Коталы (Zdenek Kotala) &amp;mdash; это его проект. Там есть очень много сложностей связанных с layout-ом дисковых страниц.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;br /&gt; 1) Вики на основном сайте Постгреса содержит секцию про настройку производительности: &lt;a id=&quot;r-ks&quot; href=&quot;http://wiki.postgresql.org/wiki/Main_Page&quot; title=&quot;http://wiki.postgresql.org/wiki/Main_Page&quot;&gt;http://wiki.postgresql.org/wiki/Main_Page&lt;/a&gt;.&lt;br /&gt; Несколько дополнительных замечаний на основе моего опыта:&lt;br /&gt; * По крайней мере на OLTP-базах большие shared_buffers не являются чем-то необходимым, они просто съедают кэш операционной системы (по крайней мере в Linux).&lt;br /&gt; * Все хотят править postgresql.conf и знают, что нужно сделать, чтобы улучшить производительность, но есть несколько вещей, о которых обязательно ст&amp;oacute;ит помнить (опять же, речь об OLTP-нагрузках):&lt;br /&gt; &amp;nbsp;&amp;nbsp; - Используйте короткие транзакции. Открытые транзакции потребляют ресурсы и открывают много блокировок.&lt;br /&gt; &amp;nbsp;&amp;nbsp; - Чем меньше запросов входит в транзакцию, тем лучше. В идеале &amp;mdash; это единственный запрос в autocommit-режиме, который вызывает функцию, содержащую всю логику транзакции. При использовании PL/pgSQL это автоматически приводит к кэшированию планов запросов.&lt;br /&gt; &amp;nbsp;&amp;nbsp; - Используйте небольшое число работающих процессов сервера PostgreSQL (PostgreSQL backends). Каждый запущенный процесс PostgreSQL потребляет ресурсы, даже если он не выполняет транзакций. Это значит, что Вам следует использовать хороший менеджер соединений. Я слышал, что у Java-разработчиков есть собственные решения для этого, во всех остальных случаях я рекомендую pgBouncer.&lt;br /&gt; 2) Если действительно хотите минимизировать время простоя, тогда встроенная возможность апгрейда вам не поможет. Единственное по-настоящему работающее решение &amp;mdash; реплицировать всю базу данных на другую машину и затем переключить их роли. Может быть сделано с помощью Slony-I или Skytools.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;em&gt;&lt;strong&gt;&lt;a id=&quot;j-io1&quot; href=&quot;http://kai.habrahabr.ru/&quot; title=&quot;kai&quot;&gt;kai&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&lt;br /&gt; &lt;/em&gt;&lt;em&gt;У меня лично есть проблема с распространением изменённых схем между серверами. При удаленной работе у каждого разработчика стоит своя копия БД, собственно если один добавляет новое поле в таблицу, то это нужно сделать всем. И это довольно таки сложно организовать. Посему родился вопрос, не собираются ли разработчики PG расширить инструментарий полезной утилиткой diff для схем БД, что бы к примеру можно было сравнить схему БД из .sql файла и существующей БД? Конечно, такой функционал, как в &lt;a id=&quot;s_16&quot; href=&quot;http://www.sqlmanager.net/en/products/mysql/dbcomparer&quot; title=&quot;http://www.sqlmanager.net/en/products/mysql/dbcomparer&quot;&gt;http://www.sqlmanager.net/en/products/mysql/dbcomparer&lt;/a&gt; не нужен, но просмотреть разницу между схемами было бы очень удобно.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;u&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/u&gt;Нет, боюсь, подобный продукт всегда будет сторонним, не входящим в основной дистрибутив.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Эти задачи как раз и решает (как минимум должен) &lt;a id=&quot;u2yo&quot; href=&quot;http://apgdiff.sourceforge.net/&quot; title=&quot;http://apgdiff.sourceforge.net/&quot;&gt;http://apgdiff.sourceforge.net/&lt;/a&gt;.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;21&lt;br /&gt; &lt;br /&gt; &lt;em&gt;algo:&lt;br /&gt; &lt;/em&gt;&lt;/strong&gt;&lt;em&gt;Eсть много приложений, написанных на MySQL, портировать которые на PG &amp;laquo;одним движением пальца&amp;raquo; мешает отсутствие в последнем нескольких простых &amp;laquo;syntax sugar&amp;raquo; фич типа: REPLACE, ON DUPLICATE KEY UPDATE. Планируются ли дальнейшие шаги в этой области? Практическая реализация представляется несложной, а увеличение области применения &amp;mdash; значительное.&lt;/em&gt;&lt;em&gt; Имеется в виду не принципиальная возможность реализации таких операций, а непосредственно синтаксис.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Вряд ли кто будет делать такие вещи специально совместимыми по синтаксису с MySQL... Функциональность REPLACE/ON DUPLICATE KEY UPDATE сейчас в работе и скорее всего будет включена в релиз 8.4. Но синтаксис скорее всего будет ANSI, а не MySQL. (Как правило, пройтись глобальным поиском и заменить конструкции на совместимые с PostgreSQL не так сложно, как кажется.)&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;br /&gt; Здесь позиция сообщества разработчиков такова: максимально пытаться соответствоать существующему стандарту SQL и не пытаться делать свой синтаксис или повторять чей-то ещё. Именно по этой причине отказались от патча CONNECT BY в пользу WITH RECURSIVE.&lt;br /&gt; &lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Вряд ли мы будем поддерживать точный MySQL-синтаксис для REPLACE. Сейчас это стало ANSI-стандартом, а если мы будем поддерживать MySQL-синтаксис [и их &lt;em&gt;gotchas&lt;/em&gt;], наш собственный станет слишком сложным.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;22&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; &lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;a id=&quot;zv_j2&quot; href=&quot;http://kai.habrahabr.ru/&quot; title=&quot;kai&quot;&gt;kai&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&lt;br /&gt; &lt;/em&gt;&lt;em&gt;И ещё один вопрос, по поводу драйверов. Можно ли как-нибудь форсировать разработку драйвера для perl (DBD::Pg)? Основная проблема - PostgreSQL поддерживает различные типы данных, включая массивы и хеши, а драйвер - нет. Хоть поддержка массивов появилась в новой версии драйвера, но, на сколько я знаю, за последний год ни один распространенный Linux-дистрибутив не включил в себя обновлённую версию этого драйвера.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Так дело лишь в задержке в обновлении Linux-дистрибутива продукта Perl::DBD. Я бы поинтересовался у производителей дистрибутива. Обычно, когда люди задают производителям дистрибутивов подобные вопросы, они выпускают обновления быстро.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;За последний год DBD::Pg был фактически переписан с нуля и появилась поддержка многих приятных вещей. И насколько я вижу, DBD::Pg продолжает активно развиваться (по сравнению с тем, что было 2 и более лет назад). Вопрос обновления DBD::Pg в Linux дистрибутивах лучше задавать тем, кто поддерживает эти дистрибутивы (но насколько я знаю, многие Linux-дистибутивы крайне консервативны в обновлении подобных вещей). В крайнем случае всегда можно собрать руками мимо системы портов/пакетов.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;23&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;em&gt;&lt;strong&gt;Юрий Леонович Русинов:&lt;/strong&gt;&lt;br /&gt; Федору Сигаеву: если на сервере есть хранимая процедура на C/C++, то могу ли я в ней создать дочерний поток и выполнить в нём какие-либо операции?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Можете, но смотря что за операции. Ни одна внутренняя функция Постгреса не разрабатывалась с оглядкой на thread-safe. Так что в отдельном потоке Вам предстоит самостоятельно заботиться обо всём, включая аварийное завершение этого потока.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;24&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;em&gt;Михаил Дружинин:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Спасибо за ответ на мой предыдущий вопрос. Собственно, решение с таблицей для заданий пришло и мне. Только функция-обработчик этих заданий с увеличением их количества тоже будет усложняться.&lt;br /&gt; Попутно вспомнилось ещё два вопроса:&lt;br /&gt; 1) Есть ли для PostgreSQL модуль, реализующий выполнение задач по расписанию.&lt;br /&gt; 2) Можно ли вызвать функцию, возвращающую что-то отличное от void, по его строковому имени &amp;#39;my_func_1&amp;#39; и, соответственно, получить возвращаемое ей значение.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; 1) Не слышал и сомневаюсь, что такой есть. В Постгресе просто нет такого &amp;laquo;хука&amp;raquo;.&lt;br /&gt; 2) Можно, конечно, но я не понял вопроса &amp;mdash; это вопрос по С, PL/pgSQL или SQL? в первом случае &amp;mdash; man dlopen, во втором и третьем &amp;mdash; EXECUTE (&lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN&quot;&gt;http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN&lt;/a&gt;)&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;1) Разработчики pgAdmin сделали вот такую вот вещь для Ваших задач: &lt;a id=&quot;x5.3&quot; href=&quot;http://www.pgadmin.org/docs/1.4/pgagent.html&quot; title=&quot;http://www.pgadmin.org/docs/1.4/pgagent.html&quot;&gt;http://www.pgadmin.org/docs/1.4/pgagent.html&lt;/a&gt;. При использовании pgAdmin штука достаточно удобная. Но в production я его не использовал ни разу. Мне штатного крона хватает.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Будет ли Skype открывать исходный код каких-либо новых PostgreSQL-проектов? Также интересует их опыт по использованию PL/Proxy и Skytools.&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;br /&gt; Первая часть вопроса: да, есть планы по открытию кода нашего фреймворка по мониторингу/управлению [PostgreSQL-серверами]. Но он все еще находится в разработке, поэтому я не могу назвать точную дату релиза.&lt;br /&gt; Вторая часть: также есть идея опубликовать небольшой пример базы данных &amp;laquo;в стиле Skype&amp;raquo;, в которой будут увязаны все наши компоненты одновременно &amp;mdash; PL/Proxy, PgBouncer, PgQ и различные варианты репликации на основе Skytools. Пользователи смогут тогда увидеть, как мы используем их вместе. Но мы пока не нашли времени, чтобы сделать всё это...&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;26&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Как в Skype осуществляется миграция PostgreSQL между основными (major) версиями?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;br /&gt; С помощью Londiste (компонент репликации в Skytools).&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;27&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;em&gt;&lt;strong&gt;Николай:&lt;br /&gt; &lt;/strong&gt;Почему компании-хостеры не торопятся включать PostgreSQL в список предоставляемых услуг, продолжая предлагать в основном MySQL? Стоит ли ждать изменения ситуации и если да, то когда?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Это та же самая проблема, которую мы имеем с приложениями сторонних разработчиков. Провайдеры осуществляют миграцию одними из последних, потому как они на самом деле не используют базы данных. Они довольно консервативны &amp;mdash; как и разработчики сторонних приложений. Со временем ситуация точно изменится.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Максим Богук, администратор баз данных компаний Рамблер и Мастерхост:&lt;/strong&gt;&lt;br /&gt; Сейчас у хостеров в России появилась заинтересованность в предоставлении подобной услуги, так что, я думаю, в течении года появится некоторое количество вариантов.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;28&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;em&gt;Собираются ли улучшать партицирование (partitioning)?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Да, есть разговоры об улучшении синтаксиса, чтобы упростить процедуры обслуживания. Может быть, это войдет в 8.4, но я не пока уверен.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;29&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;em&gt;Планируется ли в будущем метод доступа index cover (уж не знаю, как по-русски)?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Вы имеете в виду доступ к данным только через индекс (без доступа к &amp;laquo;куче&amp;raquo;, heap)? Мы обсуждали эту идею в применении к таблицам &amp;laquo;только для чтения&amp;raquo;, для которых заранее известно, что все записи в индексе являются актуальными. Причина, по которой мы не можем сделать это для read-write таблиц, заключается в том, что информация о видимости записи содержится только в &amp;laquo;куче&amp;raquo;, но не в индексе.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;30&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Планируются ли в будущем аналоги IOT-таблиц Oracle или clustered indexes в MS SQL, Sybase?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; У нас есть патч для чего-то похожего на clustered index под названием &amp;laquo;Group Index Tuples&amp;raquo; (GIT). Хейки [Хейки Линнакангас, Heikki Linnakangas] сделал основную работу в нём, но мне не удалось уговорить его найти время для дополнительной работы над патчем к 8.4. Поэтому сейчас это пока просто патч. Точно не понял, что имеется в виду под IO-tables в Oracle.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Это много раз обсуждалось, но практического патча пока не предоставлено. Первое приближение &amp;mdash; GIT (Group Index Tuples) от Хейки, но патч еще не завершён.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;31&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;em&gt;Планируется ли в будущем компрессия индексов в виде Oracle или db2 for z/OS (последний вариант, наверное, предпочтительней)&lt;/em&gt;&lt;em&gt;?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;О, что-то похожее будет реализовано при внедрении Group Index Tuples от Хейки [Хейки Линнакангас, Heikki Linnakangas] (к сожалению, пока работа не завершена). Лично я был бы определённо рад появлению подобных возможностей.&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Нет пока, потому что в Постгресе bottleneck [узкое место] сидит не в размере индексов, а в доступе к таблицам &amp;mdash; каждую запись надо проверять на видимость данной транзакцией. Это побочный эффект [реализации СУБД, основанной на методе] версионности записей.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;32&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Планируется ли в будущем общий кэш для планов?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Проблема с реализацией кэша плана запросов заключается в издержках при процессе инвалидации кэша. В данный момент мы не разработали эффективный алгоритм для этого. Мы могли бы заняться реализацией уже сейчас, но ведь если такой кэш будет работать медленнее, чем сам процесс подготовки запроса в сессии &amp;mdash; кому это будет нужно?&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;33&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;&lt;font size=&quot;2&quot; id=&quot;cqxc&quot;&gt;Когда наконец будут хинты&lt;/font&gt;&lt;font size=&quot;2&quot; id=&quot;cqxc1&quot;&gt;?&lt;/font&gt; Или хотя бы stored outlines, как в Oracle&lt;/em&gt;&lt;em&gt;?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Мы не думаем, что займёмся реализацией &amp;laquo;хинтов&amp;raquo;, т. к. существующий оптимизатор запросов достаточно хорош. У нас есть механизм грубой настройки запросов (переменные enable_*), которые, как правило, могут помочь в большинстве случаев, когда оптимизатор всё же ошибается. Основная проблема с &amp;laquo;хинтами&amp;raquo; заключается в том, что [при их наличии] мы [разработчики PostgreSQL] перестаём понимать, когда же оптимизатор ошибается и перестаём его развивать. Кроме того, многие люди, настроив свои &amp;laquo;хинты&amp;raquo; на определённые массивы данных, могут получить совершенно другой уровень производительности системы при изменении этих данных.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; В обозримом будущем даже не планируется. Считается, что если оптимизатор запросов ошибается, то надо править оптимизатор, а не добавлять хинты.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;34&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;Планируется ли корректная поддержка Unicode в регулярных выражениях?&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;br /&gt; Сделайте патч &amp;mdash; закоммитим. Просто на удивление редко запрашиваемая фича, раз в полгода. Там есть большие сложности с производительностью регулярных выражений в мультибайтовых кодировках.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Ух, я не был в курсе, что у нас есть проблемы с поддержкой Unicode в регулярных выражениях. Что это за проблема? Никогда не слышал.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&lt;br /&gt; Планируется ли ввести в PostgreSQL механизмы, аналогичные &amp;#39;EVENTS&amp;#39; в MySQL? Это позволило бы, например, в наименее загруженное время суток самой базе производить VACUUM FULL ANALYZE или производить анализ данных и кластеризацию таблиц.&lt;/em&gt; &lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Этот вопрос перекликается с одним из предыдущих, о планировщике. Я думаю, что проекты-спутники (например, pgevents) наилучшим образом подходят в данном случае.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;36&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;Дмитрий:&lt;/strong&gt;&lt;br /&gt; Планируется ли введение встроенной мульти-мастер репликации? Если да, то когда можно ожидать beta-версию?&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Мы могли бы попробовать реализовать мульти-мастер репликацию, но блокировки зачастую делают её малопроизводительной. Большинство разработчиков считает мастер/слейв репликацию или партицирование данных по серверам лучшей альтернативой. PgPool, кстати, может работать в мульти-мастер режиме. PgCluster реализует мульти-мастер, но его производительность оставляет желать лучшего. Slony-II пытался реализовать мульти-мастер, но опять же-таки производительность была невысокой.&lt;br /&gt; &lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;Есть планы на встроенную репликацию Master-Multiple Slaves, надеемся, что это будет в 8.4. Про Multi-Master &amp;mdash; посмотрите на Postgres-R, его исходные коды открыты уже месяц как.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Марко Креэн, инженер компании Skype:&lt;/strong&gt;&lt;br /&gt; Если Вы хотите распределить нагрузку по записи на несколько машин, посмотрите PL/Proxy &amp;mdash; он не является мульти-мастером в общепринятом смысле этого слова, но он обладает очень хорошей производительностью, которой так не хватает в обычных мульти-мастер системах.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;37&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;Арлен&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;У меня, скорее, филосовский вопрос, чем практический. Не рассматривает ли сообщество PostgreSQL вопрос о смене лицензии с BSD на GPL ввиду быстрого роста популярности открытого кода и защиты его от закрытия крупными компаниями, взявшим PostgreSQL себе на вооружение и для наживы ради?&lt;br /&gt; &lt;/em&gt;&lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Это действительно интересный вопрос. GPL могла бы предотвратить коммерциализацию Постгреса некоторыми компаниями, но тогда они бы не нашли деньги для финансирования разработки или спонсорства, поэтому мне кажется, что GPL является худшей альтернативой для нас. Если отвечать буквально на Ваш вопрос, никто в Постгрес-сообществе никогда всерьёз не рассматривал возможность изменить лицензию на GPL; она не имеет ни одного преимущества, зато имеет множество недостатков.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Фёдор Сигаев, ведущий разработчик PostgreSQL:&lt;/strong&gt;&lt;br /&gt; Нет, и не планируется. GPL накладывает излишние ограничения.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;38&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;em&gt;sakalr:&lt;br /&gt; &lt;/em&gt; &lt;/strong&gt;&lt;em&gt;Cегодня только получил книгу с материалом по PL/PgSQL, потому слегка в растерянности, так как ещё не читал её. С одной стороны, возможно, в ней есть большинство ответов на мои вопросы, с другой стороны, подобные конференции проводятся не каждый месяц и глупо было бы не спросить здесь. Можете ли Вы порекомендовать обзорные статьи или рецепты (cookbook) на тему pl/pgsql? Сам reference в руководстве вполне толковый, но нужны именно рецепты.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Ух, раньше у нас была книга рецептов по plpgsql, но я сейчас не вижу её онлайн. Я бы начал с изучения в src/test/regress/sql/plpgsql.sql на Вашем месте.&lt;strong&gt;&lt;u&gt;&lt;br /&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;39&lt;br /&gt; &lt;br /&gt; &lt;em&gt;Алексей:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Когда можно ожидать реализацию нормальной репликации между двумя PostgreSQL-серверами, хотя бы master-slave с горячим переключением с master на slave? PITR не подходит нормально нагруженной среде из-за длительности переключения на резервный сервер, а сделанные на коленке и триггерах системы вроде Slony в сколько-нибудь серьезный продакшн ставить страшно.&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br /&gt; Проблема с failover-ом (переключением нагрузки на резервный сервер при отказе основного), встроенным в PostgreSQL, заключается в том, что мы не знаем достаточно о Вашей операционной системе, чтобы произвести переключение. Я боюсь, что автоматический failover будет сильно зависеть от ОС и, следовательно, он будет создаваться либо самим пользователем, либо тем, кто создает пакеты для его системы.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;40&lt;br /&gt; &lt;br /&gt; &lt;em&gt;Алексей:&lt;/em&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Можно ли изменить формат выходного представления типа UUID, чтобы получать на выходе просто 32-х символьную строку, а не разбитую по группам? В основном, входные данные именно varchar(32) в большинстве проектов, а то, что получается сейчас на выходе, неудобно использовать. &lt;/em&gt;&lt;br /&gt; &lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Мы обсуждали возможность добавления форматирования вывода UUID в PostgreSQL 8.4. Я не припомню, сделано это уже или нет, но мне кажется, что Вы всегда можете использовать PL/PgSQL, чтобы форматировать UUID так, как Вам нравится.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;41&lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;Арлен:&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;Очень хотелось бы узнать, идут ли уже сейчас обсуждения в сообществе того, что войдёт в PostgreSQL 9-ой версии?&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Вау, PostgreSQL 9.0. Мне кажется, никто еще не загадывал так далеко вперёд. Мы работаем над 8.4 и не строим далеких 9.0 планов. Извините.&lt;br /&gt; &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вопрос &lt;/strong&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;strong&gt;42&lt;br /&gt; &lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;Арлен:&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;em&gt;Хотелось бы узнать ваше отношение к проекту Postgres-R (&lt;a id=&quot;hvha&quot; href=&quot;http://www.postgres-r.org/&quot; title=&quot;http://www.postgres-r.org/&quot;&gt;http://www.postgres-r.org/&lt;/a&gt;) и мнение насчет его будущего в проекте PostgreSQL. &lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt; Postgres-R реализовал мульти-мастер репликацию на основе группового сетевого взаимодействия. В Slony-II разработчики попытались использовать подобный подход, но столкнулись с плохой производительностью и отказались от этого пути. Кто-то сейчас работает над Postgres-R, но я не уверен, что они имеют хорошие показатели производительности. Когда у нас будут данные о ней, можно будет обсуждать проект подробнее.&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Thu, 31 Jul 2008 03:05:44 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/107</guid>
    </item>
        <item>
      <title>Слайды II встречи Российского PostgreSQL-сообщества</title>
      <link>http://postgresqlrussia.org/articles/view/115</link>
      <description>&lt;p&gt;Слайды дискуссии, проведенной на второй встрече Российского PostgreSQL-сообщества в мае 2008 г. Встреча состояла из 3 частей:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Доклад &amp;quot;Производительность PostgreSQL в веб-приложениях&amp;quot; (Иван Золотухин)&lt;/li&gt;&lt;li&gt;Краткое выступление, посвященное PgBouncer (Максим Богук, Иван Золотухин)&lt;/li&gt;&lt;li&gt;Конференции, доклады, новости, текущие дела (Николай Самохвалов) &lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;

&lt;object codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; id=&quot;doc_734693547993985&quot; name=&quot;doc_734693547993985&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; align=&quot;middle&quot;	height=&quot;500&quot; width=&quot;100%&quot;&gt;		&lt;param name=&quot;movie&quot;	value=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6002899&amp;access_key=key-13uz6hfklbgah09fq00d&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot;&gt; 		&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt; 		&lt;param name=&quot;play&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;loop&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;		&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; 		&lt;param name=&quot;devicefont&quot; value=&quot;false&quot;&gt;		&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot;&gt; 		&lt;param name=&quot;menu&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt; 		&lt;param name=&quot;salign&quot; value=&quot;&quot;&gt;    		&lt;embed src=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=6002899&amp;access_key=key-13uz6hfklbgah09fq00d&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; play=&quot;true&quot; loop=&quot;true&quot; scale=&quot;showall&quot; wmode=&quot;opaque&quot; devicefont=&quot;false&quot; bgcolor=&quot;#ffffff&quot; name=&quot;doc_734693547993985_object&quot; menu=&quot;true&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; salign=&quot;&quot; type=&quot;application/x-shockwave-flash&quot; align=&quot;middle&quot;  height=&quot;500&quot; width=&quot;100%&quot;&gt;&lt;/embed&gt;	&lt;/object&gt;
</description>
      <pubDate>Wed, 14 May 2008 04:00:00 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/115</guid>
    </item>
        <item>
      <title>Спецкурс «PostgreSQL: промышленная разработка баз данных» (ВМК МГУ)</title>
      <link>http://postgresqlrussia.org/articles/view/91</link>
      <description>&lt;h1&gt;Объявления&lt;/h1&gt;&lt;p&gt;[2008-05-27] Второй (и последний) раунд проведения экзамена состоится завтра, &lt;strong&gt;28 мая, В 18:30 в П-5&lt;/strong&gt;. &lt;/p&gt;&lt;p&gt;[2008-05-10] Опубликована программа экзамена (&lt;a href=&quot;http://samokhvalov.com/files/postgresql_msu_2008_exam.pdf&quot;&gt;PDF&lt;/a&gt;). &lt;u&gt;&lt;strong&gt;Экзамен состоится 14 мая, в 18:30, в аудитории П-5.&lt;/strong&gt;&lt;/u&gt;&lt;strong&gt; &lt;/strong&gt;(Если возникает конфликт с зачётами по другим предметам, можно приходить на второй день сдачи, 28 мая.) &lt;/p&gt;&lt;p&gt;[2008-04-30] Занятие 30 апреля не состоится. Следующее занятие: 7 мая, оно будет последним. До 7 мая принимаются результаты выполнения задания из лекции №8. &lt;/p&gt;&lt;p&gt;[2008-04-28] В материалах 8-го занятия (&lt;a href=&quot;http://samokhvalov.com/files/Lecture8.pdf&quot;&gt;PDF&lt;/a&gt;) содержится описание комплексного задания (из 8 пунктов). Ответы (в свободной форме) присылать, как обычно, по email. &lt;em&gt;Результаты выполнения обязательно будут учитываться на экзамене&lt;/em&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;&lt;h1&gt;Материалы&amp;nbsp;&lt;/h1&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Материалы занятий&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Занятие 1: &lt;a href=&quot;http://samokhvalov.com/files/Lecture1.pdf&quot;&gt;PDF&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Занятие 2: &lt;a href=&quot;http://samokhvalov.com/files/Lecture2.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Занятие 3: &lt;a href=&quot;http://samokhvalov.com/files/Lecture3.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Занятие 4: &lt;a href=&quot;http://samokhvalov.com/files/Lecture4.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Занятие 5: &lt;a href=&quot;http://samokhvalov.com/files/Lecture5.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Занятие 6: &lt;a href=&quot;http://samokhvalov.com/files/Lecture6.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Занятие 7: &lt;a href=&quot;http://samokhvalov.com/files/Lecture7.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Занятие 8: &lt;a href=&quot;http://samokhvalov.com/files/Lecture8.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Занятия 9 и 10: &lt;a href=&quot;http://samokhvalov.com/files/Lecture9.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;&lt;h2&gt;Метаинформация&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Программа курса: &lt;a href=&quot;http://samokhvalov.com/files/program_2008_postgresql_samokhvalov.pdf&quot;&gt;PDF&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Объявление: &lt;a href=&quot;http://samokhvalov.com/files/pgcourse2008_ad.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;Экзамен&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Программа экзамена: &lt;a href=&quot;http://samokhvalov.com/files/postgresql_msu_2008_exam.pdf&quot;&gt;PDF&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;&lt;h2&gt;Литература&lt;/h2&gt;&lt;h3&gt;Основная литература&amp;nbsp;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;PostgreSQL Reference Manual - Volume 1: SQL Language Reference ― The PostgreSQL Global Development Group, 2007. &lt;a href=&quot;http://www.postgresql.org/docs/8.3/interactive/&quot;&gt;http://www.postgresql.org/docs/8.3/interactive/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Гарсиа-Молина, Г. Системы баз данных. Полный курс ― М., СПб.: ИД &amp;quot;Вильямс&amp;quot;, 2004.&lt;/li&gt;&lt;li&gt;Кузнецов, С. Д. Основы баз данных ― М.: Интернет-университет информационных технологий, &lt;a href=&quot;http://intuit.ru&quot;&gt;http://intuit.ru&lt;/a&gt;, 2005. /*на сайте intuit.ru есть версия online*/&lt;/li&gt;&lt;li&gt;Бартунов О. Что такое PostgreSQL? // Корпоративные базы данных-2005 ― М.: ЦИТ, 2005. &lt;a href=&quot;../articles/view/57&quot;&gt;http://postgresmen.ru/articles/view/57&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Дополнительная литература&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;SQL:2006. ISO/IEC JTC 1/SC 32. / Editor: Jim Melton. International Standard. ISO, ANSI, 2006. (drafts: &lt;a href=&quot;http://wiscorp.com/SQLStandards.html&quot;&gt;http://wiscorp.com/SQLStandards.html&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Дейт, К.. Введение в системы баз данных. 7-е изд. ― М., СПб.: Вильямс, 2000.&lt;/li&gt;&lt;li&gt;Бартунов О., Сигаев Ф. Введение в полнотекстовый поиск в PostgreSQL ― М.: ЦИТ, 2007. &lt;a href=&quot;http://www.citforum.ru/database/postgres/fts/&quot;&gt;http://www.citforum.ru/database/postgres/fts/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Самохвалов Н. PostgreSQL 8.3 &lt;a href=&quot;../../articles/view/78&quot;&gt;http://postgresmen.ru/articles/view/78&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Hellerstein, J. M., Naughton, J. F., Pfeffer, Avi. Generalized search trees for database systems. // Proceedings of the 21st International Conference on Very Large Data Bases. Zurich, Switzerland, 1995. (&lt;a href=&quot;http://www.cs.uiuc.edu/class/fa07/cs511/papers/GiST.pdf&quot;&gt;PDF&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Douglas, K. PostgreSQL (2nd Edition) ― Sams, 2005.&lt;/li&gt;&lt;li&gt;Worsley, J. C., Drake, J. D. Practical PostgreSQL ― O&amp;#39;Reilly Media, 2002.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;&lt;h1&gt;О курсе&amp;nbsp;&lt;/h1&gt;&lt;p&gt;&lt;em&gt;Специальный курс для студентов 4, 5 курса и аспирантов, читается во 2 семестре (весна 2008)&lt;br /&gt;Лекции - 32 часа&lt;br /&gt;Форма контроля: экзамен&lt;br /&gt;Кафедра системного программирования ВМиК МГУ&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Лектор: Самохвалов Николай Александрович&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Учебно-практический курс &amp;laquo;PostgreSQL: промышленная разработка баз данных&amp;raquo; посвящён&lt;br /&gt;особенностям практического использования СУБД PostgreSQL при разработке современных&lt;br /&gt;программных продуктов. Основная цель курса &amp;mdash; закрепление теоретических знаний,&lt;br /&gt;полученных при прослушивании курсов по базам данных и SQL, и обеспечение возможности&lt;br /&gt;практического применения этих знаний слушателями. Базовые темы рассматриваются в&lt;br /&gt;контексте стандарта языка ISO/ANSI SQL, что делает возможным применение полученных в&lt;br /&gt;процессе прослушивания курса знаний и навыков при использовании других СУБД.&lt;/p&gt;&lt;p&gt;Существенная часть лекций курса предполагает выполнение практических заданий (как&lt;br /&gt;самостоятельно студентом, так и во время занятий, в группе), основанных на решениях,&lt;br /&gt;применяемых в коммерческих продуктах и продуктах с открытым исходным кодом.&lt;br /&gt;Особое внимание уделено следующим аспектам:&lt;br /&gt;&amp;nbsp;&amp;nbsp; ● соотношение возможностей СУБД PostgreSQL и стандарта языка SQL (SQL:1999 и SQL:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2003);&lt;br /&gt;&amp;nbsp;&amp;nbsp; ● проблемы производительности и масштабирования и методы их решения;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ● специальные возможности PostgreSQL и их роль в решении практических задач;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ● практические задачи и методы их решения.&lt;/p&gt;&lt;p&gt;Курс рассчитан на аудиторию, обладающую базовыми знаниями в области баз данных и языка&lt;br /&gt;SQL.&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Mon, 28 Apr 2008 13:40:21 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/91</guid>
    </item>
        <item>
      <title>PostgreSQL 8.3: улучшение производительности в разы</title>
      <link>http://postgresqlrussia.org/articles/view/83</link>
      <description>&lt;p&gt;&lt;em&gt;Иван Золотухин (iz at postgresmen dot ru), февраль 2008&lt;br /&gt; &lt;/em&gt;&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;Миграция одного из проектов (2GB OLTP база с 150 довольно сложных транзакций в секунду на среднем по производительности сервере), в которых мы принимаем участие, с PostgreSQL 8.2 на 8.3 принесла удивительные результаты: &lt;strong&gt;производительность системы улучшилась в разы&lt;/strong&gt;. Судите сами: около 21:00 (см. самый большой пик на графике чтения/записи) был сделан дамп базы версии 8.2 и восстановление дампа в 8.3. Соответственно на всех графиках в левой части система работает на PostgreSQL 8.2, справа после 21:00 &amp;mdash; PostgreSQL 8.3. Нагрузка на сервер баз данных в дневное время (приблизительно с 7:00 до 23:00) слева и справа одинакова &amp;mdash; 130-150 TPS. Конфигурация PostgreSQL практически не менялась: custom-настройки старого postgresql.conf были перенесены в новый, остальные параметры остались без изменений. Ниже приведено описание каждой картинки. &lt;/p&gt;&lt;br /&gt;&lt;div align=&quot;justify&quot;&gt;&lt;em&gt;Рис. 1&lt;/em&gt;. Объем чтения/записи на диск с $PGDATA в сек (с 5-минутным усреднением). Стоит отметить, что WAL вынесен на отдельное устройство и не участвует в формировании картины. Так как объем базы невелик и она укладывается в оперативную память (а именно в shared_buffers), чтение практически отсутствует. Объем записи в 8.2 на порядок превосходит объем записи в 8.3. Самые высокие пики записи справа и слева вызваны checkpoint-ами (контрольными точками). Вблизи 23:30 виден пик, связанный с ежесуточным backup-ом базы.&lt;br /&gt; &lt;/div&gt;&lt;div style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;../../img/articles/8.3/db1-bytes-rw.png&quot; alt=&quot;Запись на диск в МБ&quot; title=&quot;Запись на диск в МБ&quot; width=&quot;603&quot; height=&quot;219&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align=&quot;justify&quot;&gt;&lt;em&gt;Рис. 2&lt;/em&gt;. Средняя загруженность сервера PostgreSQL (LA, Load Average). В данном случае из-за довольно активной записи LA обусловлено iowait-ом, поэтому точно так же повторяет профиль поведения записи на диск с рис. 1: самые большие пики связаны с checkpoint-ами.&lt;div style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;../../img/articles/8.3/db1-LA.png&quot; alt=&quot;Load Average&quot; title=&quot;Load Average&quot; width=&quot;603&quot; height=&quot;247&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt; &lt;div align=&quot;justify&quot;&gt;&lt;em&gt;Рис. 3&lt;/em&gt;. Количество запросов на чтение/запись в сек (с 5-минутным усреднением).&lt;/div&gt;&lt;div style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;../../img/articles/8.3/db1-req-io.png&quot; alt=&quot;IO requests&quot; title=&quot;IO requests&quot; width=&quot;603&quot; height=&quot;219&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;Причины улучшения производительности&lt;/strong&gt; &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Читающие транзакции не приводят к проматыванию идентификатора транзакции (xid), соответственно отсутствует запись в pg_clog, которая раньше имела место быть даже при немодифицирующих запросах.&lt;/li&gt;&lt;li&gt;Распределенные checkpoint-ы. PostgreSQL научился &amp;laquo;размазывать&amp;raquo; процесс синхронизации буферов с файлами данных на диске, более равномерно распределяя нагрузку на систему. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Улучшенные seqscan-ы. Речь идет не только о &lt;a href=&quot;../../articles/view/78&quot; title=&quot;Что нового в PostgreSQL 8.3&quot;&gt;Syncronized Scans&lt;/a&gt;, но еще и о том, что раньше seqscan по большой таблице, которая не лежит в shared_buffers, приводил к вытеснению &amp;laquo;грязных&amp;raquo; буферов из памяти и PostgreSQL вынужден был прямо сразу записывать их на диск (даже при простом немодифицирующем запросе). Начиная с версии 8.3 существует специальный буфер фиксированного размера для последовательных просмотров и PostgreSQL читает данные с диска в него, не вытесняя при этом существенные порции &amp;laquo;грязных&amp;raquo; данных на диск, как это было раньше. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt; &lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;Результаты&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt; Существенно более гладкое распределение нагрузки на подсистему ввода-вывода и, как следствие, общей нагрузки на сервер c СУБД PostgreSQL; снижение общей загруженности сервера в 2-3 раза. Рекомендуем запланировать миграцию на PostgreSQL 8.3 всех инсталляций PostgreSQL младших версий с повышенной нагрузкой на подсистему ввода-вывода.</description>
      <pubDate>Sun, 17 Feb 2008 17:57:18 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/83</guid>
    </item>
        <item>
      <title>Слайды I встречи Российского PostgreSQL-сообщества</title>
      <link>http://postgresqlrussia.org/articles/view/116</link>
      <description>&lt;p&gt;Слайды дискуссии, проведенной на первой встрече Российского PostgreSQL-сообщества в феврале 2008 г. Встреча состояла из нескольких частей:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Доклад &amp;quot;Что нового в PostgreSQL 8.3?&amp;quot; (Николай Самохвалов)&lt;/li&gt;&lt;li&gt;Краткое выступление, посвященное миграции на PostgreSQL 8.3 (Иван Золотухин)&lt;/li&gt;&lt;li&gt;Дискуссия о планах и будущей активности сообщества (Николай Самохвалов)&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;
В дискуссиях на встрече принимали активное участие Олег Бартунов, Фёдор Сигаев, Максим Богук, Алексей Борзов и многие другие.  &lt;br /&gt; &lt;br /&gt;

&lt;object codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; id=&quot;doc_355792630051784&quot; name=&quot;doc_355792630051784&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; align=&quot;middle&quot;	height=&quot;500&quot; width=&quot;100%&quot;&gt;		&lt;param name=&quot;movie&quot;	value=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=4856008&amp;access_key=key-2hr40p1sv0pibvv1vvo4&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot;&gt; 		&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt; 		&lt;param name=&quot;play&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;loop&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;		&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; 		&lt;param name=&quot;devicefont&quot; value=&quot;false&quot;&gt;		&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot;&gt; 		&lt;param name=&quot;menu&quot; value=&quot;true&quot;&gt;		&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt; 		&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt; 		&lt;param name=&quot;salign&quot; value=&quot;&quot;&gt;    		&lt;embed src=&quot;http://documents.scribd.com/ScribdViewer.swf?document_id=4856008&amp;access_key=key-2hr40p1sv0pibvv1vvo4&amp;page=&amp;version=1&amp;auto_size=true&amp;viewMode=&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; play=&quot;true&quot; loop=&quot;true&quot; scale=&quot;showall&quot; wmode=&quot;opaque&quot; devicefont=&quot;false&quot; bgcolor=&quot;#ffffff&quot; name=&quot;doc_355792630051784_object&quot; menu=&quot;true&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; salign=&quot;&quot; type=&quot;application/x-shockwave-flash&quot; align=&quot;middle&quot;  height=&quot;500&quot; width=&quot;100%&quot;&gt;&lt;/embed&gt;	&lt;/object&gt; 		 				 				 				 				 		 		    			</description>
      <pubDate>Thu, 14 Feb 2008 21:00:18 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/116</guid>
    </item>
        <item>
      <title>PostgreSQL 8.3</title>
      <link>http://postgresqlrussia.org/articles/view/78</link>
      <description>&lt;p&gt;&lt;img src=&quot;http://nikolay.samokhvalov.com/wp-content/uploads/pg83/slon_new2.jpg&quot; alt=&quot;&quot; hspace=&quot;8&quot; vspace=&quot;8&quot; width=&quot;180&quot; height=&quot;151&quot; align=&quot;right&quot; /&gt;&lt;em&gt;Николай Самохвалов (nikolay at postgresmen dot ru), октябрь 2007&amp;nbsp;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;8 октября 2007 года Джош Беркус (Josh Berkus) &lt;a href=&quot;http://www.postgresql.org/about/news.872&quot; target=&quot;_blank&quot;&gt;объявил&lt;/a&gt; о выходе PostgreSQL 8.3beta1 (см. &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/release-8-3.html&quot; target=&quot;_blank&quot;&gt;официальный Changelog&lt;/a&gt;). Более полугода потребовалось разработчикам для того, чтобы завершить работу по обработке патчей (напомним, feature freeze состоялся 1-го апреля 2007 года). Так что самое время рассказать, чем же порадует нас в этот раз самая развитая из открытых СУБД в мире.&lt;br /&gt; &lt;br /&gt; Я разобью весь список на четыре части. В первой, для многих самой важной, части я перечислю изменения, которые так или иначе касаются производительности. Во второй &amp;mdash; приведу список новых возможностей для программистов баз данных, призванных ещё более расширить и без того неслабый набор &amp;laquo;фич&amp;raquo; PostgreSQL. Третья часть посвящена нововведениям, предназначенным для администраторов баз данных. И, наконец, в конце я упомяну некоторые Open Source проекты, которые являются проектами-спутниками Постгреса (другими словами, имеют свой собственный цикл разработки).&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div align=&quot;justify&quot;&gt; &lt;h4&gt;Производительность&lt;/h4&gt;  &lt;p&gt;Начнём с того, что сегодня (на данный момент стабильная ветка &amp;mdash; 8.2, актуальная версия &amp;mdash; 8.2.5) PostgreSQL успешно тягается в плане производительности не только с OpenSource-альтернативами, но и с ведущими коммерческими СУБД. Такими как Oracle. Это уже не пустой звук &amp;mdash; взгляните на результаты &lt;a href=&quot;http://postgresmen.ru/news/view/44&quot; target=&quot;_blank&quot;&gt;тестирования&lt;/a&gt;, проведённого в компании Sun. Медленных слонов больше нет! Богатейший набор типов индексов, широчайшие возможности тюнинга системы, работа с очень большими объёмами и нагрузками, хороший выбор систем репликации и масштабирования &amp;mdash; всё это &amp;laquo;по зубам&amp;raquo; современным слонам. Даже скорость разработки выгодно отличает Постгрес по сравнению с другими СУБД: каждый год мы неизменно получаем существенный шаг вперёд.&lt;br /&gt; &lt;br /&gt; Что же нового в PostgreSQL версии 8.3 в плане производительности? Многие изменения нетривиальны. По словам координатора разработки PostgreSQL Брюса Момджана (&lt;a href=&quot;http://momjian.us/&quot; target=&quot;_blank&quot;&gt;Bruce Momjian&lt;/a&gt;), нанёсшего не так давно по приглашению компании &amp;laquo;Постгресмен&amp;raquo; &lt;a href=&quot;http://postgresmen.ru/news/view/62&quot;&gt;визит в Москву&lt;/a&gt;&lt;a href=&quot;http://postgresmen.ru/news/view/62&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;, та работа по оптимизации производительности системы, которой заняты разработчики Постгреса в последние годы, является чрезвычайно сложной. Каждый шаг требует всё более и более существенных трудозатрат, занимает всё больше времени и сил разработчиков.&lt;br /&gt; &lt;br /&gt; Одним из таких действительно нетривиальных изменений можно смело считать &amp;laquo;фишку&amp;raquo; под названием &lt;strong&gt;HOT (Heap Only Tuples)&lt;/strong&gt;. Это, пожалуй, одно из самых существенных изменений в плане производительности. Чтобы понять, в чём заключается данное изменение, необходимо вспомнить, что PostgreSQL реализует так называемую мультиверсионную модель разграничения доступа (&lt;a href=&quot;http://en.wikipedia.org/wiki/Multiversion_concurrency_control&quot; target=&quot;_blank&quot;&gt;MVCC&lt;/a&gt;, Multi-Version Concurrency Control).  &lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://nikolay.samokhvalov.com/wp-content/uploads/pg83/hot1.jpg&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;278&quot; /&gt;&lt;img src=&quot;http://nikolay.samokhvalov.com/wp-content/uploads/pg83/hot2.jpg&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;277&quot; /&gt; &lt;/p&gt;&lt;p&gt;Суть HOT в следующем. Ранее, до реализации данного подхода, при обновлении строки в таблице каждая новая её версия приводила к появлению новых версий всех индексов, независимо от того, затрагивали ли данные изменения проиндексированные столбцы или нет (см. рис. &amp;laquo;Обновление без HOT&amp;raquo;). Теперь же, если новая версия строки попадает в ту же страницу памяти, что и предыдущая, и столбцы, по которым был создан индекс, не изменялись, индекс остаётся прежним. Но это ещё не всё. Если есть такая возможность, происходит &amp;laquo;моментальное&amp;raquo; повторное использование места в странице Heap. Что, естественно, сокращает объём работы, производимой при операции VACUUM. На рис. &amp;laquo;HOT-обновление&amp;raquo; схематически отображено, каким образом происходит теперь обновление строки.&lt;br /&gt; &lt;br /&gt; Следующая новинка придётся по вкусу, прежде всего, большому количеству веб-разработчиков. Начиная с версии 8.3 любую транзакцию в PostgreSQL можно делать &lt;strong&gt;&amp;laquo;асинхронной&amp;raquo;&lt;/strong&gt;.&lt;br /&gt; &lt;br /&gt; Это означает, что при выполнении операции фиксации транзакции (COMMIT) сервер PostgreSQL не будет ждать завершения дорогостоящей операции синхронизации журнала транзакций (WAL fsync). Другими словами, транзакция будет считаться успешно завершённой сразу же, как только все логические условия будут выполнены (проверены все необходимые ограничения целостности). Физически запись в журнал транзакций произойдёт через очень малый промежуток времени (как правило, для нормально функционирующих систем это максимум 200-1000 мс).За состояние транзакции (синхронная/асинхронная) отвечает переменная окружения synchronous_commit. Перейти в асинхронный режим просто: &lt;/p&gt;&lt;pre&gt;SET synchronous_commit TO OFF;&lt;/pre&gt;  &lt;p&gt;Стоит отметить, что асинхронные транзакции не являются альтернативой режиму работы сервера с отключенной операций fsync. Дело в том, что режим fsync=off может привести к получению несогласованного состояния базы (к примеру, в случае непредвиденного отказа оборудования или потери питания) и рекомендуется только в тех случаях, когда используется оборудование высокой надёжности (например, контроллер дисков с батарейкой). Использование же новой возможности никак не может привести к рассогласованию данных. Максимум, что возможно, это потеря небольшой порции данных (опять-таки, в случае жёсткого сбоя сервера &amp;mdash; ошибки ОС, оборудования, сбой питания). Типичным примером для асинхронных транзакций может служить задача сохранения большого количества информации в таблицу-журнал (например, лог действий пользователя), когда потеря нескольких строк не является критичной. При этом все важные транзакции могут по-прежнему быть синхронными. &lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://nikolay.samokhvalov.com/wp-content/uploads/pg83/synchroscans.jpg&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;179&quot; /&gt; &lt;/p&gt;&lt;p&gt;Ещё одно улучшение в области производительности относится к ситуациям, когда при выполнении запросов PostgreSQL последовательно просматривает таблицы (операция SeqScan). Если до версии 8.3 в таких случаях нередко возникали ситуации, когда разные процесса Постгреса одновременно делали одну и ту же работу &amp;mdash; просматривали одну и ту же таблицу &amp;mdash; то теперь, благодаря реализации &lt;strong&gt;Synchronized Scans (&amp;laquo;синронизованные просмотры&amp;raquo;)&lt;/strong&gt;, в один и тот же момент времени для одной таблицы может проводиться не более одной операции просмотра. Достигается это следующим образом. Если в рамках какой-либо сессии требуется проведение SeqScan-а для некоторой таблицы, для которой уже выполняется SeqScan (для другой сессии), то произойдёт &amp;laquo;прыжок на ходу&amp;raquo; к результатам уже выполняющегося SeqScan-а. По завершении данного процесса, если это необходимо, будет осуществлён &amp;laquo;добор&amp;raquo; результатов с помощью ещё одного неполного SeqScan-а (см. рис).&lt;br /&gt; &lt;br /&gt; Работа над уменьшением стресс-эффекта, производимого выполнением системой процессов checkpoint (&amp;laquo;контрольная точка&amp;raquo;) продолжается: теперь checkpoint-ы выполняются не сразу, а постепенно: процесс как бы &amp;laquo;размазан&amp;raquo; во времени. Отсюда и название данного изменения &amp;mdash; &lt;strong&gt;checkpoint smoothing&lt;/strong&gt;. Стоит отметить, что при штатном выключении сервера и проведениия &amp;laquo;явной&amp;raquo; операции checkpoint (команда &lt;a href=&quot;http://www.postgresql.org/docs/current/interactive/sql-checkpoint.html&quot; target=&quot;_blank&quot;&gt;CHECKPOINT&lt;/a&gt;) запись данных на диск по-прежнему будет производиться с максимально возможной скоростью.&lt;br /&gt; &lt;br /&gt; В завершение разговора о производительности, приведём краткий перечень других изменений, призванных улучшить быстродействие систем, использующих PostgreSQL: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;теперь &lt;strong&gt;autovacuum включён по умолчанию&lt;/strong&gt;;  &lt;/li&gt;&lt;li&gt;в некоторых ситуациях теперь возможнен &lt;strong&gt;запуск сразу нескольких процессов autovacuum&lt;/strong&gt; (например, при продолжительном процессе чистки большой таблицы, небольшие таблицы теперь не вынуждены ждать завершения данного процесса); &lt;/li&gt;&lt;li&gt;заметное &lt;strong&gt;уменьшение дискового пространства&lt;/strong&gt;, занимаемого базами данных: 1) за счёт заголовков varlena-типов (типы данных переменной длины: текст, массивы и т. п.), которые ранее занимали строго 4 байта, а теперь в некоторых ситуациях всего 1 байт; 2) за счёт экономии заголовков строк таблицы (ранее 27 байт, теперь &amp;mdash; 24); &lt;/li&gt;&lt;li&gt;&lt;strong&gt;выполнение транзакций, не модифицирующих данные, не приводит к увеличению значения счётчика транзакций (xid)&lt;/strong&gt;, что существенно снижает вероятность ситуации &amp;laquo;перекрытия&amp;raquo; счётчика транзакций (xid wraparound); кроме того, данное изменение является значительным шагом вперёд к реализации встроенной Master-Slave репликации на основе трансфера журнала транзакций &amp;mdash; теперь не возникнет рассинхронизации счётчика xid между Master- и Slave-узлами; &lt;/li&gt;&lt;li&gt;реализован &lt;strong&gt;механизм автонастройки параметров процесса bgwriter&lt;/strong&gt; (background writer &amp;mdash; специальный процесс, занимающийся записью &amp;laquo;грязных&amp;raquo; разделяемых буферов на диск);  &lt;/li&gt;&lt;li&gt;оптимизирован механизм получения результата для запросов с использованием &amp;laquo;&amp;hellip;ORDER BY &amp;hellip; LIMIT&amp;hellip;&amp;raquo; (т. н., &lt;strong&gt;Top-N sorting&lt;/strong&gt;): в некоторых случаях система удерживает необходимые страницы данных в оперативной памяти, что обеспечивает очень высокую скорость выдачи результата; &lt;/li&gt;&lt;li&gt;теперь можно задавать (пока только в виде двух констант) оценочную стоимость выполнения фунции и оценку количества рядов, которые она возвращает, что позволяет планнеру PostgreSQL выбирать лучший план запроса (пример: ALTER FUNCTION log_data(text) COST 100000 ROWS 1).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;  &lt;h4&gt;Разработчикам баз данных&lt;/h4&gt;  &lt;p&gt;Самое заметное и существенное изменение, которое следует здесь отметить, &amp;mdash; это &lt;strong&gt;миграция модуля для полнотекстового поиска (contrib/tsearch2) в ядро системы&lt;/strong&gt;. Разрабатываемый российскими разработчиками &lt;a href=&quot;http://www.sai.msu.su/%7Emegera/&quot; target=&quot;_blank&quot;&gt;Олегом Бартуновым&lt;/a&gt; и &lt;a href=&quot;http://sigaev.ru/&quot; target=&quot;_blank&quot;&gt;Фёдором Сигаевым&lt;/a&gt;, tsearch2 долгое время являлся самым популярным contrib-модулем Постгреса. Патч для миграции полнотекстового поиска в ядро, который был &lt;a href=&quot;http://postgresmen.ru/news/view/53&quot;&gt;принят этим летом&lt;/a&gt; в результате кропотливой и продолжительной работы (принятая версия патча &amp;mdash; 58!) сразу нескольких ключевых разработчиков команды PostgreSQL, является самым большим за всю историю проекта.&lt;br /&gt; &lt;br /&gt; Кроме того, что все возможности модуля tsearch2 теперь будут доступны по умолчанию и процессы миграции на новую версию PostgreSQL заметно упростятся, конфигурировать словари и правила обработки текстов теперь станет проще: все основные операции по конфигурированию осуществляются с помощью SQL-команд. Вот так, например, можно создать простой словарь-тезаурус: &lt;/p&gt;&lt;pre&gt;СREATE TEXT SEARCH DICTIONARY thesaurus_astro ( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TEMPLATE = thesaurus, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DictFile = thesaurus_astro, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dictionary = english_stem &lt;br /&gt;); &lt;br /&gt;ALTER TEXT SEARCH CONFIGURATION russian &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADD MAPPING FOR lword, lhword, lpart_hword &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WITH thesaurus_astro, english_stem;&lt;/pre&gt;  &lt;p&gt;Упростились и процессы создания индекса. Пример создания GIN-индекса над обычным текстовым столбцом (без создания дополнительных столбцов и триггеров): &lt;/p&gt;&lt;pre&gt;CREATE INDEX pgweb_idx ON pgweb &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USING gin(to_tsvector(&amp;#39;russian&amp;#39;, title || body));&lt;/pre&gt; &lt;p&gt;А вот пример запроса с ранжированием по релевантности, использующий к тому же специальную функцию plainto_tsquery для получения tsquery (позволяет забыть об экранировании символов и быстро и просто преобразовать обычный текст в tsquery): &lt;/p&gt;&lt;pre&gt;SELECT &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ts_rank_cd(textsearch_index, q) AS rank, title &lt;br /&gt;FROM &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pgweb, plainto_tsquery(&amp;#39;supernova star&amp;#39;) q &lt;br /&gt;WHERE &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; q @@ textsearch_index &lt;br /&gt;ORDER BY &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rank DESC LIMIT 10;&lt;/pre&gt; &lt;p&gt;Другое заметное изменение &amp;mdash; &lt;strong&gt;поддержка XML&lt;/strong&gt;, в работе над которой принимал участие автор данной статьи. Данный функционал реализован в соответствии со стандартом SQL:2003 (14-я часть стандарта, SQL/XML).&lt;br /&gt; &lt;br /&gt; Прежде всего, появился специальный тип данных xml, встроенный в ядро. При использовании данного типа, сервер проверяет, правильно ли сформированы данные (проверка на &lt;a href=&quot;http://www.w3.org/TR/REC-xml/#sec-well-formed&quot; target=&quot;_blank&quot;&gt;well-formedness&lt;/a&gt;). Причём возможны варианты использования, при которых разрешена работа с частями документа (это позволяет обеспечить свойство &amp;laquo;замкнутости&amp;raquo; функций для работы с XML на тип данных xml).&lt;br /&gt; &lt;br /&gt; В соответствии со стандартом SQL:2003 реализован набор функций для преобразования реляционных данных в XML (т. н., функции публикации SQL/XML). Вот простой пример запроса на формирование XML-данных: &lt;/p&gt;&lt;pre&gt;SELECT XMLROOT ( &lt;br /&gt;&amp;nbsp;&amp;nbsp; XMLELEMENT ( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NAME &amp;#39;some&amp;#39;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XMLATTRIBUTES ( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;val&amp;#39; AS &amp;#39;name&amp;#39;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 + 1 AS &amp;#39;num&amp;#39; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XMLELEMENT ( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NAME &amp;#39;more&amp;#39;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;foo&amp;#39; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) &lt;br /&gt;&amp;nbsp;&amp;nbsp; ), &lt;br /&gt;&amp;nbsp;&amp;nbsp; VERSION &amp;#39;1.0&amp;#39;, &lt;br /&gt;&amp;nbsp;&amp;nbsp; STANDALONE YES &lt;br /&gt;);&lt;/pre&gt;  &lt;p&gt;Кроме того, реализована поддержка DTD-валидации (функция xmlvalidatedtd()), поддержка оценки XPath-выражений (функция xpath(), возвращающая массив из данных типа xml ), и альтернативные функции для упрощённой публикации реляционных данных в виде XML (функции tabletoxml(), querytoxml() и другие).&lt;br /&gt; &lt;br /&gt; Для ускорения выполнения запроса к XML-данным возможно использование функциональных btree-индексов и GIN-индексов, а также использования полнотекстового поиска для XML-данных. Приведём пример создания btree-индекса по результатам оценки XPath-выражения: &lt;/p&gt;&lt;pre&gt;CREATE INDEX i_table1_xdata ON table1 USING btree( &lt;br /&gt;&amp;nbsp;&amp;nbsp; ((xpath(&amp;rsquo;//person/@name&amp;rsquo;, xdata))[1]) &lt;br /&gt;);&lt;/pre&gt;  &lt;p&gt;Что касается типов данных, PostgreSQL 8.3 представляет целый ряд нововведений: помимо встроенных в ядро системы типов tsquery/tsvector и xml, появились следующие: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;enum (перечислимые типы данных, определяемые пользователем) для удобства некоторых пользователей, в том числе мигрирующих с TheirSQL; &lt;/li&gt;&lt;li&gt;типы данных &lt;strong&gt;GUID/UUID&lt;/strong&gt; (в виде contrib-модуля);  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;массивы составных типов&lt;/strong&gt; (например, определённых пользователем типов).  &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;И наконец, краткий список остальных изменений:  &lt;/p&gt;&lt;ul&gt;&lt;li&gt;автоматическая &lt;strong&gt;инвалидация кэша плана запросов&lt;/strong&gt; для PL/pgSQL-функций;  &lt;/li&gt;&lt;li&gt;конструкции &lt;strong&gt;&amp;laquo;&lt;/strong&gt;CREATE FUNCTION &amp;hellip; RETURNS TABLE&lt;strong&gt;&amp;raquo; и &amp;laquo;&lt;/strong&gt;RETURN TABLE&amp;hellip;&lt;strong&gt;&amp;raquo;&lt;/strong&gt; для создания функций, результатом которых является таблица;  &lt;/li&gt;&lt;li&gt;поддержка &lt;strong&gt;операции обновления для курсоров&lt;/strong&gt;;  &lt;/li&gt;&lt;li&gt;стандартная (ISO/ANSI SQL) конструкция &lt;strong&gt;&amp;laquo;&lt;/strong&gt;ORDER BY &amp;hellip; NULLS FIRST/LAST&lt;strong&gt;&amp;raquo;&lt;/strong&gt; для упрощения установки порядка следования NULL-значений (также помогает при миграции с других СУБД);  &lt;/li&gt;&lt;li&gt;индексация NULL-значений в GiST-индексах.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;  &lt;h4&gt;Администраторам баз данных&lt;/h4&gt;  &lt;p&gt;Данный раздел получился куцым, ибо многое из того, что призвано улучшить жизнь DBA, описано выше :-) Тем не менее, расскажем кратко о том, что осталось.&lt;br /&gt; &lt;br /&gt; В планах запросов (команда &lt;a href=&quot;http://www.postgresql.org/docs/8.2/interactive/sql-explain.html&quot; target=&quot;_blank&quot;&gt;EXPLAIN ANALYZE&lt;/a&gt;) теперь &lt;strong&gt;видно, какой именно алгоритм сортировки был выбран и сколько памяти было израсходовано&lt;/strong&gt;:  &lt;/p&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QUERY PLAN &lt;br /&gt;------------------------------------------------------- &lt;br /&gt;&amp;nbsp;Sort (cost=34.38..34.42 rows=13 width=176) (actual time=0.946..0.948 rows=6 loops=1) &lt;br /&gt;&amp;nbsp;&amp;nbsp; Sort Key: obj2tag.o2t_tag_name &lt;br /&gt;&amp;nbsp;&amp;nbsp; Sort Method: quicksort Memory: 18kB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;-- см. сюда! &lt;br /&gt;&amp;nbsp;&amp;nbsp; -&amp;gt; Hash Join (cost=19.19..34.14 rows=13 width=176) (actual time=0.812..0.835 rows=6 loops=1) &lt;br /&gt;[...]&lt;/pre&gt;  &lt;p&gt;Специальный contrib-модуль &lt;strong&gt;pg_standby&lt;/strong&gt;, написанный Саймоном Ригсом (&lt;a href=&quot;http://www.2ndquadrant.com/&quot; target=&quot;_blank&quot;&gt;Simon Riggs&lt;/a&gt;) упростит работу администраторам, настраивающим сервер &amp;laquo;тёплого бэкапа&amp;raquo; (Warm Standby) на основе трансфера журнала логов (WAL transfer). Модуль написан на чистом C, поэтому является легко расширяемым и портируемым на новые платформы (работоспособность проверена уже, по крайней мере, на Linux и Win32).&lt;br /&gt; &lt;br /&gt; При определении функции теперь можно переопределять переменные окружения, которые будут действовать только в рамках выполнения данной функции (&lt;strong&gt;привязка значений переменных функциям&lt;/strong&gt;). Например, вот так можно указать, что выполнение функции log _data() переключает транзакцию в режим асинхронности:  &lt;/p&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALTER FUNCTION log_data(text) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET synchronous_commit TO OFF;&lt;/pre&gt;  &lt;p&gt;Ну и, по традиции, краткий список других новинок данного раздела:  &lt;/p&gt;&lt;ul&gt;&lt;li&gt;поддержка интерфейса &lt;a href=&quot;http://en.wikipedia.org/wiki/Generic_Security_Services_Application_Program_Interface&quot; target=&quot;_blank&quot;&gt;GSSAPI&lt;/a&gt;;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;улучшенная сборка на платформе Win32&lt;/strong&gt; (теперь не требуется MinGW, сборка ведётся в MS VC++, что помимо прочего приводит к улучшению производительности в Windows);  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;создание таблиц по подобию с учётом индексов&lt;/strong&gt; (пример: CREATE TABLE dict2 (LIKE dictionary INCLUDING INDEXES)).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;  &lt;h4&gt;Дополнительные проекты&lt;/h4&gt;  &lt;p&gt;Компания &lt;a href=&quot;http://enterprisedb.com/&quot; target=&quot;_blank&quot;&gt;EnterpriseDB&lt;/a&gt; (сотрудники которой являются активным разработчиками PostgreSQL, многие изменения версии 8.3 в области производительности являются именно их заслугой) выпустила &lt;strong&gt;отладчик &lt;/strong&gt;&lt;a href=&quot;http://pgfoundry.org/projects/edb-debugger/&quot; target=&quot;_blank&quot;&gt;pldebugger&lt;/a&gt;, который представляет собой contrib-модуль, позволяющий отлаживать PL/pgSQL-функции в стандартном инструменте для администрирования &lt;a href=&quot;http://www.pgadmin.org/&quot; target=&quot;_blank&quot;&gt;pgAdminIII&lt;/a&gt; и осуществлять профайлинг.  &lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://nikolay.samokhvalov.com/wp-content/uploads/pg83/pldebugger.jpg&quot; alt=&quot;&quot; width=&quot;350&quot; height=&quot;318&quot; /&gt;  &lt;/p&gt;&lt;p&gt;Проект в данный момент существует в виде независимого contrib-модуля (представлен на &lt;a href=&quot;http://pgfoundry.org/&quot; target=&quot;_blank&quot;&gt;PgFoundry&lt;/a&gt;) и работает на большом количестве платформ (включая Linux и Win32). Стоит отметить, что данный модуль работает и с версией 8.2 Постгреса. &lt;/p&gt;&lt;p&gt; &lt;img src=&quot;http://nikolay.samokhvalov.com/wp-content/uploads/pg83/plproxy.jpg&quot; alt=&quot;&quot; hspace=&quot;6&quot; vspace=&quot;6&quot; width=&quot;200&quot; height=&quot;198&quot; align=&quot;right&quot; /&gt; Как мы &lt;a href=&quot;http://postgresmen.ru/articles/view/25&quot;&gt;рассказывали не так давно&lt;/a&gt;, компания &lt;a href=&quot;http://skype.com/&quot; target=&quot;_blank&quot;&gt;Skype&lt;/a&gt; (которая использует в широко известном одноимённом проекте именно PostgreSQL) выпустила в Open Source сразу несколько продуктов, которые могут быть полезны большому кругу разработчиков. Среди них прежде всего стоит отметить псевдо-язык &lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/PlProxy&quot; target=&quot;_blank&quot;&gt;PL/Proxy&lt;/a&gt;, позволяющий организовывать горизонтальное масштабирование практически без ограничений (при условии, если вся бизнес-логика приложения реализована в виде хранимых процедур), чрезвычайно лёгкий менеджер соединений &lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer&quot; target=&quot;_blank&quot;&gt;PgBouncer&lt;/a&gt;. Загляните на страничку &lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/&quot; target=&quot;_blank&quot;&gt;Skype Developers Zone&lt;/a&gt;, вы найдёте много интересного!&lt;br /&gt; &lt;br /&gt; На рубеже весны и лета 2007-го года вышла версия 1.0 простого и удобного &lt;strong&gt;инструмента для анализа логов &lt;/strong&gt;&lt;a href=&quot;http://pgfouine.projects.postgresql.org/&quot; target=&quot;_blank&quot;&gt;pgFouine&lt;/a&gt;. Данная программа поможет вам узнать, чем же занимался ваш процессор (процессоры) сервера баз данных. pgFoiune анализирует логи запросов Постгреса (при включении журнализации запросов рекомендуется вводить ограничение по времени снизу, см. описание параметра &lt;a href=&quot;http://www.postgresql.org/docs/current/static/runtime-config-logging.html#GUC-LOG-MIN-DURATION-STATEMENT&quot; target=&quot;_blank&quot;&gt;log_min_duration_statement&lt;/a&gt;), предоставляя отчёты по самым медленным запросам, ошибкам и общую статистику (см. &lt;a href=&quot;http://pgfouine.projects.postgresql.org/reports.html&quot; target=&quot;_blank&quot;&gt;примеры&lt;/a&gt;). Тем самым данный инструмент позволяет разработчику баз данных понять, какие запросы можно улучшить, чтобы ускорить работу приложения, использующего PostgreSQL.&lt;br /&gt; &lt;br /&gt; И наконец, кратко об остальных продуктах:  &lt;/p&gt;&lt;ul&gt;&lt;li&gt;проект &lt;a href=&quot;http://pgsnmpd.projects.postgresql.org/&quot; target=&quot;_blank&quot;&gt;pgSNMP&lt;/a&gt; является реализацией SNMP-агента для PostgreSQL (мониторинг состояния сервера);  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;SEPostgres&lt;/strong&gt; &amp;ndash; расширение, основанное на модели обеспечения усиленной безопасности &lt;a href=&quot;http://en.wikipedia.org/wiki/SELinux&quot; target=&quot;_blank&quot;&gt;SELinux&lt;/a&gt;;  &lt;/li&gt;&lt;li&gt;создан инструмент, создающий рекомендации администратору баз данных по созданию индексов и показывающий возможный план выполнения запроса при условии наличия таких индексов (&lt;strong&gt;Index Advisor&lt;/strong&gt;);  &lt;/li&gt;&lt;li&gt;в известном инструменте для web-администрирования &lt;strong&gt;phppgadmin&lt;/strong&gt; появились (или вот-вот появятся) возможности &lt;strong&gt;настройки Slony-кластера, полнотекстового поиска, параметров автовакуума&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;  &lt;h4&gt;Заключение&lt;/h4&gt;  &lt;p&gt;Версия 8.3 является очередным шагом на пути к полноценной системе управления баз данных для корпоративного использования. Нетривиальные улучшения в области производительности, появление возможностей, которые продиктованы нуждами пользователей, расширение множества проектов-спутников &amp;mdash; всё это демонстрирует уверенное и быстрое развитие PostgreSQL.&lt;br /&gt; &lt;br /&gt; При написании данного обзора автор использовал следующие источники:  &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://developer.postgresql.org/index.php/WhatsNew83&quot; target=&quot;_blank&quot;&gt;pgwiki/WhatsNew83&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://developer.postgresql.org/index.php/Feature_Matrix&quot; target=&quot;_blank&quot;&gt;pgwiki/Feature_Matrix&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://developer.postgresql.org/index.php/8.3_Changelog&quot; target=&quot;_blank&quot;&gt;pgwiki/8.3_Changelog&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://developer.postgresql.org/index.php/Todo:PatchStatus&quot; target=&quot;_blank&quot;&gt;pgwiki/Todo:PatchStatus&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;Доклад Брюса Момджана на конференции Highload-2007, Москва (&lt;a href=&quot;http://momjian.us/main/writings/pgsql/features.pdf&quot; target=&quot;_blank&quot;&gt;pdf&lt;/a&gt;).  &lt;/li&gt;&lt;li&gt;Официальная &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/index.html&quot; target=&quot;_blank&quot;&gt;документация PostgreSQL 8.3&lt;/a&gt;.  &lt;/li&gt;&lt;li&gt;Архив рассылки &lt;a href=&quot;http://archives.postgresql.org/pgsql-hackers/&quot; target=&quot;_blank&quot;&gt;pgsql-hackers&lt;/a&gt;.  &lt;/li&gt;&lt;/ul&gt; &lt;/div&gt;</description>
      <pubDate>Mon, 8 Oct 2007 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/78</guid>
    </item>
        <item>
      <title>PostgreSQL: аналитика для DBA</title>
      <link>http://postgresqlrussia.org/articles/view/48</link>
      <description>&lt;p&gt;&lt;em&gt;Автор: Иван Золотухин&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Многие пользователи СУБД PostgreSQL знают, что сервер во время своей работы собирает разнообразную статистику, но не все знают, что ее полезно анализировать и как ее извлекать для этого. В этом небольшом тулките собраны несколько полезных запросов, дающих некоторое представление о том, как использовать это &amp;quot;скрытое знание&amp;quot;, которое постоянно копится. Эти запросы можно использовать для мониторинга состояния PostgreSQL (ручного или с помощью плагинов для систем мониторинга вроде Nagios, Cacti или Zabbix), для поиска узких мест в работе сервера и многих других подобных задач. Помните, что это лишь верхушка айсберга; в документации можно найти описания нескольких десятков системных представлений, которые также могут быть полезны администратору PostgreSQL.&lt;/p&gt;&lt;p&gt;Для корректной работы тулкита необходимо включить опции &lt;em&gt;stats_block_level&lt;/em&gt; и &lt;em&gt;stats_row_level&lt;/em&gt; в &lt;em&gt;postgresql.conf&lt;/em&gt;, а также настроить параметр &lt;em&gt;stats_reset_on_server_start&lt;/em&gt; по своему усмотрению. Если при каждом перезапуске сервера PostgreSQL вы меняете какие-то существенные параметры его конфигурации, имеет смысл обнулять статистику, чтобы отслеживать эффект внесенных изменений. Если же вас интересует долгосрочная перспектива и рестарт производится не вследствие изменения конфигурации PostgreSQL, ставьте параметр &lt;em&gt;stats_reset_on_server_start&lt;/em&gt; в значение &lt;em&gt;off.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;Отношение hit / read &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;При выполнении запроса PostgreSQL сначала смотрит, есть ли нужные в запросе данные в разделяемой памяти (shared buffers). Если они найдены, засчитывается hit, если нет -- делается сравнительно медленный системный вызов fread для поднятия данных с диска или из дискового кеша операционной системы и засчитывается read. В среднем, верно правило: чем больше отношение hit/read, тем лучше настроен PostgreSQL, так как он очень мало читает с диска, в основном извлекая данные из разделяемой памяти. Для большинства не очень больших баз это отношение должно лежать в пределах 5000-10000. Не стремитесь, однако, искусственно завысить настройку &lt;em&gt;shared_buffers&lt;/em&gt;, которая прямо определяет hit/read: слишком большие размеры разделяемой памяти ведут к потере производительности в базах с интенсивной записью. Также стоит помнить, что fread может быть довольно быстрым, если данные находятся в дисковом кеше ОС.  &lt;/p&gt;&lt;blockquote&gt; &lt;pre&gt;SELECT &lt;br /&gt;  datname, &lt;br /&gt;  CASE &lt;br /&gt;    WHEN blks_read = 0 THEN 0 &lt;br /&gt;    ELSE blks_hit / blks_read &lt;br /&gt;  END AS ratio &lt;br /&gt;FROM &lt;br /&gt;  pg_stat_database;&lt;/pre&gt; &lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Количество модификаций, произошедших в таблице&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Список по таблицам: какое количество записей в них было добавлено, изменено и удалено с момента последнего сброса статистики. Администратор БД должен представлять, какие таблицы являются самыми нагруженными в текущей базе данных, а также каково соотношение между различными типами модифицирующих запросов к ним.  &lt;/p&gt;&lt;blockquote&gt; &lt;pre&gt;SELECT &lt;br /&gt;  relname, &lt;br /&gt;  n_tup_ins, &lt;br /&gt;  n_tup_upd, &lt;br /&gt;  n_tup_del &lt;br /&gt;FROM &lt;br /&gt;  pg_stat_user_tables &lt;br /&gt;ORDER BY &lt;br /&gt;  n_tup_upd DESC;&lt;br /&gt;&lt;/pre&gt; &lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Статистика &lt;/strong&gt;&lt;strong&gt;seq scan / index scan&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Список по таблицам: какое количество запросов к ним было выполнено посредством последовательного просмотра; какое количество запросов было выполнено с использованием индексов; а также отношение этих двух чисел. Позволяет оценить, все ли нужные индексы созданы в данной таблице. Если ваши таблицы содержат более нескольких тысяч рядов, последовательный просмотр будет выполняться медленнее просмотра индекса, поэтому в идеальном случае seqscan-ов в таких таблицах быть не должно. Если у вас они все же есть, анализируйте запросы к таким таблицам и создавайте соответствующие индексы. При этом важно не перестараться: чем больше индексов по колонкам таблицы, тем дороже становятся операции обновления данных. &lt;/p&gt;&lt;p&gt;Также не забывайте, что после создания индекса таблице нужно делать &lt;em&gt;ANALYZE&lt;/em&gt;, иначе планировщик запросов не заметит изменений в структуре таблицы. &lt;/p&gt;&lt;blockquote&gt; &lt;pre&gt;SELECT &lt;br /&gt;  relname, &lt;br /&gt;  seq_scan, &lt;br /&gt;  idx_scan, &lt;br /&gt;  CASE &lt;br /&gt;    WHEN idx_scan = 0 THEN 100 &lt;br /&gt;    ELSE seq_scan / idx_scan &lt;br /&gt;  END AS ratio &lt;br /&gt;FROM &lt;br /&gt;  pg_stat_user_tables &lt;br /&gt;ORDER BY &lt;br /&gt;  ratio DESC;&lt;br /&gt;&lt;/pre&gt; &lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Статистика по индексам&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Список по индексам: сколько записей из индекса были использованы в запросах по этому индексу; сколько рядов при этом получилось достать из родительской таблицы; разность этих двух чисел. Суть данной статистики проста: если у вас большая разница read-ов и fetch-ей, значит индекс устарел и ссылается на уже несуществующие данные, т.е. не всякий просмотр индекса и чтение из него соответствующего указателя на данные из таблицы (read) вызывает чтение самих данных из таблицы (fetch). В этом случае необходимо перестроить данный индекс, чтобы он соответствовал реальным данным в таблице. &lt;/p&gt;&lt;blockquote&gt; &lt;pre&gt;
SELECT
  indexrelname,
  idx_tup_read,
  idx_tup_fetch,
  (idx_tup_read - idx_tup_fetch),
  CASE WHEN idx_tup_read = 0 THEN 0 ELSE (idx_tup_read::float4 -
idx_tup_fetch) / idx_tup_read END as r
FROM
  pg_stat_user_indexes
ORDER BY r desc;
&lt;/pre&gt; &lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Выполняющиеся запросы с их продолжительностью&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Простой список выполняющихся сервером в настоящий момент запросов. Бывает полезен, когда вы недостаточно хорошо знаете систему или просто не успели ее настроить -- с его помощью можно найти и прервать &amp;quot;плохой&amp;quot; запрос, который мешает работе сервера (колонка procpid содержит PID процесса, которому можно сделать &lt;em&gt;kill&lt;/em&gt; при необходимости). Помните, однако, что простой периодический просмотр выполняющхся запросов ни в коем случае не заменит замечательный анализатор логов &lt;a href=&quot;http://pgfouine.projects.postgresql.org/&quot; title=&quot;pgFouine - анализатор логов PostgreSQL&quot;&gt;&lt;em&gt;pgFouine&lt;/em&gt;&lt;/a&gt;. Также не стоит забывать, что процесс, в котором вы выполняете данный запрос, тоже попадает в результирующий список.  &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;SELECT &lt;br /&gt;  datname, &lt;br /&gt;  NOW() - query_start AS duration, &lt;br /&gt;  procpid, &lt;br /&gt;  current_query	&lt;br /&gt;FROM&lt;br /&gt;  pg_stat_activity &lt;br /&gt;ORDER BY duration DESC;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Список текущих блокировок&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Список текущих блокировок с указанием типа блокировки, таблицы и базы данных, на которой она выставлена и номера транзакции, которая выставила блокировку. Не стоит пугаться, если запрос выдает длинный список lock-ов -- не все они являются критическими и блокирующими таблицу от всех возможных изменений и даже чтения. Для анализа списка блокировок обязательно стоит ознакомиться с документацией об их типах в PostgreSQL и о том, когда и какими запросами они выставляются. Один из распространенных случаев, когда список блокировок может пригодиться: выполняя команду &lt;em&gt;ps aux | grep ^postgres &lt;/em&gt;вы видите, что в статусе одного из процессов postgres-а написано waiting -- это как раз и означает, что данный процесс ждет, когда будет снята нужная ему блокировка. Какая именно -- выясняйте, запустив данный запрос.  &lt;/p&gt;&lt;blockquote&gt; &lt;pre&gt;SELECT &lt;br /&gt;  l.mode, &lt;br /&gt;  d.datname, &lt;br /&gt;  c.relname, &lt;br /&gt;  l.granted, &lt;br /&gt;  l.transactionid &lt;br /&gt;FROM &lt;br /&gt;  pg_locks AS l &lt;br /&gt;LEFT JOIN pg_database AS d ON l.database= d.oid &lt;br /&gt;LEFT JOIN pg_class AS c ON l.relation = c.oid;&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;Автор выражает благодарность Максиму Богуку за ряд ценных замечаний.&lt;/em&gt; &lt;br /&gt;&lt;em&gt;Any feedback is welcome at iz at sai dot msu dot ru&lt;br /&gt;Sep 2007&lt;/em&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 8 Sep 2007 19:54:28 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/48</guid>
    </item>
        <item>
      <title>Библиотека полезных функций для PostgreSQL</title>
      <link>http://postgresqlrussia.org/articles/view/39</link>
      <description>&lt;p&gt;&lt;em&gt;Автор компиляции: Иван Золотухин&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Данная статья содержит выборку PL/PgSQL и SQL функций, которые могут быть полезны разработчикам и администраторам PostgreSQL, а также всем желающим познакомиться с основными процедурными языками в СУБД PostgreSQL на работающих примерах. Большая часть этих функций обсуждалась в англоязычных рассылках и иных каналах общения членов сообщества PostgreSQL, некоторые функции написаны мною. Где это возможно, у функций приведены авторы и небольшие комментарии. Сам лист функций время от времени пополняется, так что следите за изменениями, если примеры представляют для вас интерес.&lt;br /&gt;  &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt;

&lt;h2&gt;Генерация случайного пароля&amp;nbsp;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Вариант 1&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;
-- Author: Magnus Hagander
CREATE FUNCTION generate_random_password() RETURNS text
   AS $$
DECLARE
  j int4;
  result text;
  allowed text;
  allowed_len int4;
BEGIN
  allowed := '23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ&amp;#%@';
  allowed_len := length(allowed);
  result := '';
  WHILE length(result) &lt; 16 LOOP
     j := int4(random() * allowed_len);
     result := result || substr(allowed, j+1, 1);
  END LOOP;
  RETURN result;
END;
$$
   LANGUAGE plpgsql;
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Вариант 2&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;
-- Author: Jeff Ross
CREATE OR REPLACE FUNCTION gen_password() RETURNS text AS $$
DECLARE
  password text;
  chars text;
BEGIN
  password := '';
  chars :=
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  FOR i IN 1..8 LOOP
    password := password || SUBSTRING(chars,
ceil(random()*LENGTH(chars))::integer, 1);
  END LOOP;
  return password;
END;
$$
LANGUAGE plpgsql;
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;br /&gt;
&lt;h2&gt;Работа с интервалами: сдвиг на N месяцев&lt;/h2&gt;&lt;br /&gt;
Простая функция на языке SQL для добавления или вычитания из даты заданного количества месяцев.
&lt;blockquote&gt;
&lt;pre&gt;
-- Author: Martijn van Oosterhout
CREATE OR REPLACE FUNCTION GOMONTH(DATE, INTEGER, OUT DATE) IMMUTABLE AS
$_$
SELECT ($1 + ($2 * '1 MONTH'::INTERVAL))::DATE;
$_$ LANGUAGE SQL
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;br /&gt;
&lt;h2&gt;Найти всех пользователей данной роли&lt;/h2&gt;&lt;br /&gt;
Рекурсивная функция поиска всех ролей, принадлежащих данной роли. То есть, если роль ID1 имеет членов ID2 и ID3, а в роль ID2 входят роли ID4 и ID5, то функция вернет список всех этих ролей.
&lt;blockquote&gt;
&lt;pre&gt;
-- Author: David Fetter
CREATE OR REPLACE FUNCTION get_roles_under(OID)
RETURNS SETOF OID
LANGUAGE sql
AS $$
SELECT
   $1
UNION
SELECT
   member
FROM
   pg_catalog.pg_auth_members
WHERE
   roleid = $1
UNION
SELECT
   get_roles_under(roleid) AS &quot;roleid&quot;
FROM
   pg_catalog.pg_auth_members
WHERE
   roleid IN (
       SELECT
           member
       FROM
           pg_catalog.pg_auth_members
       WHERE
           roleid = $1
   )
$$;
&lt;/pre&gt;
&lt;/blockquote&gt;


&lt;br /&gt;
&lt;h2&gt;Kill бакенда и получение имени текущего пользователя&lt;/h2&gt;&lt;br /&gt;
Довольно глупый, но тем не менее reference-пример прекращения работы бакенда и получения имени пользователя, вызывающего функцию:
&lt;blockquote&gt;
&lt;pre&gt;
CREATE FUNCTION kill_process(integer) RETURNS boolean
AS 'SELECT pg_cancel_backend(procpid)
     FROM (SELECT procpid FROM pg_stat_activity WHERE procpid=$1 and usename=session_user)
AS kill;'
LANGUAGE SQL SECURITY DEFINER;
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;br /&gt;
&lt;h2&gt;Начало и конец недели по ее номеру в году&lt;/h2&gt;&lt;br /&gt;
Работа с функциями, связанными со временем:
&lt;blockquote&gt;
&lt;pre&gt;
-- Author: Andreas Kretschmer
create or replace function get_week(IN jahr int, IN kw int) returns text as $$
declare
       datum   date;
       ret     text;
begin
       datum = (jahr || '-01-01')::date;

       loop
               exit when extract(dow from datum) = 4;
               datum = datum + '1day'::interval;
       end loop;
       ret = to_char(datum+(7*(kw-1)-3||'days')::interval,'dd-mm-yyyy') || ' - ' || to_char(datum+(3+7*(kw-1)||'days')::interval,'dd-mm-yyyy');
       return ret;
end;
$$ language plpgsql immutable strict;

-- Example:
test=# select get_week(2007,2);
        get_week         
-------------------------
 08-01-2007 - 14-01-2007
&lt;/pre&gt;
&lt;/blockquote&gt;



&lt;br /&gt;
&lt;h2&gt;Манипуляции с хозяином/пермиссиями таблиц и функций в схеме&lt;/h2&gt;&lt;br /&gt;

&lt;p&gt;&lt;strong&gt;Таблицы&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Функция для изменения прав доступа к таблицам в заданной схеме по заданной LIKE-маске. Администраторам должно быть удобно на основании этого прототипа также сделать функции revoke_on_tables() и change_owner_of_tables() -- они будут использовать абсолютно такой же цикл, только динамический SQL внутри него будет несколько иной.
&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;
-- Author: Ivan Zolotukhin
-- License: BSD
CREATE OR REPLACE FUNCTION grant_on_tables(role_name text, permission text, mask text, schema_name text)
RETURNS integer LANGUAGE plpgsql 
	AS $$
-- Function that grants given permissions to given role on tables with given LIKE mask within given schema
-- Example:
--   SELECT grant_on_tables('role_developer','SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCE, TRIGGER','%','public');
-- will grant all the maximum permissions on all tables within public schema to role_developer role
DECLARE
	obj record;
	num integer;
BEGIN
	num := 0;
	FOR obj IN 
		SELECT 
			relname 
		FROM 
			pg_class c
		JOIN pg_namespace ns ON (c.relnamespace = ns.oid) 
		WHERE
			relkind in ('r','v','S') 
			AND nspname = schema_name 
			AND relname LIKE mask
		ORDER BY
		    relname
	LOOP
		EXECUTE 'GRANT ' || permission || ' ON ' || obj.relname || ' TO ' || role_name;
		RAISE NOTICE '%', 'Done: GRANT ' || permission || ' ON ' || obj.relname || ' TO ' || role_name;
		num := num + 1;
	END LOOP;
	RETURN num;
END;
$$;
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Функции&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Эта функция является вспомогательной и как правило ее не нужно вызывать руками. Она нужна для получения необходимой информации об аргументах функций, так как в PostgreSQL для манипуляций с хозяином или пермиссиями функции требуется указывать fully-qualified имя со списком аргументов.&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;
-- Author: Ivan Zolotukhin
-- License: BSD
CREATE OR REPLACE FUNCTION pg_get_function_args( 
	IN funcname character varying, 
	IN funcargs oidvector,	
	IN schema character varying, 
	OUT pos integer, 
	OUT direction character, 
	OUT argname character varying, 
	OUT datatype character varying) RETURNS SETOF RECORD 
	AS $$
-- For a function name and schema, this procedure selects for each argument the following data: 
-- 		- position in the argument list (0 for the return value) 
--		- direction 'i', 'o', or 'b' 
--		- name (NULL if not defined) 
--		- data type
DECLARE 
	rettype character varying; 
	argtypes oidvector; 
	allargtypes oid[]; 
	argmodes &quot;char&quot;[]; 
	argnames text[]; 
	mini integer; 
	maxi integer; 
BEGIN 
	/* get object ID of function */ 
	SELECT INTO 
		rettype, 
		argtypes, 
		allargtypes, 
		argmodes, 
		argnames 
		CASE 
			WHEN 
				pg_proc.proretset 
			THEN 
				'setof ' || pg_catalog.format_type(pg_proc.prorettype, NULL) 
			ELSE 
				pg_catalog.format_type(pg_proc.prorettype, NULL) 
		END, 
		pg_proc.proargtypes, 
		pg_proc.proallargtypes, 
		pg_proc.proargmodes, 
		pg_proc.proargnames 
	FROM 
		pg_catalog.pg_proc 
	JOIN pg_catalog.pg_namespace ON (pg_proc.pronamespace = pg_namespace.oid) 
	WHERE 
		pg_proc.proname = funcname 
		AND pg_proc.proargtypes = funcargs
		AND pg_namespace.nspname = schema 
		AND pg_catalog.pg_function_is_visible(pg_proc.oid); 

	/* bail out if not found */ 
	IF NOT FOUND THEN 
		RETURN; 
	END IF; 

	/* return a row for the return value */ 
	pos = 0; 
	direction = 'o'::char; 
	argname = 'RETURN VALUE'; 
	datatype = rettype; 
	RETURN NEXT; 

	/* unfortunately allargtypes is NULL if there are no OUT parameters */ 
	IF allargtypes IS NULL THEN 
		mini = array_lower(argtypes, 1); 
		maxi = array_upper(argtypes, 1); 
	ELSE 
		mini = array_lower(allargtypes, 1); 
		maxi = array_upper(allargtypes, 1); 
	END IF; 

	IF maxi &lt; mini THEN 
		RETURN; 
	END IF; 

	/* loop all the arguments */ 
	FOR i IN mini .. maxi 
	LOOP 
		pos = i - mini + 1; 
		IF argnames IS NULL THEN 
			argname = NULL; 
		ELSE 
			argname = argnames[i]; 
		END IF; 

		IF allargtypes IS NULL THEN 
			direction = 'i'::char; 
			datatype = pg_catalog.format_type(argtypes[i], NULL); 
		ELSE 
			direction = argmodes[i]; 
			datatype = pg_catalog.format_type(allargtypes[i], NULL); 
		END IF; 
		RETURN NEXT; 
	END LOOP; 
	RETURN; 
END;$$ 
LANGUAGE plpgsql STABLE STRICT SECURITY INVOKER; 
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;А этот пример представляет непосредственный интерес. Функция выдает необходимые пермиссии всем функциям с названиями, удовлетворяющим LIKE-маске в заданной схеме:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;
-- Author: Ivan Zolotukhin
-- License: BSD
CREATE OR REPLACE FUNCTION grant_on_functions(role_name text, permission text, mask text, schema_name text)
RETURNS integer LANGUAGE plpgsql 
	AS $$
-- Function that grants given permissions to given role on functions with given LIKE mask within given schema
-- Example:
--   SELECT grant_on_functions('role_developer','EXECUTE','%','public');
-- will grant the execute permission on all functions within public schema to role_developer role
DECLARE
	func record;
	func_argument record;
	argument_list varchar;
	num integer;
BEGIN
	num := 0;
	/* select all function's names in given schema */
	FOR func IN 		
		SELECT
			proname, proargtypes
		FROM
			pg_proc AS pro
		JOIN pg_namespace AS ns ON pro.pronamespace = ns.oid
		WHERE
			ns.nspname = schema_name
			AND proname LIKE mask
			AND pg_catalog.pg_function_is_visible(pro.oid)
	    ORDER BY
	        proname
	LOOP
		argument_list := '(';
		-- get input arguments of the function we're granting permissions on
		FOR func_argument IN
			SELECT datatype FROM pg_get_function_args(func.proname::varchar, func.proargtypes::oidvector, schema_name) WHERE direction = 'i'
		LOOP
			argument_list := argument_list || func_argument.datatype || ', ';
		END LOOP;
		
		SELECT INTO argument_list rtrim(argument_list, ', ');
		argument_list := argument_list || ')';
		
		-- grant permissions when we know complete function designation like
		-- my_best_function(varchar, text, integer, float)
		EXECUTE 'GRANT ' || permission || ' ON FUNCTION ' || schema_name || '.' || func.proname || argument_list || ' TO ' || role_name;
		RAISE NOTICE '%', 'Done: GRANT ' || permission || ' ON FUNCTION ' || schema_name || '.' || func.proname || argument_list || ' TO ' || role_name;
		num := num + 1;
	END LOOP;
	RETURN num;

END;
$$;	
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Как и в случае с таблицами, администратору может быть удобно использовать функцию change_owner_of_functions(), которая практически не будет отличаться от приведенного выше примера.&lt;/p&gt;



&lt;p&gt;&lt;em&gt;Any feedback is welcome at iz at sai dot msu dot ru&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Jun 2007 &lt;/em&gt;
&lt;/p&gt;</description>
      <pubDate>Fri, 8 Jun 2007 00:20:08 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/39</guid>
    </item>
        <item>
      <title>Инструкция по оптимизации PostgreSQL 8.x</title>
      <link>http://postgresqlrussia.org/articles/view/38</link>
      <description>&lt;p&gt;Перед вами набор простых правил настройки сервера PostgreSQL. Большая часть этих идей была высказана в оригинальной статье &lt;a href=&quot;http://www.powerpostgresql.com/PerfList&quot;&gt;PostgreSQL Performance Checklist&lt;/a&gt; Джошем Беркусом (Josh Berkus); сотрудники компании &amp;quot;Постгресмен&amp;quot; добавили к этому листу ряд важных пунктов, адаптировав некоторые места под более актуальные версии PostgreSQL. Статья написана так, чтобы администратор баз данных мог в течение получаса оптимизировать PostgreSQL, усвоив основные принципы его настройки. &lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Пять основных принципов настройки PostgreSQL-сервера&lt;/strong&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Диски&amp;gt;Память&amp;gt;ЦПУ&lt;/strong&gt; Если вы решили купить сервер под базу данных, лучше выбрать массив дисков с высокой производительностью, средний процессор и соответствующую память. Если ваш бюджет не позволяет вложиться в дисковый массив, лучше взять побольше памяти. Как и любая ACID-совместимая СУБД, PostgreSQL очень сильно зависит от скорости обмена данными, и редкое приложение, использующее Postgres, требует больше от процессора, чем от SCSI (хотя, бывают и такие). Это относится как к маленьким приложениям, так и к огромным, так что покупайте топовый процессор, только если кроме него хватит денег на дорогой RAID-контроллер из последней линейки хорошего производителя вроде LSI, 3ware или Areca и много дисков. &lt;em&gt;(Важное замечание: в наши дни память уже не является такой дорогой, поэтому внимательно проанализируйте вашу ситуацию &lt;/em&gt;&amp;mdash;&lt;em&gt; если вы разрабатываете web-приложение, то вероятность того, что вам удастся добиться того, что большая часть ваших данных будет располагаться в RAM, достаточно высока. Поэтому не торопитесь, может быть, вам повезло и в вашем случае диски не являются узким местом.)&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Много дисков == хорошо! &lt;/strong&gt;Имея много дисков, PostgreSQL, как и многие операционные системы, разделяет запросы на чтение и запись в базу данных. Это сразу заметно для всех приложений, база данных которых не помещается в оперативную память. При том, что минимальный размер винчестера сейчас равен 72 Гб и можно попробовать обойтись одним диском или одной RAID 1 mirrored парой, используя 2, 4, 6 или даже 14 дисков, вы значительно повысите производительность. Ну, и, конечно же, SCSI дает гораздо больший выигрыш, чем IDE, даже с Serial ATA.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Отделите логи транзакций от базы данных&lt;/strong&gt; Предположим, что вы уже потратили деньги на достойный массив дисков. Мало просто засунуть их в один RAID. Выделение для лога транзакций (pg_xlog) собственных дисковых ресурсов (массива или просто отдельного диска) дает как минимум 12% выигрыш для нагруженных систем. Это жизненно важно и для небольших серверов, особенно с медленными SCSI или IDE дисками: даже на машине с двумя дисками можно выселить лог транзакций на диск с операционной системой и получить при этом существенный выигрыш в производительности.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;RAID 1+0/0+1&amp;gt;RAID 5&lt;/strong&gt; RAID 5 с тремя дисками уже стал эталоном неудачных бюджетных серверов. Это, вероятно, наихудшая комбинация для PostgreSQL: вы сможете получить не более 50% от той производительности, которая была бы у вас с одним SCSI диском. Если у вас массив из 2, 4 или 6 дисков, то лучше остановиться на RAID 1, или 1+0, или 0+1. Когда дисков больше 6, RAID 5 восстанавливает свои позиции, и выбирать конкретную схему RAID нужно уже в зависимости от вашего контроллера. Имейте в виду, что зачастую использование программного RAID более предпочтительно, особенно если в сервере установлен дешевый контроллер вроде встроенного от Adaptec (&lt;em&gt;Важное замечание: стоит отметить, что дешевые RAID-контроллеры зачастую проигрывают программному RAID и это относится не только к Adaptec, но и к LSI, 3ware и другим&lt;/em&gt;.) &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Приложения должны жить дружно&lt;/strong&gt; Многие компании допускают одну и ту же ошибку: ставят на сервер вместе с PostgreSQL другие приложения, которые начинают бороться с ним за одни и те же ресурсы. Хуже того, бывает, что на одной машине стоит несколько СУБД. Они сражаются за пропусную способность винчестера и за дисковый кэш операционной системы. В итоге все СУБД работают плохо. Почти так же дело обстоит, если PostgreSQL работает на сервере документооборота или системы слежения за безопасностью, которая ведет активное журналирование. PostgreSQL может хорошо работать только вместе с приложениями, которые больше зависят от мощности процессора, чем от производительности дисков. Например, при достаточном количестве оперативной памяти, с PostgreSQL хорошо уживается веб-сервер от Apache. &lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Десять параметров, которые нужно менять в postgresql.conf &lt;/h3&gt;&lt;p&gt;Количество параметров, которые появились в основном конфигурационном файле PostgreSQL, postgresql.conf, просто пугает. Даже те функции, которые были знакомы по предыдущим версиям, сменили свое название. Все это сделано для того, чтобы обеспечить администратору базы данных большую свободу, но к нововведениям нужно привыкнуть.&lt;/p&gt;&lt;p&gt;Ниже перечислены основные параметры, которые меняют опытные администраторы БД в стремлении улучшить производительность. Конечно, есть еще и другие настройки, в которые пользователи боятся вмешиваться, но изменение которых может оказаться просто необходимым -- они остаются за рамками данного мини-обзора.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Замечание: если вы комментируете какой-либо параметр в postgresql.conf, это совсем не значит, что он принимает первоначальное значение по умолчанию. PostgreSQL будет помнить значение его последней настройки.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Соединения&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;&lt;strong&gt;listen_adresses:&lt;/strong&gt;&lt;/span&gt; заменяет tcp_ip и virtual_hosts из PostgreSQL 7.4. По умолчанию, как правило, устанавливается разрешение только на соединение в пределах сервера через локальный сокет (&amp;quot;localhost&amp;quot;). Многие администраторы БД предпочитают указывать &amp;quot;*&amp;quot;, чтобы PostgreSQL слушал все доступные сетевые интерфейсы для возможности (после добавления соответствующих настроек в файл pg_hba.conf) устанавливать соединение по сети.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;max_connections:&lt;/strong&gt; как и в более ранних версиях, нужно указать максимально количество возможных одновременных соединений, которое вам может понадобиться. Если задать большие значения, вам может понадобиться больше разделяемой памяти (shared_buffers). Так как ограничение на число соединений, как у ОС, так и у PostgreSQL может быть довольно большим, то имеет смысл группировать соединения. Например, для среднего однопроцессорного 32-битного linux-сервера уже 150 соединений будут вполне ощутимы, а 600 соединений будут пределом возможностей. Для более мощных серверов эти числа, конечно, больше.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Память&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;shared_buffers:&lt;/span&gt; напомним, это НЕ вся память, которая нужна для работы PostgreSQL, это только размер разделяемой между процессами PostgreSQL памяти, которая нужна для выполнения активных операций. Она должна занимать меньшую часть оперативной памяти вашего компьютера, так как PostgreSQL использует также дисковый кэш операционной системы. К сожалению, чтобы знать точное число shared buffers, нужно учесть количество оперативной памяти компьютера, размер базы данных, число соединений и сложность запросов, так что лучше воспользуемся несколькими простыми правилами настройки.&lt;/p&gt;&lt;p&gt;На выделенных серверах полезным объемом будет значение от 8 МБ до 2 ГБ. Объем может быть выше, если у вас большие активные порции базы данных, сложные запросы, большое число одновременных соединений, длительные транзакции, вам доступен большой объем оперативной памяти или большее количество процессоров. И, конечно же, не забываем об остальных приложениях. Выделив слишком много памяти для базы данных, мы можем получить ухудшение производительности. Вот несколько примеров, полученных на личном опыте и при тестировании:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Laptop, Celeron processor, 384MB RAM, база данных 25MB: shared_buffers 12 MB&lt;/li&gt;&lt;li&gt;Athlon server, 1GB RAM, база данных поддержки принятия решений 10GB: 200 MB&lt;/li&gt;&lt;li&gt;Quad PIII server, 4GB RAM, 40GB, 150 соединений, &amp;quot;тяжелые&amp;quot; транзакции: 1 GB&lt;/li&gt;&lt;li&gt;Quad Xeon server, 8GB RAM, 200GB, 300 соединений, &amp;quot;тяжелые&amp;quot; транзакции: 2 GB&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Заметим, что увеличение числа shared_buffers и других параметров памяти потребует изменения настроек System V memory вашей операционной системы. Подробнее об этом можно прочитать в документации по PostgreSQL.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;work_mem:&lt;/span&gt; ранее известное как sort_mem, было переименовано, так как сейчас определяет максимальное количество оперативной памяти, которое может выделить одна операция сортировки, агрегации и др. Это не разделяемая память, work_mem выделяется отдельно на каждую операцию (от одного до нескольких раз за один запрос). Разумное значение параметра определяется следующим образом: количество доступной оперативной памяти (после того, как из общего объема вычли память, требуемую для других приложений, и shared_buffers) делится на максимальное число одновременных запросов умноженное на среднее число операций в запросе, которые требуют памяти.&lt;/p&gt;&lt;p&gt;Для веб-приложений обычно устанавливают низкие значения work_mem, так как запросов обычно много, но они простые, обычно хватает от 512 до 2048 КБ. С другой стороны, приложения для поддержки принятия решений с сотнями строк в каждом запросе и десятками миллионов столбцов&amp;nbsp; в таблицах фактов часто требуют work_mem порядка 500 МБ. Для баз данных, которые используются и так, и так, этот параметр можно устанавливать для каждого запроса индивидуально, используя настройки сессии. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;maintenance_work_mem:&lt;/span&gt; предыдущее название в PostgreSQL 7.x vacuum_mem. Это объем памяти, который требуется PostgreSQL для VACUUM, ANALYZE, CREATE INDEX, и добавления внешних ключей. Чтобы операции выполнялись максимально быстро, нужно устанавливать этот параметр тем выше, чем больше размер таблиц в вашей базе данных. Неплохо бы устанавливать его значение от 50 до 75% размера вашей самой большой таблицы или индекса или, если точно определить невозможно, от 32 до 256 МБ.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Диск и журнал транзакций (WAL)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;checkpoint_segments:&lt;/span&gt; определяет количество сегментов (каждый по 16 МБ) лога транзакций между контрольными точками. Этот параметр не имеет особого значения для базы данных, предназначенной преимущественно для чтения, но для баз данных со множеством транзакций увеличение этого параметра может оказаться жизненно необходимым. В зависимости от объема данных установите этот параметр в диапазоне от 12 до 256 сегментов и, если в логе появляются предупреждения (warning) о том, что контрольные точки происходят слишком часто, постепенно увеличивайте его. Место, требуемое на диске, вычисляется по формуле (checkpoint_segments * 2 + 1) * 16 МБ, так что убедитесь, что у вас достаточно свободного места. Например, если вы выставите значение 32, вам потребуется больше 1 ГБ дискового пространства.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;max_fsm_pages:&lt;/span&gt; определяет размер реестра, в котором хранится информация о частично освобождённых страницах данных, готовых к заполнению новыми данными. При правильной настройке ускоряет VACUUM и избавляет от необходимости делать VACUUM FULL или REINDEX. Значение этого параметра нужно установить чуть больше, чем полное число страниц, которые могут быть затронуты операциями обновления или удаления между выполнением VACUUM. Чтобы определить это число, можно запустить VACUUM VERBOSE ANALYZE и выяснить общее число страниц, используемых базой данных. max_fsm_pages обычно требует немного памяти, так что на этом параметре лучше не экономить.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;vacuum_cost_delay:&lt;/span&gt; Если у вас большие таблицы, и производится много одновременных операций записи, вам может пригодиться функция, которая уменьшает затраты на I/O для VACUUM, растягиваяя его по времени. Чтобы включить эту функциональность, нужно поднять значение vacuum_cost_delay выше 0. Используйте разумную задержку от 50 до 200 мс. Для более тонкой настройки повышайте vacuum_cost_page_hit и понижайте vacuum_cost_page_limit. Это ослабит влияние VACUUM, увеличив время его выполнения. В тестах с параллельными транзакциями Ян Вик (Jan Wieck) получил, что при значениях delay - 200, page_hit - 6 и предел - 100 вляние VACUUM уменьшилось более чем на 80%, но его длительность увеличилась втрое.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Планировщик запросов&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Следующие настройки помогают планировщику запросов правильно оценивать стоимости различных операций и выбирать оптимальный план выполнения запроса. Существуют 2 глобальные настройки планировщика, на которые стоит обратить внимание:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;effective_cache_size:&lt;/span&gt; указывает планировщику на размер самого большого объекта в базе данных, который теоретически может быть закеширован. На выделенном сервере имеет смысл выставлять effective_cache_size в 2/3 от всей оперативной памяти; на сервере с другими приложениями сначала нужно вычесть из всего объема RAM размер дискового кэша ОС и память, занятую остальными процессами.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;random_page_cost: &lt;/strong&gt;переменная, указывающая на условную стоимость индексного доступа к страницам данных. На серверах с быстрыми дисковыми массивами имеет смысл уменьшать изначальную настройку до 3.0, 2.5 или даже до 2.0. Если же активная часть вашей базы данных много больше размеров оперативной памяти, попробуйте поднять значение параметра. Можно подойти к выбору оптимального значения и со стороны производительности запросов. Если планировщик запросов чаще, чем необходимо, предпочитает последовательные просмотры (sequential scans) просмотрам с использованием индекса (index scans), понижайте значение. И наоборот, если планировщик выбирает просмотр по медленному индексу, когда не должен этого делать, настройку имеет смысл увеличить. После изменения тщательно тестируйте результаты на максимально широком наборе запросов. Никогда не опускайте значение random_page_cost ниже 2.0; если вам кажется, что random_page_cost нужно еще понижать, разумнее в этом случае менять настройки статистики планировщика. &lt;/p&gt;</description>
      <pubDate>Thu, 7 Jun 2007 17:36:31 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/38</guid>
    </item>
        <item>
      <title>Масштабирование PostgreSQL: готовые решения от Skype</title>
      <link>http://postgresqlrussia.org/articles/view/25</link>
      <description>&lt;p&gt;&lt;em&gt;Автор: Иван Золотухин&lt;/em&gt; &lt;/p&gt;&lt;p&gt;  Совсем недавно компания Skype выложила в открытое пользование под лицензией BSD ряд своих наработок, анонсированных   прошлым летом на конференции, посвященной 10-летию PostgreSQL. Эти решения   позволяют полностью решить проблемы масштабирования и резервирования OLTP   систем, а также организовать необходимую синхронизацию с OLAP базами данных,   решив таким образом 2 самых основных проблемы, с которыми сталкиваются   разработчики баз данных при построении высоконагруженных систем. В   &lt;a href=&quot;../../news/view/10&quot; target=&quot;blank_&quot; title=&quot;Postgresmen.ru: Skype делится своими проектами&quot;&gt;пресс-релизы&lt;/a&gt;   об этом событии вошли лишь краткие описания продуктов от Skype, поэтому   возникла необходимость описать более подробно те возможности, которые   появились у разработчиков и администраторов баз данных PostgreSQL. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;   PL/Proxy &lt;/h2&gt; &lt;p&gt; &lt;em&gt;PL/Proxy&lt;/em&gt; представляет собой прокси-язык для удаленного вызова процедур и партицирования данных между разными базами. Основная идея его использования заключается в том, что появляется возможность вызывать функции, расположенные в удаленных базах, а также свободно работать с кластером баз данных (например, вызвать функцию на всех узлах кластера, или на случайном узле, или на каком-то одном определенном).&lt;/p&gt; &lt;p&gt; Чем &lt;em&gt;PL/Proxy&lt;/em&gt; может быть полезен? Он существенно упрощает горизонтальное масштабирование системы. Становится удобным разделять таблицу с пользователями, например, по первой латинской букве имени -- на 26 узлов. При этом приложение, которое работает непосредственно с прокси-базой, ничего не будет замечать: запрос на авторизацию, например, сам будет направлен прокси-сервером на нужный узел. То есть администратор баз данных может проводить масштабирование системы практически независимо от разработчиков приложения.&lt;/p&gt; &lt;p&gt; &lt;em&gt;PL/Proxy&lt;/em&gt; позволяет полностью решить проблемы масштабирования OLTP систем. В систему легко вводится резервирование с failover-ом не только по узлам, но и по самим прокси-серверам, каждый из которых работает со всеми узлами.&lt;/p&gt;  &lt;h3&gt;Несколько примеров от Skype&lt;/h3&gt; &lt;p&gt; 1. Простейший пример удаленного вызова функции. Соединяемся с dbname=users выполняем запрос SELECT * FROM get_user_email($1); на удаленной базе:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;CREATE FUNCTION get_user_email(username text)&lt;br /&gt;RETURNS text AS $$&lt;br /&gt;    CONNECT &amp;#39;dbname=users&amp;#39;;&lt;br /&gt;$$ LANGUAGE plproxy;&lt;br /&gt;&lt;/pre&gt;  &lt;/blockquote&gt; &lt;p&gt; 2. Пример с партицированием. Пользователи разделены по разным базам, номер партиции вычисляется функцией hashtext(username):&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;CREATE FUNCTION get_user_email(username text)&lt;br /&gt;RETURNS text AS $$&lt;br /&gt;    CLUSTER &amp;#39;userdb&amp;#39;;&lt;br /&gt;    RUN ON hashtext(username);&lt;br /&gt;$$ LANGUAGE plproxy;&lt;/pre&gt; &lt;/blockquote&gt; &lt;p&gt; 3. Функции на прокси-сервере создаются с такой же сигнатурой, что и на удаленном сервере. В теле прокси-функции нужно определять лишь путь до удаленного сервера:&lt;/p&gt;  &lt;blockquote&gt; &lt;pre&gt;CREATE FUNCTION pwd_check(text, text) RETURNS boolean &lt;br /&gt;$$&lt;br /&gt;  SELECT 1 FROM users WHERE name=$1 AND PWD=$2;&lt;br /&gt;  IF FOUND THEN RETURN true;&lt;br /&gt;  ELSE RETURN false;&lt;br /&gt;$$ LANGUAGE plpgsql;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE FUNCTION pwd_check(text, text) RETURNS boolean &lt;br /&gt;$$&lt;br /&gt;  CLUSTER userdb_cluster;&lt;br /&gt;  PARTITION BY hashtext($1);&lt;br /&gt;$$ LANGUAGE plproxy;&lt;/pre&gt;  &lt;/blockquote&gt; &lt;p&gt; 4. Есть возможность выполнять произвольные SQL запросы: &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;CREATE FUNCTION get_user_location(text) RETURNS text AS $$&lt;br /&gt;    CLUSTER &amp;#39;userdb&amp;#39;;&lt;br /&gt;    RUN ON hashtext($1);&lt;br /&gt;    SELECT email FROM users WHERE user = $1;&lt;br /&gt;$$ LANGUAGE plproxy;&lt;/pre&gt; &lt;/blockquote&gt; &lt;h3&gt;Недостатки и ограничения&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;все запросы и вызовы функций вызываются в autocommit-режиме на удаленных   серверах&lt;/li&gt;   &lt;li&gt;в теле функции разрешен только один SELECT; при необходимости нужно писать   отдельную процедуру&lt;/li&gt;   &lt;li&gt;при каждом вызове прокси-сервер стартует новое соединение к бакенд-серверу;   в высоконагруженных системах целесообразно использовать менеджер для   кеширования соединений к бакенд-серверам, для этой цели идеально подходит   &lt;em&gt;PgBouncer&lt;/em&gt;&lt;/li&gt;   &lt;li&gt;изменение конфигурации кластера   (количества партиций, например) требует перезапуска прокси-сервера&lt;/li&gt; &lt;/ul&gt;  &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt;  &lt;h2&gt;   PgBouncer &lt;/h2&gt; &lt;p&gt; &lt;em&gt;PgBouncer&lt;/em&gt; представляет собой простой и быстрый менеджер соединений для PostgreSQL. Он поддерживает три режима управления соединениями:&lt;/p&gt; &lt;ol&gt;   &lt;li&gt;     Session Pooling. Наиболее &amp;quot;вежливый&amp;quot; режим. При начале сессии клиенту     выделяется соединение с сервером; оно приписано ему в течение всей сессии и     возвращается в пул только после отсоединения клиента.   &lt;/li&gt;   &lt;li&gt;      Transaction Pooling. Клиент владеет соединением с бакендом только в течение     транзакции. Когда &lt;span style=&quot;font-style: italic&quot;&gt;PgBouncer&lt;/span&gt; замечает,     что транзакция завершилась, он возвращает соединение назад в пул.   &lt;/li&gt;   &lt;li&gt;     Statement Pooling. Наиболее агрессивный режим. Соединение с бакендом     возвращается назад в пул сразу после завершения запроса. Транзакции с     несколькими запросами в этом режиме не разрешены, так как они гарантировано     будут отменены.   &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; К достоинствам &lt;em&gt;PgBouncer&lt;/em&gt; относится очень низкое потребление памяти (менее 2КБ на соединение по умолчанию), отсутствие привязки к одному серверу баз данных (может работать с разными хостами), возможность изменения большинства настроек без рестарта, а также возможность онлайн-перезапуска:&amp;nbsp; &lt;em&gt;PgBouncer&lt;/em&gt; сам перенесет открытые сокеты в новый процесс. Из недостатков стоит отметить разве что отсутствие поддержки протоколов старее V3, что требует использования в качестве бакенда сервера PostgreSQL версии новее, чем 7.4, но в настоящее время это уже не является серьезным ограничением. Для низкоуровневой работы с сокетами  &lt;em&gt;PgBouncer&lt;/em&gt; использует libevent. &lt;/p&gt;  &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt;  &lt;h2&gt;   WalMgr &lt;/h2&gt; &lt;p&gt; Скрипт, написанный на python, максимально облегчающий процедуру разворачивания сервера с горячим бекапом на основе трансфера логов, а в случае отказа мастер-сервера -- быстрого переключения нагрузки на резервный сервер. Все весьма просто:&lt;/p&gt; &lt;blockquote&gt; [ .. настраиваем небольшие конфиг файлы .. ]&lt;br /&gt;&lt;br /&gt; master$ walmgr setup&lt;br /&gt; master$ walmgr backup&lt;br /&gt; slave$ walmgr restore&lt;br /&gt;&lt;br /&gt; [ .. мастер-сервер отказал, переключаем нагрузку на резервный сервер с бекапом: ]&lt;br /&gt;&lt;br /&gt; slave$ walmgr restore  &lt;/blockquote&gt;  &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt;  &lt;h2&gt;   Londiste &lt;/h2&gt; &lt;p&gt; Представляет собой движок для организации репликации, написанный на языке python. Основные принципы: надежность и простота использования; из-за этого данное решение имеет меньше функциональности, чем Slony-I. &lt;em&gt;Londiste&lt;/em&gt; использует в качестве транспортного механизма очередь &lt;em&gt;PgQ&lt;/em&gt; (описание этого более чем интересного проекта остается за рамками данного мини-обзора, поскольку он представляет интерес скорее для низкоуровневых программистов баз данных, чем для конечных пользователей -- администраторов СУБД PostgreSQL). Отличительными особенностями решения являются:&lt;br /&gt; &lt;/p&gt; &lt;ul&gt;   &lt;li&gt;возможность потабличной репликации&lt;/li&gt;   &lt;li&gt;начальное копирование ничего не блокирует&lt;/li&gt;   &lt;li&gt;возможность двухстороннего сравнения таблиц&lt;/li&gt;   &lt;li&gt;простота установки&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; К недостаткам можно отнести:&lt;/p&gt; &lt;ul&gt;    &lt;li&gt;отсутствие поддержки sequence делает невозможным поддержание   failover-сервера актуальным (для этой цели нужно использовать   &lt;em&gt;WalMgr&lt;/em&gt;)&lt;/li&gt;   &lt;li&gt;отсутствие поддержки каскадной репликации&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; Пример использования &lt;em&gt;Londiste&lt;/em&gt; с инсталляцией:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;$ londiste.py replic.ini provider install&lt;br /&gt;$ londiste.py replic.ini subscriber install&lt;br /&gt;$ londiste.py replic.ini replay -d&lt;br /&gt;$ londiste.py replic.ini provider add users orders&lt;br /&gt;$ londiste.py replic.ini subscriber add users&lt;/pre&gt;  &lt;/blockquote&gt;  &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt;  &lt;h2&gt;Ссылки&lt;/h2&gt; &lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://postgresmen.ru/news/view/10&quot;&gt;&amp;quot;Skype делится своими проектами&amp;quot;&lt;/a&gt;, Новости PostgreSQL, Postgresmen&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/SkypePostgresqlWhitepaper&quot; target=&quot;_blank&quot;&gt;     &amp;quot;PostgreSQL at Skype&amp;quot;&lt;/a&gt;, доклад Skype на PostgreSQL Anniversary Summit 2006&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/&quot; target=&quot;_blank&quot;&gt;Public Database Projects&lt;/a&gt;, Skype Developer Zone   &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/PlProxy&quot; target=&quot;_blank&quot;&gt;PlProxy&lt;/a&gt;, Skype Developer Zone&lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/PlProxy&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;&lt;/a&gt;   &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/SkyTools&quot; target=&quot;_blank&quot;&gt;SkyTools&lt;/a&gt;, Skype Developer Zone   &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer&quot; target=&quot;_blank&quot;&gt;PgBouncer&lt;/a&gt;, Skype Developer Zone&lt;a href=&quot;https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://pgfoundry.org/projects/plproxy&quot; target=&quot;_blank&quot;&gt;PlProxy&lt;/a&gt;, PgFoundry   &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://pgfoundry.org/projects/skytools/&quot; target=&quot;_blank&quot;&gt;SkyTools&lt;/a&gt;, PgFoundry   &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://pgfoundry.org/projects/pgbouncer&quot; target=&quot;_blank&quot;&gt;PgBouncer&lt;/a&gt;, PgFoundry&lt;a href=&quot;http://pgfoundry.org/projects/pgbouncer&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;A&lt;/em&gt;&lt;em&gt;ny feedback is welcome at iz at sai dot msu dot ru&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Apr 2007&lt;/em&gt; &lt;/p&gt;</description>
      <pubDate>Mon, 23 Apr 2007 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/25</guid>
    </item>
        <item>
      <title>Regexps in PostgreSQL / Регулярные выражения в PostgreSQL</title>
      <link>http://postgresqlrussia.org/articles/view/33</link>
      <description>&lt;em&gt;Автор: Иван Золотухин&lt;/em&gt;&lt;br /&gt; &lt;a name=&quot;A2&quot; title=&quot;A2&quot;&gt;&lt;/a&gt;&lt;h3&gt;Маленькая заметка справочного характера на тему регулярных выражений в PostgreSQL&lt;/h3&gt;&lt;p&gt;В PostgreSQL применяется 3 различных подхода к регулярным выражениям:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;традиционный в SQL оператор LIKE&lt;/li&gt;&lt;li&gt;более новый оператор SIMILAR TO (добавлен в стандарте SQL:1999)&lt;/li&gt;&lt;li&gt;POSIX-совместимые регулярные выражения&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Если предоставленных возможностей не хватает, предлагается использовать процедурные языки (например PL/Perl) и работать со строками оттуда. Также, важно отметить, что регулярные выражения не обладают чудесным быстродействием, поэтому не подходят для текстового поиска в больших объемах данных - для этой цели лучше использовать полнотекстовый поиск Tsearch2.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;a name=&quot;A3&quot; title=&quot;A3&quot;&gt;&lt;/a&gt;&lt;h2&gt;LIKE&lt;/h2&gt;&lt;p&gt;Синтакс этого оператора в постгресе полностью традиционен: символ процента (%) соответствует любой строке в 0 или более символов, символ нижнего подчеркивания (_) матчит любой одиночный символ. Несколько примеров из документации должны полностью прояснить ситуацию:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;test=# SELECT &amp;#39;abc&amp;#39; LIKE &amp;#39;abc&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; LIKE &amp;#39;a%&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; LIKE &amp;#39;_b_&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; LIKE &amp;#39;c&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; f&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Следует также добавить, что паттерн в операторе LIKE матчит сразу всю строку. Поэтому, для того чтобы найти какую-нибудь последовательность внутри строки, необходимо начинать и заканчивать ваш паттерн символами %. &lt;/p&gt;&lt;p&gt;Для матча литералов % и _ их, как обычно, необходимо эскейпить символом обратного слеша (\).&lt;/p&gt;&lt;p&gt;&lt;em&gt;Важное замечание! Так как символ обратного слеша (\) уже имеет особый смысл (он является escape-символом) в строковых литералах в Постгресе, его всегда тоже необходимо эскейпить опять же обратным слешем! Это приводит к конструкциям вида \\\\ для матча литерала обратного слеша в паттернах оператора LIKE. Для облегчения понимания можно представлять себе последовательную обработку регулярного выражения двумя различными парсерами: первый делает из строки настоящий регэксп, а второй - непосредственно парсит уже финальный вид регулярного выражения. Вы, однако, можете поменять escape-символ с помощью конструкции string LIKE pattern ESCAPE escape-character.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Для case-insensitive матча регулярным выражением в постгресе используется оператор ILIKE, что является одной из самых известных его &lt;em&gt;gotchas&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Напоследок в этой секции скажу, что есть эквиваленты указанных операторов. Их не нужно использовать, так как они типичны только для Постгреса, но про них нужно знать, так как иногда некоторые гуру используют их в своей речи. Итак:&lt;/p&gt;&lt;p&gt;~~ эквивалентен LIKE&lt;/p&gt;&lt;p&gt;~~* эквивалентен ILIKE&lt;/p&gt;&lt;p&gt;!~~ эквивалентен NOT LIKE&lt;/p&gt;&lt;p&gt;!~~* эквивалентен NOT ILIKE&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;a name=&quot;A4&quot; title=&quot;A4&quot;&gt;&lt;/a&gt;&lt;h2&gt;SIMILAR TO&lt;/h2&gt;&lt;p&gt;Этот оператор очень сильно похож на LIKE. Отличие лишь в том, что он интерпретирует регулярные выражения по стандарту SQL, который представляет собой любопытную смесь регэкспов нотации LIKE и общеупотребительных регэкспов.&lt;/p&gt;&lt;p&gt;Символы % и _ имеют точно такой же смысл, что и в LIKE, однако добавлены POSIX-подобные метасимволы:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Символ | обозначает выбор одной либо другой альтернативы&lt;/li&gt;&lt;li&gt;Символ * обозначает повторение предыдущего элемента 0 или более раз&lt;/li&gt;&lt;li&gt;Символ + обозначает повторение предыдущего элемента 1 или более раз&lt;/li&gt;&lt;li&gt;Круглый скобки () могут быть использованы для группировки элементов в один логический атом&lt;/li&gt;&lt;li&gt;Квадратные скобки [] определяют класс символов в точности так, как это сделано в POSIX-совместимых регулярных выражениях.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Важно помнить, что метасимволы ограниченного повторения (? и {...}) в SIMILAR TO не поддерживаются, хотя они и существуют в POSIX. Также символ точки (.) не является метасимволом.&lt;/p&gt;&lt;p&gt;Стандартные примеры из документации:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;test=# SELECT &amp;#39;abc&amp;#39; SIMILAR TO &amp;#39;abc&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; SIMILAR TO &amp;#39;a&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; f&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; SIMILAR TO &amp;#39;%(b|d)%&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; SIMILAR TO &amp;#39;(b|c)%&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; f&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Также SQL-совместимые регулярные выражения поддерживаются функцией substring(&lt;em&gt;string&lt;/em&gt; from &lt;em&gt;pattern&lt;/em&gt; for &lt;em&gt;escape-character&lt;/em&gt;), которая может извлекать по паттернам подстроки, ее описание смотрите в документации. Не забывайте, правда, что вызванная с двумя, а не с тремя параметрами, она будет работать в POSIX-режиме. Также следует помнить о том, что эскейп-символ можно менять при надобности: &lt;em&gt;string&lt;/em&gt; SIMILAR TO &lt;em&gt;pattern&lt;/em&gt; ESCAPE &lt;em&gt;escape-character&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;a name=&quot;A5&quot; title=&quot;A5&quot;&gt;&lt;/a&gt;&lt;h2&gt;POSIX&lt;/h2&gt;&lt;p&gt;Да, это всем удобные и привычные регулярные выражения с понятным синтаксисом. Помните, однако, что эти возможности уникальны для Постгреса и отсутствуют (или реализованы в иной форме) в других СУБД.&lt;/p&gt;&lt;p&gt;Регэкспы в POSIX-нотации работают в PostgreSQL со следующими операторами:&lt;/p&gt;&lt;p&gt;~ осуществляет case-sensitive матч&lt;/p&gt;&lt;p&gt;~* осуществляет case-insensitive матч&lt;/p&gt;&lt;p&gt;!~ и !~* означают отрицание вышеуказанных операторов&lt;/p&gt;&lt;p&gt;Стандартные примеры:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;test=# SELECT &amp;#39;abc&amp;#39; ~ &amp;#39;abc&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; ~ &amp;#39;^a&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; ~ &amp;#39;(b|d)&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;abc&amp;#39; ~ &amp;#39;^(b|c)&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; f&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Также, такие регэкспы могут быть использованы в функциях substring(&lt;em&gt;string&lt;/em&gt; from &lt;em&gt;pattern&lt;/em&gt;) и regexp_replace(&lt;em&gt;source&lt;/em&gt;, &lt;em&gt;pattern&lt;/em&gt;, &lt;em&gt;replacement&lt;/em&gt; [, &lt;em&gt;flags&lt;/em&gt;]).&lt;/p&gt;&lt;p&gt;Они поддерживают обычные символьные классы (как длинные названия вроде [[:digit:]], так и сокращения типа \d), группировки, метасимволы вроде точки, опережающие проверки, ограничения жадности и другие полезные операции. &lt;/p&gt;&lt;p&gt;Однако, не совсем привычны некоторые ограничения в регекспах:&lt;/p&gt;&lt;p&gt;\A  соответствует началу строки&lt;/p&gt;&lt;p&gt;\m  соответствует началу слова&lt;/p&gt;&lt;p&gt;\M  соответствует концу слова&lt;/p&gt;&lt;p&gt;\y  соответствует началу или концу слова&lt;/p&gt;&lt;p&gt;\Y  соответствует только не началу и не концу слова&lt;/p&gt;&lt;p&gt;\Z  соответствует концу строки&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Однако, как уже было сказано выше, из-за специального значения символа обратного слеша в строковых литералах, его необходимо эскейпить, поэтому не забывайте писать не просто \w, если хотите сматчить любой алфавитно-цифровой символ, а \\w, чтобы регэксп работал, как и предполагается!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Например:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;test=# SELECT &amp;#39;123&amp;#39; ~ &amp;#39;^\d{3}&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; f&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;test=# SELECT &amp;#39;123&amp;#39; ~ &amp;#39;^\\d{3}&amp;#39;;&lt;br /&gt; ?column? &lt;br /&gt;----------&lt;br /&gt; t&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Обратные ссылки (back references) на сгруппированные ранее подстроки доступны в функции regexp_replace как \i, где i является номером группировки.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;a name=&quot;A6&quot; title=&quot;A6&quot;&gt;&lt;/a&gt;&lt;h2&gt;Замечания&lt;/h2&gt;&lt;p&gt;Необходимо сделать ряд важных замечаний о POSIX-регэкспах. Во-первых, PostgreSQL поддерживает несколько их &amp;quot;оттенков&amp;quot;: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;em&gt;basic&lt;/em&gt; регулярные выражения (BREs), соответствующие редактору ed&lt;/li&gt;&lt;li&gt;&lt;em&gt;extended&lt;/em&gt; регулярные выражения (EREs), которые приблизительно соответствуют egrep&lt;/li&gt;&lt;li&gt;&lt;em&gt;advanced&lt;/em&gt; регулярные выражения (AREs), представляющие собой EREs с дополнительными не-POSIX возможностями, взятыми из языков Perl и Tcl.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Пользователь может выбирать как именно трактуются его POSIX-паттерны в сессии с помощью переменной regexp_flavor (по умолчанию переменная установлена в &lt;em&gt;advanced&lt;/em&gt;):&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;test=# SHOW regex_flavor;&lt;br /&gt; regex_flavor &lt;br /&gt;--------------&lt;br /&gt; advanced&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Используйте установку regexp_flavor в &lt;em&gt;extended&lt;/em&gt; для обратной совместимости с PostgreSQL версии младше 7.4. Также стоит упомянуть о возможности менять поведение паттернов прямо run-time при помощи модификаторов регэкспов, ищите в документации или спрашивайте здесь.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;a name=&quot;A7&quot; title=&quot;A7&quot;&gt;&lt;/a&gt;&lt;h2&gt;Полезные ссылки&lt;/h2&gt; &lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.postgresql.org/docs/8.1/static/functions-matching.html&quot;&gt;http://www.postgresql.org/docs/8.1/static/functions-matching.html&lt;/a&gt; - основная статья в документации PostgreSQL про регулярные выражения. По сути эта заметка является выжимкой из этой основной статьи.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.oreillynet.com/pub/a/databases/2006/02/02/postgresq_regexes.html&quot;&gt;http://www.oreillynet.com/pub/a/databases/2006/02/02/postgresq_regexes.html&lt;/a&gt; - довольно свежая статейка с множеством рецептов на ту же тему.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;em&gt;Any feedback is welcome at iz at sai dot msu dot ru&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Jun 2006&lt;/em&gt; &lt;/p&gt;</description>
      <pubDate>Tue, 20 Jun 2006 02:29:35 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/33</guid>
    </item>
        <item>
      <title>C-Language functions for PostgreSQL / C-функции для PostgreSQL</title>
      <link>http://postgresqlrussia.org/articles/view/32</link>
      <description>&lt;p&gt;&lt;em&gt;Автор: Иван Золотухин&lt;/em&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;#A2&quot;&gt;Интро&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#A3&quot;&gt;Пишем Set Returning Function&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#A4&quot;&gt;Простейшее использование Server Processing Interface&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#A5&quot;&gt;Отладка (debug) кода&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#A6&quot;&gt;Компиляция кода с помощью Makefile&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#A7&quot;&gt;Замечания&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;&lt;a name=&quot;A2&quot; title=&quot;A2&quot;&gt;&lt;/a&gt;&lt;h2&gt;Интро&lt;/h2&gt;&lt;p&gt;Данная статья содержит материалы, посвященные написанию на C функций для PostgreSQL - оказывается, делать это довольно легко, ну а бонусов вы получаете существенно больше, чем если бы вы писали всю ту же логику на процедурных языках. Скомпиленные в shared object функции затем можно будет загрузить в PostgreSQL и использовать по своему усмотрению как SQL команды, например.&lt;/p&gt;&lt;p&gt;Простейшие функции можно посмотреть и в &lt;a href=&quot;http://www.postgresql.org/docs/current/static/xfunc-c.html&quot;&gt;мануале&lt;/a&gt; (заходите сюда только после изучения этого документа). Да, еще обязательно посмотрите на туториал с OSCON-2004 под названием &lt;a href=&quot;http://techdocs.postgresql.org/oscon2004/joe.conway/tut_oscon_2004.pdf&quot;&gt;&amp;quot;Power PostgreSQL: Extending Database with C&amp;quot;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Но если вы хотите чего-то большего, то мануал быстро перестанет вас устраивать. У меня лично с ходу во всем разобраться не очень получилось - так что эта статья посвящена таким, как я :)&lt;/p&gt;&lt;p&gt;&lt;em&gt;Важное предупреждение 1:&lt;/em&gt; функции написаны без использования best practices, это всего лишь работающие черновики (даже нет обработки нулевого result set-а, который может вернуть SPI_execute, например). Автор особо не парился над внешним видом своего кода, поэтому нельзя считать его готовым продакшн-вариантом.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Важное предупреждение 2:&lt;/em&gt; Статья имеет вид, далекий от финального (см. Важное предупреждение 1), следовательно статья будет меняться. Я только что получил лист замечаний от &lt;a href=&quot;http://sigaev.ru/&quot;&gt;Федора Сигаева&lt;/a&gt; (за что ему большое спасибо!), который знает о сишных функциях для Постгреса всё (в отличие от меня), так что я попытаюсь учесть его комментарии. To be continued, одним словом.&lt;/p&gt; &lt;br /&gt;&lt;a name=&quot;A3&quot; title=&quot;A3&quot;&gt;&lt;/a&gt;&lt;h2&gt;Пишем Set Returning Function&lt;/h2&gt;&lt;p&gt;Итак, попробуем написать простейшую Set Returning Function (функцию, возвращающую сет значений, result set) - у нас она будет брать на вход инт с длиной сета и на выходе будет возвращать сет значений от единицы до заданного числа (вот так просто и тупо). Такая тупость выбрана не случайно - в функции нет абсолютно никаких наворотов кроме каркаса для демонстрации multicall-работы SRF. Напомню, что в стандартном случае, SRF функция работает в режиме value-per-call, то есть она за каждый вызов возвращает только одно значение и вызывается столько раз, сколько рядов у нас в result set-е. Между вызовами информация хранится в специальной структуре - контексте функции.&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;#include &amp;quot;postgres.h&amp;quot; // main include file (include always)&lt;br /&gt;#include &amp;quot;fmgr.h&amp;quot; // &amp;quot;Function Manager&amp;quot; for V1 style&lt;br /&gt;#include &amp;quot;funcapi.h&amp;quot; // to return set of rows&lt;br /&gt;&lt;br /&gt;/* Version 1 Calling Conventions - так нужно писать все функции теперь */&lt;br /&gt;PG_FUNCTION_INFO_V1(iz_test);&lt;br /&gt;&lt;br /&gt;Datum &lt;br /&gt;iz_test(PG_FUNCTION_ARGS)&lt;br /&gt;{&lt;br /&gt;    /* Тот самый контекст функции */&lt;br /&gt;    FuncCallContext *funcctx;&lt;br /&gt;    /* Тоже нужно для multicall persistence */&lt;br /&gt;    MemoryContext oldcontext;&lt;br /&gt;&lt;br /&gt;    /* заходим сюда только в первом вызове функции */&lt;br /&gt;    if (SRF_IS_FIRSTCALL()) {&lt;br /&gt;        /* &lt;br /&gt;         * инициализация структуры-контекста фунции для &lt;br /&gt;         * хранения информации между вызовами&lt;br /&gt;         */&lt;br /&gt;        funcctx = SRF_FIRSTCALL_INIT();&lt;br /&gt;        /*&lt;br /&gt;         * переключаем контекст памяти на контекст, сохраняемый между вызовами                                                &lt;br /&gt;         */        &lt;br /&gt;        oldcontext = MemoryContextSwitchTo(funcctx-&amp;gt;multi_call_memory_ctx);&lt;br /&gt;        /* &lt;br /&gt;         * говорим, что функцию нужно дергать столько раз, сколько указано&lt;br /&gt;         * в ее первом аргументе&lt;br /&gt;         */&lt;br /&gt;        funcctx-&amp;gt;max_calls = PG_GETARG_INT32(0);&lt;br /&gt;&lt;br /&gt;        MemoryContextSwitchTo(oldcontext);&lt;br /&gt;    }&lt;br /&gt;    /* код, который исполняется при каждом вызове функции */&lt;br /&gt;    funcctx = SRF_PERCALL_SETUP(); // контекст функции освежили&lt;br /&gt;    if (funcctx-&amp;gt;call_cntr &amp;lt; funcctx-&amp;gt;max_calls) {&lt;br /&gt;        /* &lt;br /&gt;         * Это, собственно, возвращение каждого item-а&lt;br /&gt;         * Обратите внимание, что SRF_RETURN_NEXT в качестве аргументов &lt;br /&gt;         * принимает контекст функции для его обновления (хотя бы даже&lt;br /&gt;         * счетчик передвинуть) и собственно то, что нужно вернуть, только&lt;br /&gt;         * в виде Datum-а, который мы тут и делаем из инта&lt;br /&gt;         */&lt;br /&gt;        SRF_RETURN_NEXT(funcctx, Int32GetDatum(funcctx-&amp;gt;call_cntr));&lt;br /&gt;    } else {&lt;br /&gt;        // так нужно все заканчивать&lt;br /&gt;        SRF_RETURN_DONE(funcctx);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Дальше вы должны сами скомпилить это дело в .so (см. ниже про компиляцию с помощью Makefile), положить Постгресу в нужное место и просто создать эту функцию:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;CREATE OR REPLACE FUNCTION&lt;br /&gt;        iz_test(integer) RETURNS setof int4 AS&lt;br /&gt;        &amp;#39;/usr/lib/pgsql/c-func_test.so&amp;#39;, &amp;#39;iz_test&amp;#39;&lt;br /&gt;LANGUAGE C&lt;br /&gt;STRICT;   &lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Потом все будет выглядеть приблизительно вот так:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;test_db=# select iz_test(10);&lt;br /&gt; iz_test &lt;br /&gt;---------&lt;br /&gt;       1&lt;br /&gt;       2&lt;br /&gt;       3&lt;br /&gt;       4&lt;br /&gt;       5&lt;br /&gt;       6&lt;br /&gt;       7&lt;br /&gt;       8&lt;br /&gt;       9&lt;br /&gt;      10&lt;br /&gt;(10 rows)&lt;br /&gt;&lt;br /&gt;Time: 0.300 ms&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt; &lt;br /&gt;&lt;a name=&quot;A4&quot; title=&quot;A4&quot;&gt;&lt;/a&gt;&lt;h2&gt;Простейшее использование Server Processing Interface&lt;/h2&gt;&lt;p&gt;Теперь попробуем использовать Server Processing Interface (SPI) для того, чтобы мы могли выполнять SQL-запросы. Каркас multicall функции трогать не будем, просто добавим туда работу со SPI_* функциями. Известные по первому примеру места я уже не комментирую.&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;#include &amp;quot;postgres.h&amp;quot; // main include file (include always)&lt;br /&gt;#include &amp;quot;fmgr.h&amp;quot; // &amp;quot;Function Manager&amp;quot; for V1 style&lt;br /&gt;#include &amp;quot;executor/spi.h&amp;quot; // Server Processing Interface&lt;br /&gt;#include &amp;quot;funcapi.h&amp;quot; // to return set of rows and cope with tuples&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt; // мы будем использовать atoi()&lt;br /&gt;&lt;br /&gt;PG_FUNCTION_INFO_V1(get_level1_c);&lt;br /&gt;&lt;br /&gt;Datum &lt;br /&gt;get_level1_c(PG_FUNCTION_ARGS)&lt;br /&gt;{&lt;br /&gt;    int32 pid = PG_GETARG_INT32(0);&lt;br /&gt;    &lt;br /&gt;    int spi_ret;&lt;br /&gt;    char sql[100]; // не будем особо париться, пишем чтобы работало&lt;br /&gt;    char *tupval;&lt;br /&gt;    FuncCallContext *funcctx;&lt;br /&gt;    MemoryContext oldcontext;&lt;br /&gt;    Datum result;&lt;br /&gt;&lt;br /&gt;    if (SRF_IS_FIRSTCALL()) {&lt;br /&gt;        funcctx = SRF_FIRSTCALL_INIT();&lt;br /&gt;        oldcontext = MemoryContextSwitchTo(funcctx-&amp;gt;multi_call_memory_ctx);&lt;br /&gt;&lt;br /&gt;        /* Готовимся выполнять запрос */&lt;br /&gt;        SPI_connect(); // функция коннекта&lt;br /&gt;        // непосредственно сама строка запроса&lt;br /&gt;        snprintf(sql, sizeof(sql), &amp;quot;SELECT edge_pid2 FROM edge WHERE edge_pid1 = %d AND edge_pid2 &amp;lt;&amp;gt; %d&amp;quot;, pid, pid);&lt;br /&gt;        /* &lt;br /&gt;         * выполняем запрос. 0 в качестве третьего аргумента означает, &lt;br /&gt;         * что нужно обработать все туплы&lt;br /&gt;         */&lt;br /&gt;        spi_ret = SPI_execute(sql, true, 0);&lt;br /&gt;        /* &lt;br /&gt;         * наша функция будет вызвана столько раз, сколько туплов в &lt;br /&gt;         * нашем результате &lt;br /&gt;         */&lt;br /&gt;        funcctx-&amp;gt;max_calls = SPI_processed;&lt;br /&gt;&lt;br /&gt;        MemoryContextSwitchTo(oldcontext);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    funcctx = SRF_PERCALL_SETUP();&lt;br /&gt;&lt;br /&gt;    if (funcctx-&amp;gt;call_cntr &amp;lt; funcctx-&amp;gt;max_calls) {&lt;br /&gt;        /*&lt;br /&gt;         * Получаем строковое значение из текущего тупла&lt;br /&gt;         * Обратите внимание, хотя мы выбирали в запросе всего одну колонку,&lt;br /&gt;         * ее индекс равен 1, а не 0! Я лично потратил пару часов, чтобы это&lt;br /&gt;         * понять, не повторяйте моих ошибок&lt;br /&gt;         */&lt;br /&gt;        tupval = SPI_getvalue(SPI_tuptable-&amp;gt;vals[funcctx-&amp;gt;call_cntr], SPI_tuptable-&amp;gt;tupdesc, 1);&lt;br /&gt;        // дальше тривиально - просто делаем инт из строки и в датум его&lt;br /&gt;        result = Int32GetDatum(atoi(tupval));&lt;br /&gt;        SRF_RETURN_NEXT(funcctx, result);&lt;br /&gt;    } else {&lt;br /&gt;        SPI_finish();&lt;br /&gt;        SRF_RETURN_DONE(funcctx);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt; &lt;br /&gt;&lt;a name=&quot;A5&quot; title=&quot;A5&quot;&gt;&lt;/a&gt;&lt;h2&gt;Отладка (debug) кода&lt;/h2&gt;&lt;p&gt;Отлаживать собственный код можно, пользуясь, например, макросом elog и выводя в виде NOTICE-ов содержание каких-либо переменных. Например:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;elog(NOTICE, &amp;quot;My name is %s, I&amp;#39;m %d years old&amp;quot;, &amp;quot;Vanya&amp;quot;, 21);&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;По правильному замечанию &lt;a href=&quot;http://lnfm1.sai.msu.ru/%7Emath/&quot;&gt;Сергея Копосова&lt;/a&gt;, elog является устаревшим способом репорта об ошибках, правильнее использовать ereport, с помощью которого можно написать полностью эквивалентную конструкцию (подробнее читайте в &lt;a href=&quot;http://www.postgresql.org/docs/8.0/static/error-message-reporting.html&quot;&gt;документации&lt;/a&gt;):&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;ereport(NOTICE, (errmsg_internal(&amp;quot;My name is %s, I&amp;#39;m %d years old&amp;quot;, &amp;quot;Vanya&amp;quot;, 21)));&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Но если хочется делать все по-взрослому, то нужно использовать стандартный GNU debugger (gdb). Так как отлаживать мы будем процесс postmaster, нужно иметь привилегии пользователя, под которым он запущен. Итак, последовательность действий такова:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Стартуем какого-либо клиента, например psql&lt;/li&gt;&lt;li&gt;Из клиента выполняем SELECT pg_backend_pid(), узнавая тем самым pid процесса postmaster (это можно сделать и утилитой ps из командной строки)&lt;/li&gt;&lt;li&gt;Загружаем из клиента нашу динамическую библиотеку: LOAD &amp;#39;/usr/lib/pgsql/c-func_test.so&amp;#39;&lt;/li&gt;&lt;li&gt;В другой терминальной сессии под рутом, либо под хозяином postmaster-а (назовем его postgres, как это бывает обычно) стартуем дебаггер: gdb postgres &lt;em&gt;server-process-id&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Ставим breakpoint в нашей функции: (gdb) break &lt;em&gt;my-function&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Идем в назад в клиента и запускаем нашу функцию: SELECT my-function()&lt;/li&gt;&lt;li&gt;Нажимаем continue в дебаггере: (gdb) c или читаем help, если мы в нем первый раз оказались: (gdb) help&lt;/li&gt;&lt;/ol&gt; &lt;br /&gt;&lt;a name=&quot;A6&quot; title=&quot;A6&quot;&gt;&lt;/a&gt;&lt;h2&gt;Компиляция кода с помощью Makefile&lt;/h2&gt;&lt;p&gt;Для начала вам подойдет простейший Makefile:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class=&quot;code&quot;&gt;# Makefile for building C-functions shared objects for PostgreSQL&lt;br /&gt;# Author: IZ&lt;br /&gt;# Date:   2005/10/20&lt;br /&gt;&lt;br /&gt;SERVER_INCLUDES += -I $(shell pg_config --includedir)&lt;br /&gt;SERVER_INCLUDES += -I $(shell pg_config --includedir-server)&lt;br /&gt;&lt;br /&gt;CFLAGS += -g $(SERVER_INCLUDES)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.SUFFIXES: .so&lt;br /&gt;&lt;br /&gt;.c.so:&lt;br /&gt;    $(CC) $(CFLAGS) -fpic -c $&amp;lt;&lt;br /&gt;    $(CC) $(CFLAGS) -shared -o $@ $(basename $&amp;lt;).o&lt;br /&gt;    @echo Built!&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;    -rm -f *.o *.so *~ 2&amp;gt;/dev/null&lt;br /&gt;    @echo Cleaned!&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Затем просто запускаем make c-func_test.so и нам делается правильный со-шник в текущей директории. После этой процедуры уже можно делать LOAD в клиенте psql.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Важное примечание:&lt;/em&gt; уж не знаю по какой причине, но если я в качестве header-файлов беру те, что содержатся в pg_config --includedir-server, то есть из глобальных путей, при попытке загрузки so-шника в постгрес появляются сообщения вида undefined symbol: elog. Если при этом брать header-файлы из исходников постгреса, то есть указывать глобальные пути к ним, например, указывая в качестве ключа компилятору -I /home/iz/postgresql-8.0.2/src/include/, то определение elog-а найдется и все будет работать. Уж не знаю, почему при установке постгреса .h-файлы так неприятно обрезаются :(&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;a name=&quot;A7&quot; title=&quot;A7&quot;&gt;&lt;/a&gt;&lt;h2&gt;Замечания&lt;/h2&gt;&lt;p&gt;1. У вас не получится писать рекурсивные функции. Посмотрите на аргументы и возвращаемые значения, их типы и т.д. и догадайтесь сами, почему не получится.&lt;/p&gt;&lt;p&gt;2. Меня поразило отсутствие нормальной девелоперской документации к этой разработке. Я не считаю себе гуру в сишном программировании, скорее наоборот, но разве нельзя было как-нибудь &lt;strong&gt;по-нормальному&lt;/strong&gt; все задокументировать?&lt;/p&gt;&lt;p&gt;&lt;em&gt;Any feedback is welcome at iz at sai dot msu dot ru&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Oct 2005&lt;/em&gt; &lt;/p&gt;</description>
      <pubDate>Fri, 21 Oct 2005 02:15:40 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/32</guid>
    </item>
        <item>
      <title>Что такое PostgreSQL?</title>
      <link>http://postgresqlrussia.org/articles/view/57</link>
      <description>&lt;p&gt;&lt;em&gt;Автор: Олег Бартунов&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt; PostgreSQL - это свободно распространяемая объектно-реляционная система управления базами данных (ORDBMS), наиболее развитая из открытых СУБД в мире и являющаяся реальной альтернативой коммерческим базам данных. &lt;/blockquote&gt;  PostgreSQL произносится как &lt;strong&gt;post-gress-Q-L&lt;/strong&gt; (можно скачать mp3 файл &lt;a href=&quot;postgresql.mp3&quot;&gt;postgresql.mp3&lt;/a&gt;), в разговоре часто употребляется &lt;strong&gt;postgres&lt;/strong&gt; (&lt;strong&gt;пост-гресс&lt;/strong&gt;). Также, употребляется сокращение &lt;strong&gt;pgsql&lt;/strong&gt; (&lt;strong&gt;пэ-жэ-эс-ку-эль&lt;/strong&gt;). &lt;!-- &lt;p&gt; Адрес этой статьи:  &lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/talks/what_is_postgresql.html&quot;&gt; http://www.sai.msu.su/~megera/postgres/talks/what_is_postgresql.html&lt;/a&gt; &lt;/p&gt; --&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h1&gt;История развития PostgreSQL&lt;/h1&gt;  &lt;img style=&quot;margin: 10px 0pt 10px 10px; float: right&quot; src=&quot;http://www.sai.msu.su/~megera/postgres/talks/rel-db-hist-small.png&quot; alt=&quot;&quot; /&gt; &lt;p&gt; Краткую историю PostgreSQL можно прочитать в документации, распространяемой с дистрибутивом или на &lt;a href=&quot;http://www.postgresql.org/docs/current/static/history.html&quot;&gt;сайте&lt;/a&gt;. Также, есть &lt;a href=&quot;http://www.linuxshare.ru/postgresql/manual/history.html&quot;&gt;перевод&lt;/a&gt; на русский язык. Из нее следует, что современный проект PostgreSQL ведет  происхождение из проекта POSTGRES, который разрабатывался под руководством Майкла Стоунбрейкера (Michael Stonebraker), профессора Калифорнийского университета в Беркли (UCB). Мне захотелось несколько подробнее показать взаимосвязи родословных баз данных, чтобы лучше понять место PostgreSQL среди основных игроков  современного рынка баз данных. &lt;/p&gt; &lt;p&gt; Я попытался графически  ( &lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/talks/rel-db-hist.png&quot; target=&quot;_blank&quot;&gt;большая версия картинки&lt;/a&gt;  откроется в новом окне) отобразить все наиболее заметные RDBMS и связи между ними и приблизительно привел даты их создания и конца. Пересечение объектов означает поглощение, при этом поглощаемый объект более бледен и не окантован. Знак доллара означает, что база данных является коммерческой. При этом, я основывался на информации, доступной в интернете, в частности в &lt;a href=&quot;http://www.wikipedia.org/&quot;&gt;Wikipedia&lt;/a&gt;, в научных статьях, которые я читал и комментариях непосредственных пользователей  БД, которые я получил после публикации этой картинки в интернете. &lt;/p&gt; &lt;p&gt; Надо сказать, что несмотря на то, что вся история реляционных баз данных насчитывает менее 4 десятков лет, многие факты из истории создания трактуются по-разному, даты не согласуются, а сами участники событий зачастую просто вольно трактуют прошлое.Здесь надо принимать во внимание тот факт, что базы данных - это большой бизнес, в котором  развитие одних БД часто связано с  концом других. Кроме того, БД в то время были предметом научных исследований, поэтому приоритетность  работ является не последним аргументом при написании воспоминаний и интервью. Наверное, учитывая такую запутанность,  премия ACM  Software System Award #6  была присуждена одновременно двум соперничающим группам исследователей из IBM за работу над &amp;quot;System R&amp;quot; и Беркли - за INGRES, хотя Стоунбрейкер получил награду от  ACM SIGMOD (сейчас это премия названа в честь Теда Кодда - автора реляционной теории баз данных)  #1 в 1992 г., а Грей (Jim Gray, Microsoft) -  #2 в 1993 году. &lt;/p&gt; &lt;p&gt; Итак, как следует из рисунка, видно две ветви развития баз данных -  одна следует из &amp;quot;System R&amp;quot;, которая разрабатывалась в IBM в начале 70-х, и другая из проекта &amp;quot;INGRES&amp;quot;, которым руководил Стоунбрейкер приблизительно в тоже время. Эти два проекта начались как необходимость практического  использования  реляционной модели баз данных, разработанной Тедом Коддом (Ted Codd) из IBM в 1969,1970 годах. Надо помнить, что в то время имелось две альтернативные модели баз данных - сетевая и иерархическая, причем за ними стояли мощные силы - CODASYL Data Base Task Group (сетевая) и сама IBM с ее базой IMS  (Information Management System с иерархической моделью данных). Немного в стороне стоит &amp;quot;Oracle&amp;quot;, взлет которой во многом связан с коммерческим талантом Эллисона быть в нужном месте и в нужное время, как сказал Стоунбрейкер в своем  &lt;a href=&quot;http://www.crn.com/sections/special/hof/hof00.jhtml?articleId=18811372&quot;&gt;интервью&lt;/a&gt;, хотя она вместе с IBM сыграла большую роль в создании и продвижении SQL. &lt;/p&gt; &lt;p&gt; &amp;quot;System R&amp;quot; сыграла большую роль в развитии реляционных баз данных, создании языка SQL (изначально SEQUEL, но из-за проблем с уже существующей торговой маркой пришлось выкинуть все гласные буквы). Из &amp;quot;System R&amp;quot; развилась SQL/DS и DB2. На самом деле, в IBM было еще несколько проектов, но они были чисто внутренними. Подробнее об этой ветви можно прочитать в весьма поучительном документе &lt;a href=&quot;http://www.mcjones.org/System_R/SQL_Reunion_95/&quot;&gt;&amp;quot;The 1995 SQL Reunion: People, Projects, and Politics&amp;quot;&lt;/a&gt;, также доступен &lt;a href=&quot;http://www.citforum.ru/database/digest/sql1.shtml&quot;&gt;русский перевод&lt;/a&gt;. &lt;/p&gt; &lt;p&gt; INGRES (или Ingres89), в отличие от &amp;quot;System R&amp;quot;, вполне в духе Беркли развивалась как открытая база данных, коды которой распространялись на лентах практически бесплатно (оплачивались почтовые расходы и стоимость ленты). К 1980 году было распространено порядка 1000 копий. Название расшифровывается как &amp;quot;&lt;strong&gt;IN&lt;/strong&gt;teractive &lt;strong&gt;G&lt;/strong&gt;raphics (and) &lt;strong&gt;RE&lt;/strong&gt;trieval &lt;strong&gt;S&lt;/strong&gt;ystem&amp;quot; и совершенно &lt;strong&gt;случайно&lt;/strong&gt; связано  с французским художником &lt;a href=&quot;http://www.sai.msu.su/cjackson/ingres/ingres_bio.htm&quot;&gt;Jean Auguste Dominique Ingres&lt;/a&gt;. Отличительной  особенностью этой системы являлось то, что она разрабатывалась для операционной системы UNIX, которая работала на распространенных тогда PDP 11, что и  предопределило ее популярность, в то время как &amp;quot;System R&amp;quot; работала только на  больших и дорогих mainframe. Был разработан язык запросов QUEL, который, как писал Стоунбрейкер, похож на SEQUEL в том отношении, что программист свободен от знания о структуре данных и алгоритмах, что способствует значительной степени независимости от данных. Доступность INGRES  и очень либеральная лицензия BSD, а также творческая деятельность, способствовали  появлению большого количества реляционных баз данных, как показано на рисунке. &lt;/p&gt; &lt;p&gt; Стоунбрейкер лично способствовал их появлению, так он конце 70-х он организовал компанию Ingres Corporation (как он сам объясняет, ему пришлось на это пойти, так как Аризонский университет, потребовал поддержки), которая выпустила коммерческую версию Ingres, в 1994 году она была куплена CA (Computer Associates) и которая в 2004 году стала открытой как Ingres r3. &lt;/p&gt; &lt;p&gt; &amp;quot;NonStop SQL&amp;quot; компании Tandem Computers являлась модифицированной версией Ingres, которая эффективно работала на параллельных компьютерах и с  распределенными данными. Она умела выполнять запросы параллельно и масштабировалась почти линейно с количеством процессоров. Ее авторами были выпускники из Беркли. Впоследствии, Tandem Computers была куплена компанией Compaq (2000 г.), а затем компанией HP. &lt;/p&gt; &lt;p&gt; Компания Sybase тоже была организована человеком из Беркли (Роберт Эпстейн) и на основе Ingres. Известно, что база данных компании Мaйкрософт &amp;quot;SQL Server&amp;quot; -  это не что иное как база данных Sybase, которая была лицензирована для Windows NT. С 1993 года пути Sybase и Mirosoft разошлись и уже в 1995 году Sybase переименовывает свою базу данных в ASE (Adaptive Server Enterprise), а Microsoft стала продолжать развивать MS SQL. &lt;/p&gt; &lt;p&gt; Informix тоже возник из Ingres, но на это раз людьми не из Беркли, хотя Стоунбрейкер все-таки поработал в ней CEO после того, как Informix купила в 1995 году компанию Ilustra, чтобы прибавить себе объектно-реляционности и расширяемости (DataBlade), которую организовал все тот же Майкл Стоунбрейкер как результат  коммерциализации Postgres в 1992 году. В 2001 году она была куплена IBM, которая приобретала немалое количество пользователей Informix и технологию. Таким образом, DB2 также приобрела немного объектно-реляционности. &lt;/p&gt; &lt;p&gt; Проект Postgres возник как результат осмысления ошибок Ingres и желания преодолеть ограниченность типов данных, за счет возможности определения новых типов данных. Работа над проектом началась в 1985 и в период 1985-1988  было опубликовано несколько статей, описывающих модель данных, язык запросов POSTQUEL, и хранилище Postgres.  POSTGRES иногда еще относят к так называемым &lt;strong&gt;постреляционным СУБД&lt;/strong&gt;. Ограниченность реляционной модели всегда являлась предметом критики, хотя все понимали, что это является следствием ее простоты и ее заслугой. Однако, проникновение компьютерных  технологий во все сферы жизни требовали  новых приложений, а от баз данных -  поддержки новых типов данных и возможностей, например, поддержка наследования, создание и управление сложными объектами. &lt;/p&gt; &lt;p&gt; Еще при проектировании оригинальной версии &lt;strong&gt;POSTGRES&lt;/strong&gt; основное внимание было уделено расширяемости и объектно-ориентированным возможностям. Уже  тогда было ясна необходимость расширения функциональности DMBS от управления данными (&lt;strong&gt;data management&lt;/strong&gt;) в сторону управления объектами  (&lt;strong&gt;object management&lt;/strong&gt;) и знаниями (&lt;strong&gt;knowledge management&lt;/strong&gt;). При этом объектная функциональность позволит эффективно хранить и  манипулировать нетрадиционными типами данных, а управление знаниями позволяет хранить и обеспечивать выполнения коллекции правил (&lt;strong&gt;rules&lt;/strong&gt;), которые  несут семантику приложения. Стоунбрейкер так и определил основную задачу POSTGRES как &lt;strong&gt;&amp;quot;обеспечить поддержку приложений, которые требуют службы управления &lt;strong&gt;данными&lt;/strong&gt;, &lt;strong&gt;объектами&lt;/strong&gt; и &lt;strong&gt;знаниями&lt;/strong&gt;&amp;quot;&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt; Одним из фундаментальным понятием POSTGRES является &lt;em&gt;class&lt;/em&gt;. Class есть именованная коллекция экземпляров (&lt;em&gt;instances&lt;/em&gt;) объектов. Каждый экземпляр имеет коллекцию именованных &lt;strong&gt;атрибутов&lt;/strong&gt; и каждый атрибут имеет  определенный &lt;strong&gt;тип&lt;/strong&gt;. Классы могут быть трех типов - это основной класс, чьи экземпляры хранятся в базе данных, виртуальный (view), чьи экземпляры материализуются только при запросе (они поддерживаются системой управления правилами), и может быть версией другого (&lt;em&gt;parent&lt;/em&gt;) класса. &lt;/p&gt; &lt;p&gt; Первая версия была выпущена в 1989 году, затем последовало еще несколько переписываний системы правил (rule system). Отметим, что коды Ingres и Postgres не имели ничего общего ! В POSTGRES была реализована поддержка таких типов как многомерные массивы,  что уже шло в противоречие с реляционной моделью, timetravel - хранение версионности объектов (впоследствии, в версии 6.3 этот тип был удален, так как его поддержка требовала больших усилий, а  версионность могла быть реализована на стороне приложения с помощью триггеров). В 1992 году была образована компания Illustra, а сам проект был закрыт в 1993 году выпуcком версии 4.2. Однако, несмотря на официальное закрытие проекта, открытый код и BSD лицензия сподвигли выпускников Беркли Andrew Yu и Jolly Chen в 1994 году взяться за его дальнейшее развитие. В 1995 году они заменили  язык запросов POSTQUEL на общепринятый SQL, проект получил название &lt;strong&gt;Postgres95&lt;/strong&gt;,  изменилась нумерация версий, был создан веб сайт проекта и появились много новых пользователей (среди которых был и автор). &lt;/p&gt; &lt;p&gt; К 1996 году стало ясно, что название &amp;quot;Postgres95&amp;quot;  не выдержит испытанием  временем и было выбрано новое имя - &lt;strong&gt;&amp;quot;PostgreSQL&amp;quot;&lt;/strong&gt;, которое отражает связь с оригинальным проектом POSTGRES и приобретением SQL. Также, вернули старую нумерацию версий, таким образом новая версия стартовала как 6.0. В 1997 был предложен слон в качестве логотипа, сохранилось  &lt;a href=&quot;http://www.pgsql.ru/db/mw/msg.html?mid=1238939&quot;&gt;письмо&lt;/a&gt; в  архивах рассылки -hackers за 3 марта 1997 года и последующая дискуссия.  Слон был предложен Дэвидом Янгом в честь романа Агаты Кристи  &amp;quot;Elephants can remember&amp;quot; (Слоны могут вспоминать). До этого, логотипом был бегущий леопард (ягуар). Проект стал большой и управление на себя взяла небольшая вначале группа инициативных пользователей и разработчиков, которая  и получила название PGDG (PostgreSQL Global Development Group).  Дальнейшее развитие проекта полностью  &lt;a href=&quot;http://www.ru.postgresql.org/docs/current/static/release.html&quot;&gt;документировано&lt;/a&gt;  в документации и отражено в архивах списка рассылки -hackers. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h1&gt;Что есть PostgreSQL сегодня ?&lt;/h1&gt; &lt;p&gt; На сегодняшний день выпущена версия PostgreSQL v8 (19 января 2005 года), которая является  значительным событием в мире баз данных, так как количество новых возможностей добавленных в этой версии, позволяет говорить о возникновении интереса крупного  бизнеса как в использовании, так и его продвижении.  Так, крупнейшая компания в мире, Fujitsu поддержала работы над версией 8, выпустила коммерческий модуль  &lt;a href=&quot;http://www.fastware.com/postgresql.html&quot;&gt;Extended Storage Management&lt;/a&gt;. Либеральная &lt;a href=&quot;http://www.freebsd.org/copyright/freebsd-license.html&quot;&gt;BSD-лицензия&lt;/a&gt; позволяет коммерческим компаниям выпускать свои версии PostgreSQL под своим именем и осуществлять коммерческую поддержку. Например, компания  Pervasive объявила о выпуске &lt;a href=&quot;http://www.pervasivepostgres.com/&quot;&gt;Pervasive Postgres&lt;/a&gt;. &lt;/p&gt; &lt;p&gt; PostgreSQL поддерживается на всех современных Unix системах (34 платформы),  включая наиболее распространенные, такие как Linux, FreeBSD, NetBSD, OpenBSD, SunOS, Solaris,  DUX, а также под Mac OS X. Начиная с версии 8.X PostgreSQL работает в &amp;quot;native&amp;quot;  режиме под MS Windows NT, Win2000, WinXP, Win2003. Известно, что есть успешные попытки работать с PostgreSQL под Novell Netware 6 и OS2. &lt;/p&gt; &lt;p&gt; PostgreSQL неоднократно признавалась базой года, например, &lt;a href=&quot;http://www.linuxnewmedia.de/Award_2004/en&quot;&gt;Linux New Media AWARD 2004&lt;/a&gt;, &lt;a href=&quot;http://linuxjournal.com/article/6995&quot;&gt;2003 Editors&amp;#39; Choice Awards&lt;/a&gt;, &lt;a href=&quot;http://linuxjournal.com/article/7564&quot;&gt;2004 Editors&amp;#39; Choice Awards&lt;/a&gt;. &lt;/p&gt; &lt;p&gt; PostgreSQL используется как полигон для исследований нового типа баз данных, ориентированных на работу с &lt;strong&gt;потоками данных&lt;/strong&gt; - это проект &lt;a href=&quot;http://telegraph.cs.berkeley.edu/&quot;&gt;&lt;strong&gt;TelegraphCQ&lt;/strong&gt;&lt;/a&gt;, стартовавший в 2002 году в Беркли после успешного проекта &lt;strong&gt;Telegraph&lt;/strong&gt; (название главной улицы в Беркли). Интересно, что  компания &lt;a href=&quot;http://www.streambase.com/&quot;&gt;Streambase&lt;/a&gt;, которая  была основана Майком Стоунбрейкером в 2003 году (изначально &amp;quot;Grassy Brook&amp;quot;) для коммерческого продвижения этого нового поколения баз данных, никаким образом не ассоциируется с проектом Беркли. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Основные возможности и функциональность&lt;/h2&gt; &lt;p&gt; Полный список всех возможностей предоставляемых PostgreSQL и подробное описание можно найти в &lt;a href=&quot;http://www.postgresql.org/docs/current/static/&quot;&gt;объемной документации&lt;/a&gt; (1300 страниц). &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Надежность&lt;/strong&gt; PostgreSQL является проверенным и доказанным фактом и обеспечивается следующими возможностями: &lt;ul&gt; &lt;li&gt;полное соответствие принципам &lt;strong&gt;ACID&lt;/strong&gt;  - атомарность, непротиворечивость, изолированность, сохранность данных. &lt;ul&gt; &lt;li&gt;Atomicity - транзакция рассматривается как единая логическая единица,  все ее изменения или сохраняются целиком, или полностью откатываются.&lt;/li&gt; &lt;li&gt;Consistency - транзакция переводит базу данных из одного непротиворечивого  состояния (на момент старта транзакции) в другое непротиворечивое состояние   (на момент завершения транзакции).   Непротиворечивым считается состояние базы, когда выполняются все ограничения   физической и логической целостности базы данных, при этом    допускается нарушение ограничений целостности в   течение транзакции, но на момент завершения все ограничения целостности,   как физические, так и логические, должны быть соблюдены.&lt;/li&gt; &lt;li&gt;Isolation - изменения данных при конкурентных транзакциях изолированы друг от друга на основе системы версионности&lt;/li&gt; &lt;li&gt;Durability - PostgreSQL заботится о том, что результаты успешных транзакций &lt;strong&gt;гарантировано&lt;/strong&gt; сохраняются на жесткий диск вне зависимости от сбоев аппаратуры.&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;многоверсионность&lt;/strong&gt; (Multiversion Concurrency Control,MVCC)  используется для поддержания согласованности данных в конкурентных условиях, в то время как в традиционных базах данных используются блокировки. MVCC означает, что каждая транзакция видит копию данных (версию базы данных)  на время начала  транзакции, несмотря на то, что состояние базы могло уже измениться. Это защищает транзакцию от несогласованных изменений данных, которые могли быть вызваны (другой) конкурентной транзакцией, и обеспечивает изоляцию транзакций. Основной выигрыш от использования MVCC по сравнению с блокировкой заключается в том, что блокировка, которую ставит MVCC для чтения не конфликтует с блокировкой на запись, и  поэтому  чтение никогда не блокирует запись и наоборот. Конкурентные операции записи &amp;quot;мешают&amp;quot; друг другу только при работе с одной и той же записью. &lt;/li&gt; &lt;li&gt;наличие &lt;strong&gt;Write Ahead Logging&lt;/strong&gt; (WAL) - общепринятый механизм протоколирования всех транзакций, что позволяет восстановить систему после возможных сбоев. Основная идея WAL состоит в том, что все изменения должны записываться в файлы на диск только после того, как эти записи журнала, описывающие эти изменения  будут и &lt;strong&gt;гарантировано&lt;/strong&gt; записаны на диск. Это позволяет не сбрасывать страницы данных на диск после фиксации каждой транзакции, так как мы знаем и уверены, что сможем всегда восстановить базу данных используя журнал транзакций. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Point in Time Recovery&lt;/strong&gt; (PITR) - возможность восстановления базы данных (используя WAL) на любой момент в прошлом, что позволяет осуществлять непрерывное резервное копирование кластера PostgreSQL. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Репликация&lt;/strong&gt; также повышает надежность PostgreSQL. Существует несколько систем репликации, например, &lt;a href=&quot;http://www.slony.info&quot;&gt;Slony&lt;/a&gt; (тестируется версия 1.1), который является свободным и самым используемым решением, поддерживает master-slaves репликацию. Ожидается, что Slony-II будет поддерживать  multi-master режим. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Целостность данных&lt;/strong&gt; является сердцем PostgreSQL. Помимо MVCC, PostgreSQL поддерживает целостность данных на уровне схемы - это внешние ключи (foreign keys), ограничения (constraints).  &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Модель развития PostgreSQL&lt;/strong&gt;, которая абсолютно прозрачна для любого, так как все планы, проблемы и приоритеты открыто обсуждаются. Пользователи и разработчики находятся в постоянном диалоге через мэйлинг листы. Все предложения, патчи проходят тщательное тестирование до принятия их в программное дерево. Большое количество бета-тестеров способствует  тестированию версии до релиза и вычищению мелких ошибок. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Открытость кодов&lt;/strong&gt; PostgreSQL означает их абсолютную доступность для любого, а либеральная BSD лицензия не накладывает никаких ограничений на использование кода. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Производительность&lt;/strong&gt; PostgreSQL основывается на использовании индексов, интеллектуальном планировщике запросов, тонкой системы блокировок, системе управления буферами памяти и кэширования, превосходной масштабируемости при конкурентной работе.  &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Поддержка индексов&lt;/strong&gt; 	&lt;ul&gt; 	&lt;li&gt;Стандартные индексы - B-tree, hash, R-tree, GiST (обобщенное 	поисковое дерево) 	&lt;/li&gt; 	&lt;li&gt;Частичные индексы (&lt;strong&gt;partial indices&lt;/strong&gt;) - можно создавать индекс 	по ограниченному подмножеству значений, например, 	&lt;p&gt; 	 	create index idx_partial on foo (x) where x &amp;gt; 0; 	 	&lt;/p&gt; 	&lt;/li&gt; 	&lt;li&gt;Функциональные индексы (&lt;strong&gt;expressional indices&lt;/strong&gt;) позволяют создавать 	индексы используя значения функции от параметра, например, 	&lt;p&gt; 	 	create index idx_functional on foo ( length(x) ); 	 	&lt;/p&gt; 	&lt;/li&gt; 	&lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Планировщик запросов&lt;/strong&gt; основывается на стоимости различных планов, учитывая множество факторов. Он предоставляет возможность пользователю отлаживать запросы и настраивать систему. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Система блокировок&lt;/strong&gt; поддерживает блокировки на нижнем уровне, что позволяет сохранять высокий уровень конкурентности при защите целостности данных. Блокировка поддерживается на уровне таблиц и записей. На нижнем уровне, блокировка для общих ресурсов оптимизирована под конкретную ОС и архитектуру.  &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Управление буферами и кэширование&lt;/strong&gt; используют  &lt;a href=&quot;#buffer_management&quot;&gt;сложные алгоритмы&lt;/a&gt; для поддержания эффективности использования выделенных ресурсов памяти. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Tablespaces&lt;/strong&gt; (табличные пространства) для  управления хранения данных на уровне &lt;strong&gt;объектов&lt;/strong&gt;, таких как  базы данных, схемы, таблицы и индексы. Это позволяет гибко использовать дисковое пространство и повышает надежность, производительность, а также способствует масштабируемости системы. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Масштабируемость&lt;/strong&gt; основывается на описанных выше возможностях. Низкая требовательность PostgreSQL к ресурсам и гибкая система блокировок обеспечивают его шкалирование, в то время как индексы и управление буферами обеспечивают хорошую управляемость системы даже при высоких загрузках. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Расширяемость&lt;/strong&gt; PostgreSQL означает, что пользователь может  настраивать систему путем определения новых функций, агрегатов, типов,языков, индексов и операторов. Объектно-ориентированность PostgreSQL позволяет перенести логику приложения на уровень базы данных, что сильно упрощает разработку клиентов, так как вся бизнес логика находится в базе данных. Функции в PostgreSQL однозначно определяются названием, количеством и типами аргументов. &lt;p&gt; На рисунке приведена ER диаграмма &lt;strong&gt;системного каталога&lt;/strong&gt; PostgreSQL, в котором заложены все сведения об объектах системы, операторах и методах доступа  к ним. При инициализации PostgreSQL кластера (команда initdb) создаются  две базы данных - &lt;em&gt;template0&lt;/em&gt; и &lt;em&gt;template1&lt;/em&gt;, которые содержат предопределенный по умолчанию набор функциональностей. Любая другая база данных наследует &lt;em&gt;template1&lt;/em&gt;, таким образом, часто используемые объекты и методы можно добавить в системный каталог &lt;em&gt;template1&lt;/em&gt;.  &lt;/p&gt; &lt;p style=&quot;margin: 10px 0pt; text-align: center&quot;&gt; &lt;img src=&quot;http://www.sai.msu.su/~megera/postgres/talks/catalog-small.gif&quot; alt=&quot;&quot; /&gt; &lt;/p&gt; &lt;p&gt; PostgreSQL предоставляет командный интерфейс для работы с системным каталогом, с помощью которого можно не только получать информацию об объектах системы, но  и создавать новые. Например, создавать базы данных с помощью &lt;strong&gt;CREATE DATABASE&lt;/strong&gt;, новый домен - &lt;strong&gt;CREATE DOMAIN&lt;/strong&gt;, оператор -  &lt;strong&gt;CREATE OPERATOR&lt;/strong&gt;, тип данных - &lt;strong&gt;CREATE TYPE&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt; Для создания нового типа данных и индексных методов доступа достаточно: &lt;/p&gt;&lt;ul&gt; &lt;li&gt;Написать функции ввода/вывода и зарегистрировать их в системном каталоге с помощью &lt;strong&gt;CREATE FUNCTION&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Определить тип в системном каталоге с помощью &lt;strong&gt;CREATE TYPE&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Создать операторы для этого типа данных с помощью &lt;strong&gt;CREATE OPERATOR&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Написать функции сравнения и зарегистрировать их в системном каталоге с помощью &lt;strong&gt;CREATE FUNCTION&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Создать оператор по умолчанию, который будет использоваться для создания индекса по &lt;em&gt;primary key&lt;/em&gt; - &lt;strong&gt;CREATE OPERATOR CLASS&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt; Описанный сценарий использует существующих вид индекса. Для создания новых  индексов надо использовать GiST. &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; Одной из примечательных особенностью PostgreSQL является обобщенное поисковое дерево или GiST (&lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/gist/&quot;&gt;домашняя страница проекта&lt;/a&gt;), которое дает возможность специалистам в конкретной области знаний создавать специализированные типы данных и обеспечивает индексный доступ к ним не будучи экспертами в области баз данных. Аналогом GiST является технология DataBlade, которой сейчас владеет IBM (см. историческую справку выше). Идея GiST была придумана профессором Беркли &lt;a href=&quot;http://www.cs.berkeley.edu/~jmh/&quot;&gt;Джозефом Хеллерстейном&lt;/a&gt;(Joseph M. Hellerstein) и опубликована  в статье &lt;a href=&quot;http://gist.cs.berkeley.edu/VLDB95.ps&quot;&gt;Generalized Search Trees for Database Systems&lt;/a&gt;. Оригинальная версия GiST была разработана в Беркли как патч к POSTGRES и  позднее была инкорпорирована в PostgreSQL. Позже, в 2001 году код был сильно модифицирован для поддержки ключей переменной длины, много-атрибутных индексов и безопасной работы с NULL, также были исправлено несколько ошибок. К настоящему времени написано довольно много интересных расширений  на основе GiST, в  том числе: &lt;/p&gt;&lt;ul&gt; &lt;li&gt;модуль полнотекстового поиска  &lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2&quot;&gt;tsearch2&lt;/a&gt;.  С версии 8.3 полнотекстовый поиск будет встроен в ядро PostgreSQL  (см. &lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/talks/fts_pgsql_intro.html&quot;&gt;Введение в полнотекстовый поиск&lt;/a&gt;). &lt;/li&gt;&lt;li&gt;модуль для работы с иерархическими данными (tree-like)  &lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/gist/ltree&quot;&gt;ltree&lt;/a&gt; &lt;/li&gt;&lt;li&gt;модуль для работы с массивами целых чисел &lt;strong&gt;intarray&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt; Дистрибутив PostgreSQL в поддиректории &lt;em&gt;contrib/&lt;/em&gt; содержит большое  количество (около 80) так называемых контриб-модулей, реализующих разнообразную дополнительную функциональность, такую как, полнотекстовый поиск, работа с xml, функции математической статистики, поиск с ошибками, криптографические модули и т.д. Также, есть утилиты, облегчающие миграцию с mysql, oracle, для административных работ. &lt;/p&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Поддержка SQL&lt;/strong&gt;, кроме основных возможностей, присущих любой  SQL базе данных, PostgreSQL поддерживает: &lt;ul&gt; &lt;li&gt;Очень высокий уровень соответствия ANSI SQL 92, ANSI SQL 99 и ANSI SQL 2003. Подробнее можно прочитать в &lt;a href=&quot;http://www.ru.postgresql.org/docs/current/static/features.html&quot;&gt;документации&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Схемы&lt;/strong&gt;, которые обеспечивают пространство имен на уровне SQL. Схемы содержат таблицы, в них можно определять типы данных, функции и операторы. Используя полное имя объекта можно одновременно работать с несколькими схемами. Схемы позволяют организовать базы данных совокупность нескольких логических частей, каждая их которых имеет свою политику доступа, типы данных. Для приложений, которые создают новые объекты в базе данных удобно и безопасно создавать отдельную схему (и включать ее в SEARCH_PATH) с тем, чтобы избежать возможной коллизии с именами объектов и удобством обновления приложения.  &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Subqueries&lt;/strong&gt; - подзапросы (subselects), полная поддержка SQL92. Подзапросы делают язык SQL более гибким и зачастую более эффективным. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Outer Joins&lt;/strong&gt; - внешние связки (LEFT,RIGHT, FULL)&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Rules&lt;/strong&gt; - правила, согласно которым модифицируется исходный запрос. Главное отличие от триггеров состоит в том, что rule работает на уровне запроса и &lt;strong&gt;перед&lt;/strong&gt; исполнением запроса, а триггер - это реакция системы на изменение данных, т.е. триггер запускается &lt;strong&gt;в процессе&lt;/strong&gt; исполнения запроса для каждой измененной записи (PER ROW). Правила используются для указания системе, какие действия надо произвести при попытке обновления &lt;em&gt;view&lt;/em&gt;. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Views&lt;/strong&gt; - представления, виртуальные таблицы. Реальных экземпляров этих таблиц не существуют, они материализуются только при запросе. Одним из основных предназначений &amp;#39;view&amp;#39; является разделение прав доступа к родительским таблицам и к &amp;#39;view, а также обеспечение  постоянства пользовательского интерфейса при изменении родительских таблиц.  Обновление &amp;#39;view&amp;#39; (материализация) &lt;a href=&quot;http://jonathangardner.net/PostgreSQL/materialized_views/matviews.html&quot;&gt;возможно&lt;/a&gt; в  PostgreSQL с помощью pl/pgsql. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Cursors&lt;/strong&gt; - курсоры, позволяют уменьшить трафик между клиентом и  сервером, а также память на клиенте, если требуется получить не весь результат запроса, а только его часть. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Table Inheritance&lt;/strong&gt; - наследование таблиц, позволяющее создавать объекты,  которые наследуют структуру родительского объекта и добавлять свои  специфические атрибуты. При этом наследуются значения атрибутов по умолчанию  (&lt;strong&gt;DEFAULTS&lt;/strong&gt;) и ограничение целостности (&lt;strong&gt;CONSTRAINTS&lt;/strong&gt;).  Поиск по родительской таблице автоматически включает поиск по дочерним объектам, при этом сохраняется возможность поиска только по ней (&lt;strong&gt;only&lt;/strong&gt;). Наследование можно использовать для работы с очень большими таблицами для  эмуляции &lt;strong&gt;partitioning&lt;/strong&gt;. &lt;/li&gt; &lt;li&gt;Prepared Statements (преподготовленные запросы) - это объекты, живущие на стороне сервера, которые представляют собой оригинальный запрос  после команды &lt;strong&gt;PREPARE&lt;/strong&gt;, который уже прошел стадии разбора запроса (parser), модификации запроса (rewriting rules) и создания плана выполнения запроса (planner), в результате чего, можно использовать команду &lt;strong&gt;EXECUTE&lt;/strong&gt;, которая уже не требует прохождения этих стадий. Для сложных запросов это может быть большим выигрышем. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Stored Procedures&lt;/strong&gt; - серверные (хранимые) процедуры позволяют реализовывать бизнес логику приложения на стороне сервера. Кроме того, они позволяют сильно уменьшить трафик между клиентом и сервером.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Savepoints&lt;/strong&gt;(nested transactions) - в отличие от &amp;quot;плоских транзакций&amp;quot;, которые не имеют промежуточных точек фиксации, использование &lt;strong&gt;savepoints&lt;/strong&gt; позволяет отменять работу части транзакции, например вследствии ошибочно введенной команды, без влияния на оставшуюся часть транзакции. Это бывает очень полезно для транзакций, которые работают с большими объемами данных. &lt;/li&gt; &lt;li&gt;Права доступа к объектам системы на основе системы привилегий. Владелец объекта или суперюзер может как разрешать доступ (&lt;strong&gt;GRANT&lt;/strong&gt;), так и отменять (&lt;strong&gt;REVOKE&lt;/strong&gt;).&lt;/li&gt; &lt;li&gt;Система обмена сообщениями между процессами - &lt;strong&gt;LISTEN&lt;/strong&gt; и &lt;strong&gt;NOTIFY&lt;/strong&gt; позволяют организовывать событийную модель взаимодействия между клиентом и  сервером (клиенту передается название события, назначенное командой &lt;em&gt;notify&lt;/em&gt; и PID процесса). &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Триггеры&lt;/strong&gt; позволяют управлять реакцией системы на изменение данных (INSERT,UPDATE,DELETE), как перед самой операцией (&lt;strong&gt;BEFORE&lt;/strong&gt;), так и после (&lt;strong&gt;AFTER&lt;/strong&gt;). Во время выполнения триггера доступны специальные переменные NEW (запись,  которая будет вставлена или обновлена) и OLD (запись перед обновлением). &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Cluster table&lt;/strong&gt; - упорядочивание записей таблицы на диске согласно индексу, что иногда за счет уменьшения доступа к диску ускоряет выполнение запроса. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Богатый набор типов данных&lt;/strong&gt; PostgreSQL включает: &lt;ul&gt; &lt;li&gt;Символьные типы (&lt;strong&gt;character(n)&lt;/strong&gt;) как определено в стандарте SQL и тип &lt;strong&gt;text&lt;/strong&gt;  с практически неограниченной длиной. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Numeric&lt;/strong&gt; тип поддерживает произвольную точность, очень востребованную в научных и финансовых приложениях.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Массивы&lt;/strong&gt; согласно стандарту SQL:2003&lt;/li&gt; &lt;li&gt;Большие объекты (&lt;strong&gt;Large Objects&lt;/strong&gt;) позволяют хранить в базе данных бинарные данные размером до 2Gb&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Геометрические типы&lt;/strong&gt; (point, line, circle,polygon, box,...) позволяют работать с пространственными данными на плоскости.&lt;/li&gt; &lt;li&gt;ГИС (&lt;strong&gt;GIS&lt;/strong&gt;) типы в PostgreSQL являются доказательством расширяемости PostgreSQL и позволяют эффективно работать с трехмерными данными. Подробности можно найти на сайте проекта &lt;a href=&quot;http://postgis.refractions.net/&quot;&gt;PostGis&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;Сетевые типы (&lt;strong&gt;Network types&lt;/strong&gt;) поддерживают типы данных &lt;strong&gt;inet&lt;/strong&gt; для IPV4, IPV6,  а также &lt;strong&gt;cidr&lt;/strong&gt; (Classless Internet Domain Routing) блоки и &lt;strong&gt;macaddr&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Композитные типы (&lt;strong&gt;composite types&lt;/strong&gt;) объединяют один или несколько  элементарных типов и позволяют пользователям манипулировать со сложными объектами.&lt;/li&gt; &lt;li&gt;Временные типы (timestamp, interval, date, time) реализованы с очень большой точностью&lt;/li&gt; &lt;li&gt;Псевдотипы &lt;strong&gt;serial&lt;/strong&gt; и &lt;strong&gt;bigserial&lt;/strong&gt; позволяют организовать упорядоченную последовательность целых чисел (AUTO_INCREMENT у некоторых СУБД). &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; PostgreSQL имеет очень богатый набор &lt;strong&gt;встроенных функций&lt;/strong&gt; и &lt;strong&gt;операторов&lt;/strong&gt; для работы с данными, полный список которых можно посмотреть в &lt;a href=&quot;http://www.postgresql.org/docs/current/static/functions.html&quot;&gt;документации&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;Поддержка 25 различных наборов символов (&lt;strong&gt;charsets&lt;/strong&gt;), включая ASCII, LATIN, WIN, KOI8 и UNICODE, а также поддержка &lt;strong&gt;locale&lt;/strong&gt;, что позволяет корректно работать с данными на разных языках.&lt;/li&gt; &lt;li&gt;Поддержка &lt;strong&gt;NLS&lt;/strong&gt;(Native Language Support) - документация, сообщения об ошибках доступны на различных языках, включая японский, немецкий, итальянский, французский, русский, испанский, португальский, словенский, словацкий и несколько диалектов китайского языков.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Интерфейсы&lt;/strong&gt; в PostgreSQL реализованы для доступа к базе данных из ряда  языков (C,C++,C#,python,perl,ruby,php,Lisp и другие) и методов доступа к данным (JDBC, ODBC). &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Процедурные языки&lt;/strong&gt; позволяют пользователям разрабатывать свои функции на стороне сервера, тем самым переносить логику приложения на сторону базы данных,  используя языки программирования, отличные от встроенных SQL и C. К настоящему времени поддерживаются (включены в стандартный дистрибутив)  PL/pgSQL, pl/Tcl, Pl/Perl и pl/Python. Кроме них, существует поддержка PHP, Java, Ruby, R, shell. &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Простота использования&lt;/strong&gt; всегда являлась важным фактором для разработчиков.  &lt;p&gt; Утилита &lt;strong&gt;psql&lt;/strong&gt; (входит в дистрибутив) предоставляет удобный интерфейс для работы с базой данных, содержит краткий справочник по SQL, облегчает ввод команд (используя стрелки для повтора и табулятор для расширения), поддерживает историю и буфер запросов, а также позволяет работать как в интерактивном режиме, так и потоковом режиме.  &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://phppgadmin.sourceforge.net/&quot;&gt;phpPgAdmin&lt;/a&gt; (лицензия GPL) представляет возможность с помощью веб браузера  администрировать PostgreSQL кластер. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.pgadmin.org/&quot;&gt;pgAdmin III&lt;/a&gt; (GNU Artistic license) предоставляет  удобный интерфейс для работы с базами данных PostgreSQL и работает под Linux, FreeBSD и  Windows 2000/XP. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.pgedit.com/&quot;&gt;PgEdit&lt;/a&gt; - программная среда для разработки приложений и SQL-редактор, доступна для Windows и Mac. &lt;/p&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Безопасность данных&lt;/strong&gt; также является важнейшим аспектом любой СУБД. В PostgreSQL она обеспечивается 4-мя уровнями безопасности: &lt;ul&gt; &lt;li&gt;PostgreSQL нельзя запустить под привилегированным пользователем - системный контекст&lt;/li&gt; &lt;li&gt;SSL,SSH шифрование трафика между клиентом и сервером - сетевой контекст&lt;/li&gt; &lt;li&gt;сложная система аутентификации на уровне хоста или IP адреса/подсети. Система аутентификации поддерживает пароли, шифрованные пароли, Kerberos, IDENT и прочие системы, которые могут подключаться используя механизм подключаемых аутентификационных модулей. &lt;/li&gt; &lt;li&gt;Детализированная система прав доступа ко всем объектам базы данных, которая совместно со схемой, обеспечивающая изоляцию названий объектов для каждого пользователя, PostgreSQL предоставляет богатую и гибкую инфраструктуру. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Некоторые пределы PostgreSQL&lt;/h2&gt; &lt;table border=&quot;0&quot; class=&quot;article&quot;&gt; &lt;tbody&gt; &lt;tr&gt;&lt;th&gt;Название&lt;/th&gt;&lt;th&gt;Значение&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Максимальный размер БД&lt;/td&gt;&lt;td&gt;Unlimited&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Максимальный размер таблицы&lt;/td&gt;&lt;td&gt;32 TB&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Максимальная длина записи&lt;/td&gt;&lt;td&gt;400Gb&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Максимальный длина атрибута&lt;/td&gt;&lt;td&gt;1 GB&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Максимальное количество записей в таблице&lt;/td&gt;&lt;td&gt;Unlimited&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Максимальное количество атрибутов в таблице&lt;/td&gt;&lt;td&gt;250 - 1600 в зависимости от типа атрибута&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Максимальное количество индексов на таблицу&lt;/td&gt;&lt;td&gt;Unlimited&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Сводная таблица основных реляционных баз данных&lt;/h2&gt; &lt;p&gt; За основу взяты данные из &lt;a href=&quot;http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems&quot;&gt;Wikipedia&lt;/a&gt; &lt;/p&gt; &lt;table border=&quot;0&quot; class=&quot;article centred&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th&gt;Название&lt;/th&gt;&lt;th&gt;ASE&lt;/th&gt;&lt;th&gt;DB2&lt;/th&gt;&lt;th&gt;FireBird&lt;/th&gt;&lt;th&gt;InterBase&lt;/th&gt;&lt;th&gt;MS SQL&lt;/th&gt;&lt;th&gt;MySQL&lt;/th&gt;&lt;th&gt;Oracle&lt;/th&gt;&lt;th&gt;PostgreSQL&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Лицензия&lt;/td&gt;&lt;td&gt;$$$&lt;/td&gt;&lt;td&gt;$$$&lt;/td&gt; &lt;td&gt;IPL&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt; &lt;td&gt;$$$&lt;/td&gt; &lt;td&gt;$$$&lt;/td&gt; &lt;td&gt;GPL/$$$&lt;/td&gt; &lt;td&gt;$$$&lt;/td&gt; &lt;td&gt;BSD&lt;/td&gt;  &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;ACID&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;depends&quot;&gt;Depends&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;  &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Referential integrity&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;depends&quot;&gt;Depends&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Transaction&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;depends&quot;&gt;Depends&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Unicode&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Schema&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;sup&gt;5&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Temporary table&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;View&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Materialized view&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;sup&gt;3&lt;/sup&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Expression index&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Partial index&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Inverted index&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;sup&gt;6&lt;/sup&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Bitmap index&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Domain&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt;&lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Cursor&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;  &lt;/tr&gt; &lt;tr&gt;&lt;td class=&quot;feature&quot;&gt;User Defined Functions&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;sup&gt;4&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;  &lt;/tr&gt; &lt;tr&gt;&lt;td class=&quot;feature&quot;&gt;Trigger&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;sup&gt;4&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;  &lt;/tr&gt; &lt;tr&gt;&lt;td class=&quot;feature&quot;&gt;Stored procedure&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;sup&gt;4&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;  &lt;/tr&gt; &lt;tr&gt;&lt;td class=&quot;feature&quot;&gt;Tablespace&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;&lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;/td&gt; &lt;td&gt;?&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;sup&gt;5&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;no&quot;&gt;No&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt; &lt;td class=&quot;yes&quot;&gt;Yes&lt;/td&gt;  &lt;/tr&gt; &lt;tr class=&quot;feature&quot;&gt; &lt;th&gt;Название&lt;/th&gt;&lt;th&gt;ASE&lt;/th&gt;&lt;th&gt;DB2&lt;/th&gt;&lt;th&gt;FireBird&lt;/th&gt;&lt;th&gt;InterBase&lt;/th&gt;&lt;th&gt;MS SQL&lt;/th&gt;&lt;th&gt;MySQL&lt;/th&gt;&lt;th&gt;Oracle&lt;/th&gt;&lt;th&gt;PostgreSQL&lt;/th&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt; Замечания:  &lt;/p&gt;&lt;ul&gt;    &lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; - для поддержки транзакций и ссылочной целостности требуется InnoDB (не является типом таблицы по умолчанию)&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; - Interbase Public License    &lt;/li&gt;&lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; - Materialized view (обновляемые представления) могут быть &lt;a href=&quot;http://jonathangardner.net/PostgreSQL/materialized_views/matviews.html&quot;&gt;эмулированы&lt;/a&gt; на  PL/pgSQL&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; - только в MySQL 5.0, которая является экспериментальной версией&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; - только в MS SQL Server 2005 (Yukon)&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;6&lt;/strong&gt; - GIN (Generalized Inverted Index) с версии 8.2&lt;/li&gt;  &lt;/ul&gt;  &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt;  &lt;h2&gt;Что ожидается в будущих версиях&lt;/h2&gt; &lt;p&gt; Полный список новых возможностей приведен в большом списке &lt;a href=&quot;http://developer.postgresql.org/todo.php&quot;&gt;TODO&lt;/a&gt;, который уже много лет поддерживает Брюс Момжан (Bruce Momjian), однако приоритеты для версии 8.1 еще не определены, более того, пока не определена продолжительность цикла разработки. Пока можно достаточно уверенно утверждать, что в 8.1 версии, помимо исправлений ошибок и улучшения существующей функциональности или приведение синтаксиса к стандарту SQL, будут: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;bitmap&lt;/strong&gt; индексы (initial submit &lt;strong&gt;CVS&lt;/strong&gt;)&lt;/li&gt; &lt;li&gt;интегрирование &lt;strong&gt;autovacuum&lt;/strong&gt; в серверный процесс&lt;/li&gt; &lt;li&gt;Two phase commit JDBC driver&lt;/li&gt; &lt;li&gt;поддержка IN,OUT,INOUT параметров для pl/pgsql (&lt;strong&gt;CVS&lt;/strong&gt;)&lt;/li&gt; &lt;li&gt;увеличение предела максимального количества аргументов у функции (100 по умолчанию) (&lt;strong&gt;CVS&lt;/strong&gt;) &lt;/li&gt; &lt;li&gt;Оптимизация MIN,MAX за счет использования индексов (&lt;strong&gt;CVS&lt;/strong&gt;)&lt;/li&gt; &lt;li&gt;Поддержка UTF-16&lt;/li&gt; &lt;li&gt;GiST Concurrency &amp;amp; Recovery ! (&lt;strong&gt;CVS&lt;/strong&gt;)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; Также, недавно проходило обсуждение о возможных планах о поддержке &lt;strong&gt;table partitioning&lt;/strong&gt;, что сильно увеличивает производительность базы данных при работе с большими таблицами. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Новость:&lt;/strong&gt; &lt;/p&gt; &lt;p&gt; Вышла версия 8.0.2, в которой, помимо исправления ошибок и изменения версии библиотеки &lt;strong&gt;libpq&lt;/strong&gt; (ВНИМАНИЕ ! Все клиентские приложения, которые используют libpq, требуется пересобрать, например DBD::Pg),  алгоритм кэширования страниц &amp;quot;ARC&amp;quot;, которым владеет IBM, был  заменен на другой, &amp;quot;патентно-чистый&amp;quot; алгоритм &amp;quot;2Q&amp;quot;.  &lt;/p&gt; &lt;p&gt; Поскольку история с заменой алгоритма &amp;quot;ARC&amp;quot; в PostgreSQL  вызвала большой интерес и обсуждение в сети (а она связана с очень &amp;quot;горячей&amp;quot; темой выдачи и использования патентов на программное обеспечение),  я остановлюсь подробнее на описании механизма кэширования (buffer management) в PostgreSQL. Я использовал &lt;a href=&quot;http://www.pgsql/ru/db/mw&quot;&gt;архив обсуждений&lt;/a&gt;, оригинальные работы и статью Элейн Мустэйн (A. Elein Mustain)  &lt;a href=&quot;http://www.varlena.com/varlena/GeneralBits/96.php&quot;&gt; The Saga of the ARC Algorithm and Patent&lt;/a&gt;. &lt;/p&gt; &lt;a name=&quot;buffer_management&quot; title=&quot;buffer_management&quot;&gt;&lt;/a&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Управление буферами в PostgreSQL&lt;/h2&gt; &lt;p&gt; Кэширование страниц, или сохранение прочитанных с диска страниц в памяти, очень важно для эффективной работы любой СУБД, так как времена доступа к диску и памяти отличаются на многие порядки. В идеале, мы хотим, чтобы все страницы, к которым происходит обращение, попадали в память, с тем, чтобы последующее ее использование не требовало обращения к диску. Однако, так как количество доступной памяти ограниченно, то возникает ситуация, когда требуется принимать решение, какую страницу надо освободить  (заместить) для того, чтобы поместить в кэш новую страницу. Практически все коммерческие системы используют ту или иную вариацию &lt;strong&gt;LRU&lt;/strong&gt; (Least Recently Used) алгоритма,  в котором высвобождается та страница, к которой дольше всего не обращались.  В чистом виде этот алгоритм не очень хорош для использования в СУБД в силу  большой разнообразности последовательности запросов, например,  не учитывает частоту обращения к странице, не защищен от  &amp;quot;cache flooding&amp;quot;, когда всего  одно единичное последовательное чтение большого количества  страниц  (sequential scan) может заполнить кэш страницами, к которым может не  быть  больше обращения, т.е., к полной потере эффективности кэширования.  Иногда, используют термин  &amp;quot;scan-resistant&amp;quot;, когда говорят, что хороший алгоритм должет быть устойчив по отношению к &amp;quot;cache flooding&amp;quot;. &lt;/p&gt; &lt;p&gt; PostgreSQL использовал разновидность этого алгоритма, известную как  &lt;a href=&quot;http://citeseer.ist.psu.edu/16869.html&quot;&gt;&lt;strong&gt;LRU/K&lt;/strong&gt;&lt;/a&gt;, реализованную Томом Лайном (Tom Lane). В этом алгоритме используется  история &lt;strong&gt;K-последних&lt;/strong&gt; обращений к странице (именно &lt;strong&gt;последних&lt;/strong&gt;, что позволяет этому алгоритму адаптироваться к изменениям шаблона запросов, в отличие от  &lt;strong&gt;LFU&lt;/strong&gt; алгоритма), которая позволяет отличить популярные страницы от  давно не используемых.  Для этого строится упорядоченная очередь (priority queue)  указателей на страницы в кэше на основе времени обращения к странице по правилу:  если у  страницы P1  K-тое обращение (&lt;strong&gt;предпоследнее&lt;/strong&gt;, для наиболее важного случая K=2, LRU/2 ) является более  свежим чем у P2, то P1 будет замещено после P2.  Классический LRU алгоритм  можно рассматривать как &lt;strong&gt;LRU/1&lt;/strong&gt;, так как он использовал информацию только об одном (последнем) обращении  к странице. Важным является не то, что произошло единичное обращение к странице, а то, насколько эта страница была популярна в течение некоторого времени. Однако, этот алгоритм требовал нетривиальной настройки и   время на построение очереди растет логарифмически в зависимости от размера буфера. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.almaden.ibm.com/StorageSystems/autonomic_storage/ARC/arcfast.pdf&quot;&gt;ARC&lt;/a&gt;  (Adaptive Replacement Cache) алгоритм был привлекателен тем, что он учитывал  не только как &lt;strong&gt;часто&lt;/strong&gt; страница была использована, но и  насколько  &lt;strong&gt;недавно&lt;/strong&gt; это происходило и не сильно &amp;quot;нагружал&amp;quot; процессор, как это происходило с LRU/K алгоритмом. Он динамически поддерживает баланс  между часто используемыми и недавно используемыми страницами. Этот алгоритм был реализован Яном Виком (Jan Wieck) для версии 7.5 (впоследствии 8.0), который впоследствии был  несколько улучшен после &lt;a href=&quot;http://citeseer.ist.psu.edu/bansal04car.html&quot;&gt;статьи&lt;/a&gt;, описывающей &lt;strong&gt;CAR&lt;/strong&gt; (Clock with Adaptive Replacement) алгоритм. Однако, незадолго (за два дня) до выхода PostgreSQL 8.0 было обнаружено (см. &lt;a href=&quot;http://www.pgsql.ru/db/mw/msg.html?mid=2036820&quot;&gt;постинг&lt;/a&gt; Нейла Конвея (Neil Conway) и последующее обсуждение), что IBM подала  &lt;a href=&quot;http://appft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&amp;amp;Sect2=HITOFF&amp;amp;d=PG01&amp;amp;p=1&amp;amp;u=%2Fnetahtml%2FPTO%2Fsrchnum.html&amp;amp;r=1&amp;amp;f=G&amp;amp;l=50&amp;amp;s1=%2220040098541%22.PGNR.&amp;amp;OS=DN/20040098541&amp;amp;RS=DN/20040098541&quot;&gt;заявку на алгоритм ARC&lt;/a&gt; еще в 2002 году. Так как было уже поздно что-либо менять было решено выпустить 8.0 версию как есть, а потом заняться решением проблемы. Несмотря на то, что IBM еще не получила патент на ARC алгоритм и то, что IBM имеет хорошую практику &lt;a href=&quot;http://www.ibm.com/news/us/en/2005/01/patents.html&quot;&gt;поддержки OSS проектов&lt;/a&gt;, и можно было надеяться на получения официального разрешения на его использование в PostgreSQL, как предлагали многие, было решено исследовать вопрос о действительном нарушение патента и выяснить возможность замены ARC  алгоритма на &amp;quot;патентно-чистый&amp;quot; алгоритм.  &lt;/p&gt; &lt;p&gt; Основным аргументов в пользу замены алгоритма было желание сохранить PostgreSQL доступным для &lt;strong&gt;&amp;quot;любого использования&amp;quot;&lt;/strong&gt; согласно BSD лицензии, которая позволяет коммерческое использование PostgreSQL без каких-либо лицензионных отчислений. В начале февраля 2005 года Том Лэйн предложил измененную версию ARC алгоритма, близкую к &lt;a href=&quot;http://citeseer.ist.psu.edu/63909.html&quot;&gt;&lt;strong&gt;2Q&lt;/strong&gt;&lt;/a&gt; и  опубликованную в 1994 году задолго до ARC, и которая решала проблему &amp;quot;cache flooding&amp;quot; (&amp;quot;scan resistant&amp;quot;) и не требовала больших изменений  в коде (в основном удаление кода), которая и была реализована в версии 8.0.2. 2Q алгоритм (Two Queue) почти также эффективен как LRU/K, но проще, не требует настройки и быстрее. Он добивается этого тем, что хранит в  основном буфере только &amp;quot;горячие&amp;quot; страницы, а не занимается очищением &amp;quot;холодных&amp;quot; страниц в основном буфере как LRU/2.  Упрощенно алгоритм выглядит так: при первом обращении указатель на страницу помещается в очередь A1 (FIFO), и если во время второго обращения страница еще находилась в A1, то страница называется горячей и  помещается в основной буфер, который уже контролируется как LRU очередь. Если к странице не обращались пока она была в A1, то страница, вероятно, &amp;quot;холодная&amp;quot; и 2Q алгоритм удаляет ее из буфера. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h1&gt;PGDG - PostgreSQL Global Development Group&lt;/h1&gt; &lt;p&gt; PostgreSQL развивается силами международной группы разработчиков (PGDG), в которую входят как непосредственно программисты, так и те, кто отвечают за продвижение PostgreSQL (Public Relation), за поддержание серверов и сервисов, написание и перевод документации, всего на 2005 год насчитывается около 200 человек. Другими словами, PGDG - это сложившийся коллектив, который полностью самодостаточен и устойчив. Проект развивается по общепринятой среди открытых проектов схеме, когда приоритеты  определяются реальными нуждами и возможностями. При этом, практикуется публичное обсуждение всех вопросов в списке рассылке, что  практически исключает возможность неправильных и несогласованных решений. &lt;/p&gt; &lt;p&gt; Это относится и к тем предложениям, которые уже имеют или рассчитывают на финансовую поддержку коммерческих компаний. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Цикл разработки&lt;/h2&gt; &lt;p&gt; Цикл работой над новой версией обычно длится 10-12 месяцев (сейчас ведется дискуссия о более коротком цикле 2-3 месяца) и состоит из нескольких этапов (упрощенная версия): &lt;/p&gt;&lt;ul&gt; &lt;li&gt;&lt;strong&gt;Обсуждение&lt;/strong&gt; предложений в списке  &lt;a href=&quot;http://archives.postgresql.org/pgsql-hackers/&quot;&gt;-hackers&lt;/a&gt;. На собственном опыте могу заверить, что это очень непростой процесс и плохо подготовленный proposal не пройдет. Учитываются много факторов - алгоритмы, структуры данных, совместимость с существующей архитектурой, совместимость с SQL и так далее. &lt;/li&gt; &lt;li&gt;После принятия решения о работе над новой версией в CVS открывается новая ветка и с этого момента все изменения, касающиеся новых возможностей, вносятся туда. Также, анализируются патчи, которые присылаются в список  &lt;a href=&quot;http://archives.postgresql.org/pgsql-patches/&quot;&gt;-patches&lt;/a&gt;. Все изменения протоколируются и доступны любому для рассмотрения (&lt;a href=&quot;http://www.postgresql.org/developer/sourcecode/&quot;&gt;anonymous CVS&lt;/a&gt;,  &lt;a href=&quot;http://archives.postgresql.org/pgsql-committers/&quot;&gt;-commiters&lt;/a&gt; лист рассылки или через  &lt;a href=&quot;http://developer.postgresql.org/cvsweb.cgi/pgsql/&quot;&gt;веб-интерфейс&lt;/a&gt; к CVS).  Иногда, в процессе работы над новой версией вскрываются или исправляются старые ошибки, в этом случае, наиболее критические исправляются и в предыдущих версиях (&lt;strong&gt;backporting&lt;/strong&gt;). По мере накопления таких исправлений принимается решение о выпуске новой стабильной версии, которая совместима со старой и не требует обновления хранилища. Например, 7.4.7 - является &lt;strong&gt;bugfix&lt;/strong&gt;-ом стабильной версии 7.4. &lt;/li&gt; &lt;li&gt;В некоторый момент объявляется этап &lt;strong&gt;code freeze&lt;/strong&gt;(замораживания кода), после которого в CVS не допускается новая функциональность, а только исправление или улучшение кода. Граница между новой функциональностью и улучшением кода не описана и иногда возникают разногласия на этот счет, к документации и расширениям (&lt;strong&gt;contribution modules&lt;/strong&gt; в поддиректории contrib/) обычно относятся более либерально. Замечу, что все это время все CVS версия проходит &lt;strong&gt;непрерывное тестирование&lt;/strong&gt; на большом количестве машин, под разными архитектурами, операционными системами и компиляторами. Все это стало возможно благодаря проекту &lt;a href=&quot;http://www.pgbuildfarm.org/&quot;&gt;pgbuildfarm&lt;/a&gt;, который является распределенной системой тестирования, объединяющая добровольцев, которые предоставляют свои машины для тестирования. Проверяется не только корректность сборки, но и, благодаря обширному набору тестов (&lt;strong&gt;regression test&lt;/strong&gt;), и правильность работы. Текущий статус (всех поддерживаемых версий, не только CVS) можно посмотреть на  &lt;a href=&quot;http://www.pgbuildfarm.org/cgi-bin/show_status.pl&quot;&gt;этой&lt;/a&gt; странице. Исходные тексты CVS версии PostgreSQL проходят тестирование в &lt;a href=&quot;http://www.osdl.org/&quot;&gt;OSDL&lt;/a&gt;  что  помогает в  обнаружении систематических изменений производительности (в обе стороны),  иногда такие обнаружения приводят к необходимости &amp;quot;размораживания кода&amp;quot;.  Начиная с версии 8 такие тестирования будут регулярно проводиться в  OSDL STP и PLM (STP - Scalable Test Platform и PLM - Patch Lifecycle Manager).  &lt;/li&gt; &lt;li&gt;После внутреннего тестирования &amp;quot;собирается&amp;quot; дистрибутив и объявляется выход &lt;strong&gt;бета&lt;/strong&gt; версии, на тестирование и исправление ошибок отводится 1-3 месяца. Бета версия не рекомендуется для использования в продакшн проектах (&lt;strong&gt;production&lt;/strong&gt;), но практика показала хорошее качество таких версий и  многие начинают ее использовать ради апробирования новой функциональности. Как правило, окончательная версия совместима с бета-версией и не требует обновления хранилища. По мере исправления замеченных ошибок выпускаются новые бета-версии. &lt;/li&gt; &lt;li&gt;После исправления &lt;strong&gt;всех&lt;/strong&gt; замеченных ошибок, выпускается &lt;strong&gt;релиз-кандидат&lt;/strong&gt;, который уже практически ничем не отличается от окончательной версии, разве что не хватает документации и списка изменений. &lt;/li&gt; &lt;li&gt;В течении месяца выходит окончательная версия, которая анонсируется на главном &lt;a href=&quot;http://www.postgresql.org&quot;&gt;веб-сайте&lt;/a&gt; проекта и его зеркалах, мэйлинг листах. Также, PR группа, которая к этому моменту подготовила анонсы на разных языках, распространяет их по всем ведущим сайтам и СМИ. Они принимают участие в конференциях, семинарах и прочих общественных мероприятиях. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt; На карте обозначены точки, где живут и работают члены PGDG, оригинальная версия с большей функциональностью находится на официальном &lt;a href=&quot;http://developer.postgresql.org/&quot;&gt;сайте разработчиков&lt;/a&gt;. &lt;/p&gt; &lt;p style=&quot;text-align: center&quot;&gt; &lt;img src=&quot;http://www.sai.msu.su/~megera/postgres/talks/pgglobe.jpg&quot; alt=&quot;&quot; /&gt; &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Структура&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; Управляющий комитет (6 человек). &lt;br /&gt;      Принимает решение о планах развития и выпусках новых версий. &lt;/li&gt; &lt;li&gt; Заслуженные разработчики ( 2 человека ).     &lt;br /&gt;Бывшие члены управляющего комитета, которые отошли от участия в проекте. &lt;/li&gt; &lt;li&gt; Основные разработчики (23).  &lt;/li&gt; &lt;li&gt; Разработчики (22)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; Кроме PGDG, значительное участие в развитии PostgreSQL принимает некоммерческая организация &lt;strong&gt;&amp;quot;The PostgreSQL Foundation&amp;quot;&lt;/strong&gt;, созданная для продвижения и  поддержки PostgreSQL. Сайт фонда находится по адресу  &lt;a href=&quot;http://www.thepostgresqlfoundation.org/&quot;&gt;www.thepostgresqlfoundation.org&lt;/a&gt;. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Спонсорская помощь&lt;/strong&gt; на развитие PostgreSQL поступает как от частных лиц, так и от коммерческих компаний, которые: &lt;/p&gt;&lt;ul&gt; &lt;li&gt;принимают на работу членов PGDG&lt;/li&gt; &lt;li&gt; оплачивают разработку каких-либо новых возможностей&lt;/li&gt; &lt;li&gt; предоставляют услуги в виде хостинга или оплаты трафика&lt;/li&gt; &lt;li&gt; поддерживают публичные мероприятия PGDG&lt;/li&gt; &lt;li&gt; выделяют своих программистов на участие в разработке&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; Кроме того, некоторые разработки поддерживаются государственными фондами, например, Российский Фонд Фундаментальных Исследований. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h1&gt;Где используется&lt;/h1&gt; &lt;p&gt; Если изначально POSTGRES использовался в основном в академических проектах для исследования алгоритмов баз данных, в университетах как отличная база  для обучения, то сейчас PostgreSQL применяется практически повсеместно. Например, зоны .org, .info полностью обслуживаются PostgreSQL, известны многотерабайтные хранилища астрономических данных, Lycos, BASF.  Из российских проектов, использующих PostgreSQL, наиболее известными является портал  &lt;a href=&quot;http://www.rambler.ru&quot;&gt;Рамблер&lt;/a&gt;, в разработке которого я принимал участие в 2000-2002 годах, федеральные порталы Минобразования. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h1&gt;Сообщество&lt;/h1&gt; &lt;p&gt; Сообщество PostgreSQL состоит из большого количества пользователей, объединенных разными интересами, такими как участие в разработке, поиск советов, решений, возможность коммерческого использования. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Поддержка&lt;/h2&gt;  &lt;ul&gt; &lt;li&gt;Основной источник актуальной информации о PostgreSQL является его &lt;strong&gt;официальный сайт&lt;/strong&gt; &lt;a href=&quot;http://www.postgresql.org&quot;&gt;www.postgresql.org&lt;/a&gt;, который имеет зеркала по всему миру. На нем публикуются сведения о всех событиях (анонсы релизов, семинаров, конференций), поддерживается список ресурсов, относящихся к PostgreSQL. &lt;/li&gt; &lt;li&gt; Основная поддержка осуществляется через &lt;strong&gt;почтовую рассылку&lt;/strong&gt;, архивы которой доступны через Web по адресам: &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://archives.postgresql.org&quot;&gt;archives.postgresql.org&lt;/a&gt; &lt;br /&gt;Архив &lt;a href=&quot;http://archives.postgresql.org/pgsql-ru-general/&quot;&gt;pgsql-ru-general&lt;/a&gt; -  русскоязычного списка рассылки,&lt;a href=&quot;http://www.linuxshare.ru/postgresql/community.shtml&quot;&gt;как подписаться&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://www.pgsql.ru/db/mw&quot;&gt;www.pgsql.ru/db/mw&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; Как показала многолетняя практика, списки рассылок являются наиболее эффективным и очень полезным источником знаний, обмена мнениями и  помощи в самых различных ситуациях. На март 2005 года зарегистрировано 32812 пользователей, которые когда-либо писали в мэйлинг лист. &lt;/p&gt; &lt;p&gt; Небольшая статистика списков рассылок PostgreSQL по данным www.pgsql.ru на 1 апреля 2005 года. &lt;/p&gt;  &lt;table border=&quot;0&quot; class=&quot;article centred&quot;&gt; &lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Первая 20-ка мэйлинг листов&lt;br /&gt; по количеству постингов&lt;/th&gt;&lt;th&gt;Распределение постингов по годам&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;pre&gt;         name        | count   &lt;br /&gt; ---------------------+--------  &lt;br /&gt;  HACKERS            | 107696  &lt;br /&gt;  GENERAL            |  93272  &lt;br /&gt;  SQL                |  27574  &lt;br /&gt;  COMMITTERS         |  21384  &lt;br /&gt;  ADMIN              |  20397  &lt;br /&gt;  PATCHES            |  17354  &lt;br /&gt;  NOVICE             |  13772  &lt;br /&gt;BUGS               |  13700&lt;br /&gt;&amp;nbsp;MISC               |  13545 &lt;br /&gt;INTERFACES         |  13029&lt;br /&gt;JDBC               |  12705&lt;br /&gt;QUESTIONS          |   7865&lt;br /&gt;&amp;nbsp;ADVOCACY           |   6676 &lt;br /&gt;CYGWIN             |   6166&lt;br /&gt;WWW                |   5636&lt;br /&gt;PERFORMANCE        |   5359&lt;br /&gt;ODBC               |   5182&lt;br /&gt;PORTS              |   4769&lt;br /&gt;DOCS               |   3991&lt;br /&gt; PHP                |   3106 &lt;/pre&gt; &lt;/td&gt; &lt;td&gt; &lt;pre&gt;  #   | Year  &lt;br /&gt;-------------  &lt;br /&gt;19355 | 2005  &lt;br /&gt;68403 | 2004  &lt;br /&gt;71884 | 2003  &lt;br /&gt;61604 | 2002  &lt;br /&gt;58072 | 2001  &lt;br /&gt;38793 | 2000  &lt;br /&gt;25258 | 1999  &lt;br /&gt;16779 | 1998  &lt;br /&gt;  15315 | 1997    &lt;br /&gt;612 | 1996&lt;br /&gt;&amp;nbsp;  7 | 1995 &lt;/pre&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;                   &lt;/li&gt; &lt;li&gt; &lt;strong&gt;Поисковая система&lt;/strong&gt; &lt;a href=&quot;http://www.pgsql.ru/db/pgsearch&quot;&gt;PGsearch&lt;/a&gt; (разработана при поддержке &lt;a href=&quot;http://www.rfbr.ru&quot;&gt;РФФИ&lt;/a&gt; и  &lt;a href=&quot;http://www.pgsql.ru/ds/&quot;&gt;Дельта-Софт&lt;/a&gt;) предоставляет поиск по сайтам сообщества. На момент написания этой статьи проиндексировано 480000 страниц из 67 сайтов, индекс обновляется еженедельно. &lt;/li&gt; &lt;li&gt;Много &lt;strong&gt;полезной информации&lt;/strong&gt; по PostgreSQL можно найти на сайтах &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://techdocs.postgresql.org/&quot;&gt;techdocs.postgresql.org&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.varlena.com/varlena/GeneralBits/&quot;&gt;Varlena&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.powerpostgresql.com/&quot;&gt;Powerpostgresql&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.lerctr.org/pgnotes/pgnotes.html&quot;&gt;PGnotes&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Документация на русском&lt;/strong&gt; (переводы и оригинальные статьи) доступны на сайте русскоязычного сообщества &lt;a href=&quot;http://www.linuxshare.ru/postgresql/&quot;&gt;http://www.linuxshare.ru/postgresql/&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;Ответы на ваши вопросы можно найти в &lt;strong&gt;&amp;quot;PostgreSQL FAQ &amp;quot;&lt;/strong&gt; (часто задаваемые вопросы): 	&lt;ul&gt; 	&lt;li&gt;&lt;a href=&quot;http://www.postgresql.org/files/documentation/faqs/FAQ.html&quot;&gt;Оригинальная версия&lt;/a&gt;&lt;/li&gt; 	&lt;li&gt;на &lt;a href=&quot;http://www.linuxshare.ru/postgresql/FAQ_russian.html&quot;&gt;русском языке&lt;/a&gt;&lt;/li&gt; 	&lt;/ul&gt; &lt;/li&gt; &lt;li&gt; Дистрибутивы PostgreSQL доступны для &lt;strong&gt;скачивания&lt;/strong&gt; с основного ftp-сервера проекта и его зеркал. Подробная информация доступна со страницы &lt;a href=&quot;http://www.postgresql.org/download/&quot;&gt;http://www.postgresql.org/download/&lt;/a&gt;. Кроме того, многие дистрибутивы Linux распространяются с бинарной версией PostgreSQL и обеспечивают поддержку обновлений. Для &lt;strong&gt;ознакомления&lt;/strong&gt; с PostgreSQL можно скачать образ загрузочного CD (Live CD) -  &lt;a href=&quot;http://bt.postgresql.org/pg_live.1.3.3.iso.torrent&quot;&gt;bittorent формат&lt;/a&gt; или в &lt;a href=&quot;ftp://ftp.sai.msu.su/pub/unix/database/pgsql.app/pg_live.1.3.3.iso&quot;&gt;ISO формате&lt;/a&gt;. Информацию о том, как инсталлировать PostgreSQL под Mac OS X можно найти  &lt;a href=&quot;http://developer.apple.com/internet/opensource/postgres.html&quot;&gt;здесь&lt;/a&gt;. Инсталлятор для Win32 можно скачать с сайта проекта  &lt;a href=&quot;http://pgfoundry.org/projects/pginstaller&quot;&gt;Pginstaller&lt;/a&gt;. &lt;/li&gt; &lt;li&gt; &lt;strong&gt;Коммерческая поддержка&lt;/strong&gt; осуществляется рядом компаний, список которых  доступен по адресу &lt;a href=&quot;http://www.postgresql.org/support/&quot;&gt;www.postgresql.org/support/&lt;/a&gt;. Также на российском сайте ведется &lt;a href=&quot;http://www.linuxshare.ru/postgresql/support.shtml&quot;&gt;список российских компаний&lt;/a&gt;, которые заявили о поддержке PostgreSQL. &lt;/li&gt; &lt;/ul&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Разработка&lt;/h2&gt; Для проектов, имеющих отношение к PostgreSQL, предоставляется возможность размещать их на специальных сайтах, поддерживаемые PGDG и предоставляющие практически все, необходимые для разработчиков, сервисы:  &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://gborg.postgresql.org/&quot;&gt;gborg.postgresql.org&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://pgfoundry.org/&quot;&gt;pgfoundry.org&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h1&gt;Заключение&lt;/h1&gt; &lt;p&gt; PostgreSQL является полнофункциональной объектно-реляционной СУБД, готовой для практического использования. Ее функциональность  и надежность обусловлены богатой историей развития,профессионализмом разработчиков и  технологией тестирования, а ее перспективы заложены в ее расширяемости и  свободной лицензии. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;h2&gt;Благодарности&lt;/h2&gt; &lt;p&gt; Автор благодарит русскоязычное сообщество за критику и дополнения, Российский Фонд Фундаментальных Исследований (&lt;a href=&quot;http://www.rfbr.ru&quot;&gt;РФФИ&lt;/a&gt;) за поддержку гранта 05-07-90225-в. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;p&gt; Текст написан &lt;a href=&quot;http://www.sai.msu.su/~megera/&quot;&gt;Олегом Бартуновым&lt;/a&gt; в 2005 году, поправки и комментарии приветствуются. &lt;/p&gt; &lt;div class=&quot;spacer&quot;&gt;&lt;hr /&gt;&lt;/div&gt; &lt;strong&gt;Краткая справка:&lt;/strong&gt; &lt;p&gt; &lt;img style=&quot;border: 1px solid #dedede; margin: 3px 12px 10px 0pt; float: left&quot; src=&quot;http://www.sai.msu.su/~megera/postgres/talks/OlegBartunov-small.jpg&quot; alt=&quot;&quot; /&gt; Олег Бартунов (основная специальность астроном, работает в ГАИШ МГУ)  является членом PGDG (основной разработчик) с 1996 года, был в  числе основателей компании &amp;quot;GreatBridge&amp;quot;, является членом  &lt;a href=&quot;http://www.thepostgresqlfoundation.org&quot;&gt;&amp;quot;The PostgreSQL Foundation&amp;quot;&lt;/a&gt;. Помимо использования PostgreSQL в проектах (самые известные - этo портал &lt;a href=&quot;http://www.rambler.ru&quot;&gt;Рамблер&lt;/a&gt;,  &lt;a href=&quot;http://nature.web.ru&quot;&gt;Научная Сеть&lt;/a&gt;, &lt;a href=&quot;http://www.astronet.ru&quot;&gt;Астронет&lt;/a&gt;), он  в 1996 году добавил поддержку &lt;strong&gt;locale&lt;/strong&gt; в PostgreSQL, затем  совместно с Федором Сигаевым (компания &lt;a href=&quot;http://www.pgsql.ru/ds/&quot;&gt;Delta-Soft&lt;/a&gt;) занимался поддержкой и разработкой  &lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/gist&quot;&gt;GiST в PostgreSQL&lt;/a&gt;, на основе которого были разработаны такие популярные модули как  полнотекстовый поиск, работа с массивами, поиск с ошибкам, поддержка  иерархических данных. Соавтор свободного полнотекстового поиска для  PostgreSQL &lt;a href=&quot;http://openfts.sourceforge.net&quot;&gt;OpenFTS&lt;/a&gt;. Является автором и создателем (совместно с Федором Сигаевым) сайта &lt;a href=&quot;http://www.pgsql.ru&quot;&gt;pgsql.ru&lt;/a&gt;. Занимается продвижением PostgreSQL для использования в астрономии, в частности, для работы с очень большими астрономическими каталогами, проект  &lt;a href=&quot;http://www.pgastro.org&quot;&gt;pgSphere&lt;/a&gt; - хранение данных со сферическими координатами и индексные методы доступа к ним. &lt;/p&gt;</description>
      <pubDate>Tue, 5 Apr 2005 23:56:22 GMT</pubDate>
      <guid isPermaLink="true">http://postgresqlrussia.org/articles/view/57</guid>
    </item>
      </channel>
</rss> 
