February 3, 2010

Не оптимальная запись

Если необходимо локализовать проблемы связанные с не оптимальной записью, а это очень важные проблемы, т.к. предел возможностей БД в основном упирается в дисковые операции, и начать решать их с более тяжёлой, то этот запрос поможет вам. Он выводит статистику по таблицам в обратном порядке по сумме операций записи. Сверху будут таблицы с наиболее интенсивной записью. В условиях осуществляется фильтрация по схемам, чьи таблицы необходимо исключить из статистики.

Т.о. выявляются счётчики, лишние или временные вставки и т.п. Далее, интенсивность записи счётчиков можно снизить за счёт, например, накопления их в памяти (допустим в memcached) по 10 штук и одного сброса на диск. Где-то можно просто отказаться от некоторых операций, а где-то выявится необходимость рефакторинга приложения.

SELECT
schemaname AS sch, -- схема
relname AS tab, -- таблица
pg_size_pretty(pg_relation_size(relid)) AS tsize, -- размер
n_tup_upd + n_tup_ins + n_tup_del AS wr, -- операций записи
seq_scan + idx_scan AS re, -- всего чтений
n_tup_ins AS i, n_tup_upd AS u, n_tup_del AS d -- I/U/D
FROM
pg_stat_user_tables
WHERE schemaname NOT IN ('pgq')
ORDER BY
n_tup_upd + n_tup_ins + n_tup_del DESC
LIMIT 40;

January 31, 2010

Не оптимальное чтение

Запрос предназначен для определения таблиц по которым производятся выборки использующие последовательные сканирования. Таблицы в списке сортируются реверсивно по порядку (числу разрядов) величины последовательных чтений и размеру таблицы. Т.о. для каждого порядка сверху будет самая тяжелая таблица, запросы к которой более приоритетны к оптимизации.

Также удобно бывает использовать ограничение по размеру (в примере ниже оно закомментировано). Оно помогает отфильтровывать таблицы, по которым последовательные чтения потенциально выгодны. Тут необходимо смотреть на величину, и вообще на факт, необходимости использования по ситуации, проведя несколько экспериментов.

SELECT
schemaname AS sch, -- схема
relname AS tab, -- таблица
pg_size_pretty(pg_relation_size(relid)) AS tsize, -- размер
seq_scan AS ss, -- последовательных чтений
idx_scan AS is, -- индексных чтений
seq_scan + idx_scan AS re, -- всего чтений
n_tup_upd + n_tup_ins + n_tup_del AS wr, -- операций записи
n_tup_ins AS i, n_tup_upd AS u, n_tup_del AS d -- I/U/D
FROM
pg_stat_user_tables
-- WHERE pg_relation_size(relid) > 1 * 1024 * 1024 -- ограничение по размеру
ORDER BY
length(seq_scan::text) DESC,
pg_relation_size(relid) DESC
LIMIT 40;

January 27, 2010

Не используемые индексы

Данный запрос предназначен для выявления индексов претендентов на удаление. В начале отображаются наиболее редко используемые большие индексы.

Запрос действует только по пользовательским индексам и не принимает во внимание уникальные, т.к. они используются как ограничения (как часть логики хранения данных). Тем не менее прежде чем принять решение об удалении хорошо подумайте.

SELECT
idstat.schemaname AS sch, -- схема
idstat.relname AS tab, -- таблица
indexrelname AS idx, -- индекс
idstat.idx_scan AS iis, -- число сканирований по этому индексу
pg_size_pretty(pg_relation_size(indexrelid)) AS isize, -- размер индекса
tabstat.idx_scan AS tis, -- индексных чтений по таблице
tabstat.seq_scan AS tss, -- последовательных чтений по таблице
tabstat.seq_scan + tabstat.idx_scan AS tre, -- чтений по таблице
n_tup_upd + n_tup_ins + n_tup_del AS twr, -- операций записи
pg_size_pretty(pg_relation_size(idstat.relid)) AS tsize -- размер таблицы
FROM
pg_stat_user_indexes AS idstat
JOIN pg_indexes ON
indexrelname = indexname AND
idstat.schemaname = pg_indexes.schemaname
JOIN pg_stat_user_tables AS tabstat ON
idstat.relid = tabstat.relid
WHERE
indexdef !~* 'unique'
ORDER BY
idstat.idx_scan,
pg_relation_size(indexrelid) DESC
LIMIT 20;

January 24, 2010

Индикатор раскладки клавиатуры xxkb в Xmonad

