RUNSTATS ON TABLE SchemaName.TableName 
  WITH DISTRIBUTION ON KEY COLUMNS 
  AND SAMPLED DETAILED INDEXES ALL;

А еще вот кусок кода для отключения статистических профилей в базе, создаваемой 1С:
Read more... )
Как добавить в DB2 функцию для расчета хеш-кода по алгоритму SHA-1 (или любому другому поддерживаемому Java):

(а) Начиная с версии 11.1, алгоритмы MD5, SHA1, SHA2_256 и SHA2_512 доступны через встроенную функцию HASH(), которую можно обернуть в вызов встроенной функции HEX() для получения текстового значения.

Использование:
VALUES HEX(HASH('Вассисуалий Алибабаевич', 1));



(б) В более ранних версиях, либо для не поддерживаемых типов хеша, приходится использовать Java UDF.
Read more... )
При пакетном переносе данных между базами Microsoft SQL Server и в ряде других сценариев (например, при загрузке замаскированной/обезличенной информации в создаваемую тестовую базу данных) бывает полезно временно отключить все ограничения целостности для всех таблиц базы данных.
Инструмент это грубый (поскольку отключаются абслютно все ограничения), зато простой в использовании и не требующий глубокого анализа связей между таблицами - что потребуется для того, чтобы отключить только часть ограничений.

Полное отключение всех ограничений и триггеров для всех таблиц:

exec sp_MSforeachtable
@command1='alter table ? nocheck constraint all',
@command2='alter table ? disable trigger all'
go

Необходимо помнить, что эти операции не позволят выполнить оператор TRUNCATE TABLE, если на таблицах созданы внешние ключи (FOREIGN KEY) - увы, в этом случае удалять данные перед их повторной заливкой придётся с помощью медленных и скушных команд DELETE.

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

declare @cmd varchar(4000);
set @cmd = 'BEGIN TRY '
+ '  alter table ? with check check constraint all;'
+ '  alter table ? enable trigger all; '
+ 'END TRY '
+ 'BEGIN CATCH PRINT ''** ERROR on [?] - '' + ERROR_MESSAGE(); END CATCH';
exec sp_MSforeachtable @command1=@cmd
go
Для потенциальных и начинающих пользователей Informix Warehouse Accelerator (IWA) - краткая инструкция по применению.

Сперва немного теории...
Read more... )

Теперь практическая часть...
Read more... )
Время выполнения приведённого выше запроса на системе с 16 процессорными ядрами для нашей таблицы в 28 млн. записей - в пределах 1 секунды.
Без использования IWA даже при использовании специальных мер физической оптимизации схемы данных (набор индексов, партиционирование данных, использование параллелизма выполнения запроса) время выполнения такого запроса будет весьма значительным из-за необходимости сканирования большого объема данных.
Содержимое файла /opt/IBM/informix/etc/sqlhosts.ol_informix1210:
ol_informix1210 onsoctcp toster ol_informix1210
dr_informix1210 drsoctcp toster dr_informix1210
lo_informix1210 onsoctcp 127.0.0.1 lo_informix1210


Команды для создания библиотеки libdb2informixF.so:
sudo su
export INFORMIXDIR=/opt/IBM/informix
/opt/ibm/db2/V10.5/bin/djxlinkInformix


Содержимое файла /home/db2inst1/sqllib/cfg/db2dj.ini:
INFORMIXDIR=/db2extra/ifx/informix
INFORMIXSERVER=ol_informix1210
INFORMIXSQLHOSTS=/db2extra/ifx/informix/etc/sqlhosts.ol_informix1210
GL_USEGLU=1
CLIENT_LOCALE=ru_RU.utf8


