среда, мая 16, 2012

Вышла DB2 v10.1

Прекрасная новость, вышла DB2 10.1 в т.ч. Express-C

http://db2express.com/ru/

http://freedb2.com/2012/04/30/db2-express-c-v10-an-even-better-database-still-free-of-charge/

суббота, ноября 26, 2011

MSL готовится к старту на Марс

Через полчаса произойдет историческое событие - старт миссии MSL на Марс. Прямую трансляцию можно смотреть здесь. Также запостил в блог Informix.

пятница, ноября 25, 2011

Разделение разрядов в числах

В Java 7 появилась новая возможность предназначенная для разделения разрядов в числовых значениях. Теперь в числах можно использовать символ подчеркивания, сделано это чтобы повысить читаемость чисел в исходном коде.
Сравните:
int var1 = 123456789;

И вот такую запись:
int var1 = 123_456_789;

Если число большое то такое разделение разрядов существенно повышает читабельность кода.

понедельник, ноября 21, 2011

Как проверить использует ли Java VM обновленную time-zone

В связи с отменой перехода на зимнее время в России, актуален вопрос правильной работы приложений. Чтобы узнать использует правильное время ваше Java-приложение, можно скомпилировать и запустить следующий код:

import java.util.Date;

public class TestTime {
    public static void main (String [] args) {
        System.out.println(new Date());
    }
}

Если время которое покажет приложение отличается от системного, то надо обновить time-zone для установленной Java VM.

Немного о null и индексах в разных СУБД

Определим используется ли значение null в индексах btree в различных СУБД. Для тестирования возьмем три разные базы: Informix, DB2 и Oracle.

В каждой базе создается таблица в которой в индексированном поле 30% значений null.
create table t1 (f1 int);
Таблица наполняется данными (зависит от базы, ниже пример для Oracle):
insert into t1 select 1 from dual connect by level <=30;
insert into t1 select null from dual connect by level <=70;
Строится индекс по таблице:
create index idx_t1 on t1(f1);

И собирается статистика для оптимизатора.
Запускается запрос select * from t1 where f1 is null; с поиском по этому полю условие is null. Проверяем используется ли индекс.

Оракл версия 10gR2  ( для получения плана запроса используем set autotrace on) :



--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    30 |    60 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |    30 |    60 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("F1" IS NULL)


TABLE ACCESS FULL т.е. в случае когда делается поиск по значениям null, делается полный скан таблицы.
в индексах b-tree значения null не включается.


Informix версия 11.70UC2 (для получения плана запроса используем set explain on):


select * from t1 where f1 is null;

Estimated Cost: 2
Estimated # of Rows Returned: 30

  1) informix.t1: INDEX PATH

    (1) Index Name: informix.idx_t1
        Index Keys: f1   (Key-Only)  (Serial, fragments: ALL)
        Lower Index Filter: informix.t1.f1 IS NULL

Индекс используется. В индексах b-tree включается значение null



DB2 версия v9.7.0.2 (для получения плана запроса используем db2expln) :


Statement:

  select *
  from db2inst1.t1
  where f1 is null


Access Table Name = DB2INST1.T1  ID = 3,5
|  Index Scan:  Name = DB2INST1.IDX_T1  ID = 1
|  |  Regular Index (Not Clustered)
|  |  Index Columns:
|  |  |  1: F1 (Ascending)
|  #Columns = 1
|  Skip Inserted Rows
|  Avoid Locking Committed Data
|  Currently Committed for Cursor Stability
|  #Key Columns = 1
|  |  Start Key: Inclusive Value
|  |  |  |  1: NULL
|  |  Stop Key: Inclusive Value
|  |  |  |  1: NULL
|  Index-Only Access
|  Index Prefetch: None
|  Lock Intents
|  |  Table: Intent Share
|  |  Row  : Next Key Share
|  Sargable Index Predicate(s)
|  |  Return Data to Application
|  |  |  #Columns = 1
Return Data Completion



В плане видим что также используется индекс (Index-Only Access), т.е. null значения включаются в индекс.


Т.о. из трех рассматриваемых СУБД только Оракл не включает значения null в индекс, Informix и DB2 наоборот согласно данным оптимизатора, включают null значения в индекс.

пятница, ноября 18, 2011

Новое оформление блога

Переключил блог в новое оформление, пока выглядит непривычно. Вернул как было.

среда, ноября 24, 2010

четверг, октября 21, 2010

Mercurial и TortoiseHg

При использовании Mercurial часто бывает необходимость посмотреть дерево проекта в графическом виде. При этом можно конечно использовать и встроенное средство просмотра, но удобнее пользоваться TortoiseHg. Причем для запуска можно даже не выходить из консоли: достаточно запустить команду hgtk log. У команды hgtk есть также много других ключей для выполнения разных задач из графического интерфейса.