Итак, есть Xmonad, требуется индикатор раскладки клавиатуры отображающийся в правом верхнем углу экрана и запоминающий раскладку для каждого окна.

Прежде всего устанавливаем расширение клавиатурного модуля xxkb, позволяющее отображать раскладки, менять их, и многое другое. Установка специфична для каждого дистрибутива, по этому описывать её тут не буду, если что google в помощь.

Далее добавляем в ~/.xmonad/xmonad.hs его запуск при загрузке:

main = do
...
spawn myXxkbBar
...

myXxkbBar = "xxkb" -- configuration in ~/.xxkbrc


Да, не забываем подрегулировать свои панели (dzen, xmobar, и т.д.) чтобы в правом верхнем углу был свободный квадрат 15x15 пикселей, где и разместится индикатор. Затем указываем, что его необходимо снимать при перезапуске:

-- Do not leave useless conky, dzen and xxkb after restart
((modm, xK_q), spawn "killall conky dzen2 xxkb; xmonad --recompile; xmonad --restart"),


И игнорировать в ManageHook:

myManageHook = composeAll [
resource =? "XXkb" --> doIgnore
]


Почти всё готово, осталось прописать конфигурацию xxkb в ~/.xxkbrc (измените 1265 на ваше разрешение по y минус 15):

XXkb.group.base: 1
XXkb.group.alt: 2
XXkb.mainwindow.appicon: yes
XXkb.mainwindow.geometry: 15x15+1265+0
XXkb.mainwindow.xpm.1: en15.xpm
XXkb.mainwindow.xpm.2: ru15.xpm
XXkb.button.enable: no
XXkb.controls.add_when_start: no
XXkb.controls.add_when_change: yes
XXkb.controls.focusout: yes
XXkb.controls.mainwindow_delete: no


И, вуаля, получаем то, что требовалось:



Подробнее про xxkb на русском можно почитать тут Индикатор-переключатель раскладки клавиатуры XXKB.

Мою последнюю конфигурацию Xmonad и всё её сопровождающее найдёте здесь Xmonad/Config_archive (поищите gray_hemp).

January 23, 2010

Важность очистки статистики

Это маленький но очень важный момент. Если ваш проект интенсивно развивается, то накопленная за долгий период времени внутренняя статистика PostgreSQL зачастую теряет смысл. Так, например, добавление нового индекса или изменение пары запросов меняет темпы накопления и новая ситуация начинает накладываться на старую, из-за чего можно сделать не правильные выводы. Для того чтобы избежать этого неообходимо очищать старые статистические данные перед запросом статистики, если с момента предыдущей очистки были какие-то изменения влияющие на её сбор.

В PostgreSQL для этого существует специальная функция:

SELECT pg_stat_reset();

Заметьте, после очистки возможно потребуется некоторое время для накопления новой статистики.

January 19, 2010

Конфигурация Xmonad

Мои настройки Xmonad (в первом приближении) опубликовали в Xmonad/Config archive, смотрите /gray_hemp's xmonad.hs и /gray_hemp's .conky_timegray_hemp.

Из особенностей: dzen + conky с иcпользованием иконок layout-ов, resizable tall, xmonad shell prompt, urgency popup плюс форматирование status bar-а.

December 6, 2009

Emacs, файлы отката и авто-сохранения

По умолчанию, для файлов которые вы редактируете, Emacs создаёт файлы отката вида filename~ и файлы авто-сохранения вида #filename#. Первые остаются после закрытия файла и зачастую портят эстетическую составляющую вашего рабочего каталога. В этом посте рассматриваются способы решения этой проблемы.

Если вам совсем не нужен функционал резервного копирования, то вы можете просто отключить его.

~/.emacs.d/general.el:

;; Stop creating backup~ and #auto-save# files
(setq make-backup-files nil)
(setq auto-save-default nil)


Если вы всё же беспокоитесь за безопасность ваших данных, то вы столкнётесь со следующей проблемой. По умолчанию Emacs создаёт резервный файл переименованием оригинального, затем создаёт новый файл с оригинальным именем копированием и открывает его. Таким образом время создания файла меняется, даже если вы не меняли содержимое. Что-бы такого не было можно поменять поведение создание резервного файла на обратное.

~/.emacs.d/general.el:

;; Copy original file when creating backup
(setq backup-by-copying t)


По умолчанию резервные файлы хранятся рядом с их оригиналами, но можно указать директорию, где Emacs должен их создавать. В таком случае если оригинальный файл "/home/gray/tmp/sub/file.txt", а директория для резервного копирования "~/.emacs.d/files-backup", то резервный файл будет именован "~/.emacs.d/files-backup/home!gray!tmp!sub!file.txt".