Набор команд процессора DB2 по подключению к серверу:
create wrapper informix;
create server ifx type informix version 12.10 wrapper informix options (node 'ol_informix1210', dbname 'demo');
create user mapping for db2inst1 server ifx options (REMOTE_AUTHID 'informix', REMOTE_PASSWORD 'passw0rd');
set passthru ifx;
SELECT count(*) FROM informix.systables;
set passthru reset;
Теперь передо мной стоит сложный выбор, с чего начать: с той, которая для пользы (ибо потроха конкурента нужно знать по возможности подробно), или с той, которая для души?

Вот они, мои прекрасные... )
Всё время забываю, надоело каждый раз искать эти две три команды:

parted /dev/sda mklabel gpt
parted -a optimal /dev/sda mkpart primary '0%' '100%'
partprobe /dev/sda
Тов. Lennart Poettering в частности, и авторы systemd в целом, не понимают значение слова "совместимость".
Иначе бы они не сделали свою новую прекрасную систему инициализации так, что она не способна выполнять старые добрые init-скрипты спотыкается на малейшем отступлении от выдуманного её авторами жёсткого шаблона.

Цитата вот отсюда: For compatibility with SysV we not only support our own configuration files for services, but also are able to read classic SysV init scripts, in particular we parse the LSB header, if it exists. /etc/init.d is hence not much more than just another source of configuration.

В переводе на человеческий язык - мы тут написали программу, которая парсит скрипты инициализации и пытается воспринимать их как сервисные описания для нашей супер-мега-системы. Нет, просто запускать скрипты инициализации в нужный момент нам религия не позволяет, это было бы слишком легко.

У-у-у! Школота линуксовая!

Read more... )

Решение проблемы: скопировать из каталога инсталляции TSAMP скрипты в каталог инициализации /etc/init.d (заменив ими ссылки, которые там размещает инсталлятор TSAMP).

Read more... )
Как сделать почти что Oracle database link (DBLINK) между двумя базами данных DB2 (alpha и beta), размещенными на двух серверах СУБД (db2-alpha и db2-beta), в каждом из которых развёрнут экземпляр DB2 по имени db2inst2:
Read more... )

UPDATE: для интересующихся подробностями вот
старая, но вполне грамотная статья на developerWorks
.
После превращения в тыкву второго разъема под сим-карту в моем Highscreen Boost II SE, решил временно в качестве основого телефона попользовать свою старенькую Nokia E52.
Сразу столкнулся с идиотской проблемой переноса контактов: Android выгружает всё в один файл (и только так), а Nokia жрет только по одному контакту в файле (и опять-таки только так).
Наспех найденные проги-сплиттеры все оказались кривыми, единственный нормальный на вид скрипт написан на питоне и зачем-то корежит кодировку записей.

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

Кому нужно, пользуйтесь на здоровье.

#! /bin/sh

SRCFILE="$1"
DIRNAME="$2"
NUM=1
while read ln; do
echo "$ln" >> "$DIRNAME"/vcf-"$NUM".vcf
if [ "$ln" = "END:VCARD^M" ]; then
  NUM=`expr $NUM + 1`
fi
done <"$SRCFILE"

# End Of File
Вспомнил вдруг про свою годичной давности работу по созданию простого сервера WebDav. За основу взял код из недр Tomcat 6.

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

Кому надо, код здесь: https://github.com/zinal/webdav-simple

Maven binary не выкладывал, но могу опубликовать, если кому надо будет.
All database deadlocks fall into one of the following categories:
1. A row-level deadlock is always the application's bug
2. A table- or partiton-level deadlock caused by:
  (a) explicit application-controlled locking -
the application's bug
  (b) lock escalation - a configuration or application design issue
  (с) implicit operations at statement compilation stage - a DBMS bug
4. A deadlock involving any type of locks/latches on internal DBMS structures is always a DBMS bug

Навеяно работой.

UPDATE: В итоге оказалось, что 2(c) дискуссионно, поскольку настройки СУБД могут предписывать определенное поведение при компиляции запросов. В том числе и сбор статистик с блокировкой всей таблицы - хотя по моему скромному мнению, наличие таких настроек является дефектом дизайна СУБД.
Долго мучал разные варианты. Из-под Linux так ничего и не получилось, из-под Венды псевдоштатный "Download Tool" упорно не срабатывал (похоже, подлый антивирус шалил, а отключать его полностью по ряду причин дело хлопотное).

В итоге сработал следующий колхозный рецепт:

diskpart
list disk
select disk #
clean
create partition primary
select partition 1
active
format quick fs=ntfs
assign
exit


Далее распаковываем содержимое ISO-образа на флешку (опять же антивирус явно мешал распаковать autorun.inf), и выполняем еще одну волшебную команду:

Bootsect.exe /nt60 X:


Файл Bootsect.exe к этому моменту лежит в папке Boot на флешке.
Отмонтируем флешку и пользуемся.
Собственно, subj.
Сейчас пытаюсь пересобрать с опциями "-source 1.5 -target 1.5". Попутно пришлось бегло изучить Maven, будь он неладен.

Нет, я не некрофил. Просто часть разработок требуется пускать в среде WebSphere AppServer 6.1, со всеми вытекающими последствиями.

UPDATE: пришлось при пересборке вносить изменения в исходный код. Результат - в виде патча, может, кому и пригодится: http://ubuntuone.com/2ODOIhQuTByTdXW2dZiKLN
Чтобы самому не забыть, записал набор команд для перепаковки всех ogg-файлов в каталоге в mp3 с параметрами качества по умолчанию (не на меломана). 


oggdec *.ogg 
ls *.wav | while read x; do echo lame -q2 -b160 "'$x'" "'"`basename "$x" .wav`".mp3'"; done | bash
rm *.wav
С изумлением обнаружил, что при использовании JDK от HP на платформе OpenVMS метод Thread.sleep(), вызванный в потоке, не прерывается вызовом метода Thread.interrupt() для этого же потока из другого потока.

Как следствие, многие синхронизационные примитивы работают неправильно или вовсе не работают.
Заметил, что Lotus Notes под Linux использует SQLite:

$ lsof | grep deleted
...
notes2 2335 zinal 202u REG 8,3 0 1006721550 /var/tmp/etilqs_SmzIdHFLNdJgiRE (deleted)
...

Забавно, собственного встроенного формата баз данных им, видимо, не хватило :)
По рабочей необходимости портировал на Java кусок OpenSSL, отвечающий за подсчет хеш-функции ГОСТ Р 34.11-94.
Результат вполне работоспособен и доступен широкой публике вот тут: https://github.com/zinal/gosthash. Может, кому-то пригодится - я буду только рад.

UPDATE 1: Первоначальный вариант был выложен на Ubuntu One, но таковой закрылся.

UPDATE 2: Для любителей Maven (включая себя) опубликовал сборку в центральном репозитории: groupId=zinal.ru, artifactId=gosthash

В процессе портирования долго и злобно ругал про себя разработчиков Java, которые пожадничали реализовать беззнаковые целые. Если бы не эта языковая неприятность, портирование было бы раз в десять проще, и чисто Жабная версия работала бы ничуть не медленнее оригинальной Сишной. А так производительность заметно просела (до 3-х раз!) из-за постоянных преобразований в целые большей размерности (по результатам профилирования получилось, что самые "горячие" куски - как раз эти самые преобразования).
Всем мученикам, пытающимся заставить XStream пропускать незнакомые (сиречь не скартированные) теги (вместо того, чтобы кидаться исключением, как оно это обычно делает), посвящается найденное мною решение этой странной проблемы.

Read more... )
Основное мучение было с поддержкой неявных коллекций, так как основную часть кода удалось содрать из тестов к тому же XStream.

So this way you can skip unknown tags, guys :)

Profile

zinal: (Default)
Maksim Zinal

April 2017

M T W T F S S
     12
3456 789
10111213141516
17181920212223
24252627282930

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 25th, 2017 09:54 am
Powered by Dreamwidth Studios