~/.emacs.d/general.el:

;; Set directory for backup files
(setq backup-directory-alist '(("" . "~/.emacs.d/files-backup")))


В выше приведенном случае, если вы используете длинные имена файлов или глубокие пути, может легко быть достигнут лимит длины имён файлов. Эту проблему можно решить переопределив встроенную функцию определения имени резервного файла make-backup-file-name-function своей, которая будет создавать структуру директорий, такую же как от корня до оригинального файла, в директории для резервного копирования. Для выше приведённого примера резервный файл будет "~/.emacs.d/files-backup/home/gray/tmp/sub/file.txt".

~/.emacs.d/general.el:

;; File path mirroring for backup files
(defun my-backup-file-name (fpath)
(let (backup-root bpath)
(setq backup-root "~/.emacs.d/files-backup")
(setq bpath (concat backup-root fpath "~"))
(make-directory (file-name-directory bpath) bpath)
bpath
)
)
(setq make-backup-file-name-function 'my-backup-file-name)


Есть ещё несколько вещей связанных с резервированием и касающихся версионности, но об этом в другом посте.

Начальная настройка Emacs

Решил привести в систематизированный вид конфигурацию своего Emacs. В связи с этим решил написать несколько постов с рекомендациями для начинающих "эмаксоидов" о его настройке с нуля, а так как я от выше упомянутых ещё не далеко ушел, буду очень рад комментариям и критике. Этот пост содержит самые базовые вещи, которые надо сделать сразу, что-бы избежать лишних проблем в дальнейшем.

В данный момент я использую Emacs 23.1.1 под Gentoo.

Если вы планируете использовать встроенный инструмент customize совместно с ручной настройкой, то рекомендую выделить для генерируемой им конфигурации отдельный файл.

~/.emacs:

;; Custom settings file
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file)


Также вынесем в отдельный файл общие настройки, оставив для ~/.emacs роль управляющего файла.

~/.emacs:

;; General settings file
(load "~/.emacs.d/general.el")


Заставляем Emacs "общаться" с clipboard-ом X (это не нужно в MS Windows и Mac OS).

~/.emacs.d/general.el:

;; Interact with OS clipboard
(setq x-select-enable-clipboard t)


Убираем Toolbar и Scrollbar. Это конечно по желанию, но по моему они мешают основной идее Emacs.

~/.emacs.d/general.el:

;; Turn off scrollbar, toolbar and menubar
(scroll-bar-mode nil)
(tool-bar-mode nil)
(menu-bar-mode nil)


Включаем отображение номера колонки поинта (курсора).

~/.emacs.d/general.el:

;; Turn on column number mode
(column-number-mode t)


Подсветка парной скобки.

~/.emacs.d/general.el:

;; Highlight brackets
(show-paren-mode t)


Замещаем выделенный текст любым вводом.

~/.emacs.d/general.el:

;; Delete selected text when typing
(delete-selection-mode t)


И устанавливаем шрифт по умолчанию.

~/.emacs.d/general.el:

;; Font
(set-default-font "Monospace-9")


Ну, вот, теперь можно двигаться дальше.

October 16, 2009

Pg_Migrator для 8.4 готов, новое видео

Перевод Pg_Migrator Done for 8.4, New Video с Bruce Momjian Postgres Blog

Последний релиз pg_migrator состоялся более двух месяцев назад. С тех пор я не получил ни одного отчёта об ошибках, более того, было несколько сообщений об успешных миграциях. По этой причине, беру на себя ответственность объявить разработку pg_migrator завершенной и приостановленной до того, как релиз 8.5 будет на подходе.

Также, EnterpriseDB выпустила вводное видео, где я рассказываю о pg_migrator.

July 2, 2009

Итак, вышел PostgreSQL 8.4

«1 июля 2009 — Всемирная группа разработчиков PostgreSQL выпустила новую версию PostgreSQL, продолжая активную разработку самой развитой системы управления базами данных с открытым исходным кодом. Новая версия содержит множество улучшений, делающих администрирование, написание запросов и программирование баз данных PostgreSQL более простым, чем когда-либо. Благодаря 293 новым функциям и улучшениям, содержащимся в версии 8.4, причин выбрать PostgreSQL для вашего нового проекта стало ещё больше.»

Более подробно тут http://postgresmen.ru/articles/view/151

p.s. Я скоро вернусь ;)