Showing posts with label informix. Show all posts
Showing posts with label informix. Show all posts

Friday, September 9, 2011

Get pending In Place ALTERs / Obter as tabelas com InPlace ALTERs pendentes

This article is written in English and Portuguese
Este artigo está escrito em Inglês e Português

http://www.tonkinnews.com

English version:


Introduction

The topic of in place ALTERed tables has always been present in Informix. We say a table was ALTERed in place when an ALTER TABLE instruction resulted in a new table schema, but the table was not physically changed. This is very helpful on large and busy tables. It means you can do the ALTER TABLE quickly (instantaneously) and with minimum immediate impact on system resources. Internally Informix does a very simple thing from the user point of view, but that can be complex from the engine point of view: A new version of the table definition is created, and from there on, any instruction (DML) affecting the data will use the new version. The table's existing pages are left on the older version but each time we SELECT them, the engine converts the row(s) to the new format. Additionally if we update a row, the page where it is stored will be written in the new format.

For example, if we have a table with lots of data pages, and we add a column, this will do an in place ALTER. Certain types of ALTERs don't allow in place ALTERs. For example, if we change a CHAR(5) column to a SMALLINT, this will be a slow ALTER. This usually happens when the system cannot immediately guarantee that the existing data can be stored in the new representation.

When the engine decides that it can do an in place ALTER, we don't have the option to inhibit it. Meaning the ALTER table will be done as an in place ALTER, and if we want to force the physical changes, we must do what we usually call a dummy UPDATE: UPDATE tabname SET column = column;

Impacts of in place ALTERs

There are several impacts on having tables with in place ALTERs. The immediate one is that your updates will be slightly slower, since the whole page will be converted and written. Note that this does not necessarily means higher I/O load, since the page is the smallest unit written by the engine. In other words, even if your table does not have more than one version of it's definition, when we change a single row of data, a whole page (at least) will be written. But the other rows of the page don't need to be changed. And changing an older version can mean your data will not fit on one page after conversion. So there can be more I/O.
Another potential issue is that like with any other part of the engine, the mechanism of in place ALTER can have issues. This is an overrated aspect, but it's true we've seen problems that only affect tables with in place ALTERs.

But the real issue with in place ALTERs refers to upgrades and downgrades. Through versions there have been great controversy regarding the real impact of doing in-place upgrades (conversions) with tables with pending in-place ALTERs. I've searched through the migration guides for several versions (7.3, 9.2, 9.4, 10, 11.1, 11.5 and 11.7) and they're almost completely consistent: You can upgrade with pending in-place ALTERed tables, but you cannot revert. The only exception I've found was the manual for 9.4 which states that you must remove the pending in-place ALTERs to run the conversion (upgrade) successfully.

The reason for allowing upgrades but not downgrades is pretty simple and acceptable: Informix guarantees that version N+1 can handle all previous situations of in-place ALTERs done in version N or older. But, since each version may have added new situations where in-place ALTERs can be done, we can't risk porting a pending ALTER to an older version that may not be able to handle it. Let me remind you that an in-place ALTER requires the ability to convert from one row version to a newer one (which can have more columns, or different data types etc.)

At the time of this writing I could not verify if the exception in the migration guide of version 9.4 was justified or simply a documentation problem. But the fact is that most people assume they must complete the ALTER tables that were done in-place before converting. By this I mean that they must eliminate all the pages in older versions. A valid reason to do that is that in case you need to revert you don't have to waste time running the dummy updates. Typically, if you have any issue in the new version and need to revert, you'll want to do it as soon as possible. As such, eliminating the pending inplace ALTERs before you upgrade can save you precious time if you really need to revert. In any case, the migration guide for version 11.7 clearly states that you only need to remove the pending inplace ALTERs, if they were caused after the conversion to 11.7. Any previous one (which already exists in the old version) would not need to be eliminated.
As a side note, let me state that the only time I've done reversions was during a customer and partner workshop where we were demoing this functionality... I never had to do it on a real customer situation. In any case the other limitations for reversion can be real challenges, so the pending in-place ALTERs wouldn't be your biggest concern.

Finding in-place alters

Now that we've seen in which situations we should remove pending inplace ALTERs (tables with pages in older versions), we come to another issue that is frequently asked, and to which there are several answers. Most of them are controversial or badly explained which again raises a lot of confusion. The issue is: How do we find tables with pending inplace ALTERs?
There was a discussion in the IIUG forum near the end of 2010 that focused on this issue. As usual, there were three answers to this:
  1. A quick way (based on SQL and SMI that tells us which tables suffered an inplace ALTER, but doesn't show which tables have pending inplace ALTERs. This means that unless you completely rebuild the table, just running dummy UPDATEs will not prevent the table from always appearing in the list generated by this method
  2. A slow way that's based in the oncheck -pT output (this effectively tells you the number of pages in each existing version This method will give you just the tables with pending inplace ALTERs
  3. A technical support tool that searches the tables metadata and can provide the answer pretty quickly. Only problem is that it's not generally available

And this was my motivation to do some research on this issue. After some information exchange with Andreas Legner from IBM technical support in Germany, I was able to create an SQL script that can find the tables with pending inplace alters. The script can give us the details about the number of pages in each version, it returns the database and table name, the version and number of pages it contains.

The great thing about this script is that it's fast (from a few seconds to a few minutes for very large databases) and it really shows you the current status. Contrary to what the option 1) above does, if you do the dummy updates on one table, that table will not show up if you run it again. One warning: If you test this, after the dummy update you need to force a checkpoint. The script goes through the partition headers (because the required info is stored there), and after the dummy updates the partition headers are written to disk only at checkpoint time.

The script comes in the form of a stored procedure and is based only on the sysmaster views. The script was tested with all the versions I could find (7.31, 9.3, 9.4, 10, 11.1, 11.5 and 11.70) and it worked without issues in all of them. So if you're upgrading an old system and want to make sure you clear any pending inplace altered tables this can be a great help.

The SQL containing the script is at the bottom of this article and I will not dig into it with great detail. The challenges I got in developing it were mainly to understand how the needed data was already present in sysmaster views and also on interpreting this data (the representation is different depending on the "endianess" of your platform. Again, for the first one the help from Andreas Legner was precious and for the second one a special thank you goes to Art Kagel. Both of them helped me to review the script and to fix some nasty bugs I had in my first attempts.

Usage

In order to use this procedure, you'll need to copy the script code below, paste it into dbaccess and run it against any of your instance databases. It will create a function called get_pending_ipa() that will return the following fields:
  • Database
  • Table name
  • Partition name
  • Object type (can be table, partition or partition main)
  • Partition number
  • Partition lockid (the partnum of the main partition for fragmented tables)
  • Table structure version
  • Number of pages remaining in this version
If you need to create this against a version 7 (pre-V9) you should change the header and footer as commented in the script.
To execute just run

execute function get_pending_ipa();
or
execute procedure get_pending_ipa();

Disclaimer

Although the script was tested as much as I could, please understand that is comes with no guarantee. Use at your one risk. Neither me nor my employer can be considered liable for any harm done by it (difficult to happen since it only SELECTs), or more important for bad decisions taken based on it's output. This is just the usual disclaimer. Naturally I've done my best to make sure it works. If you find any error in the script or if you have any suggestion, feel free to contact me.



Versão Portuguesa:

Introdução

O assunto das tabelas com inplace ALTERs (optei por não traduzir o termo) tem estado sempre presente no Informix. Dizemos que uma tabela tem um inplace ALTER quando uma instrução ALTER TABLE deu origem a uma nova definição (schema) de tabela, mas a mesma não foi fisicamente alterada. Isto é muito útil em tabelas grandes e/ou com muitos acessos. Permite que se faça um ALTER TABLE muito rápido (instantâneo) e com um impacto reduzido no consumo de recursos do sistema. Internamente o Informix faz algo muito simples do ponto de vista do utilizador mas que pode ser bastante complexo se visto pelo ângulo do motor: É criada uma nova definição da estrutura da tabela, e a partir desse momento qualquer instrução (DML) que afecte os dados usará essa nova versão. As páginas já existentes da tabela mantêm-se na versão antiga, mas sempre que façamos um SELECT o motor converte a linha(s) para o novo formato. Adicionalmente, se fizermos um UPDATE a página onde estiver guardado o registo(s) será convertida pelo motor para o novo formato.

Por exemplo, se tivermos uma tabela com muitas páginas de dados, e adicionar-mos uma coluna, isto será feito com um inplace ALTER. Mas alguns tipos de ALTER TABLE não permitem um inplace ALTER. Caso mudemos uma coluna de CHAR(5) para SMALLINT, isto será um slow ALTER. Habitualmente isto acontece se o sistema não puder garantir imediatamente que os dados existentes têm representação ou podem ser guardados no novo tipo de dados (no caso anterior o CHAR(5) pode ter caracteres não numéricos). Se o motor decide que pode fazer um inplace ALTER não temos forma de o inibir. Ou seja, a alteração será forçosamente feita com inplace ALTER e se desejarmos forçar a mudança física temos de fazer o que normalmente se designa de dummy UPDATE: UPDATE tabela SET coluna = coluna;

Impactos dos in place ALTERs

Existem vários impactos em ter tabelas com inplace ALTERs. O mais imediato é que os UPDATEs serão ligeiramente mais lentos, pois toda a página tem de ser convertida e escrita. Note-se que isto não implica maior carga de I/O, pois a página é a unidade de escrita mais pequena do motor. Por outras palavras, mesmo que a sua tabela não tenha mais que uma versão da sua definição, quando mudamos uma linha contida numa página, toda a página (pelo menos) será escrita. Mas as outras linhas da mesma página não são alteradas. E mudar de uma versão anterior da definição para a atual pode implicar que nem todas as linhas caibam na página depois de convertidas. Isso sim, pode implicar mais I/O.
Outro potencial problema é que como em qualquer outra área de código do motor, o mecanismo de inplace ALTER pode ter problemas ou erros. Este aspeto é muitas vezes sobrevalorizado, mas é um facto que já tivemos problemas que só aconteciam em tabelas com inplace ALTERs.

Mas o verdadeiro problema habitualmente associado com os inplace ALTERs diz respeito aos upgrades e downgrades. Através das versões tem existido grande controvérsia relativamente às verdadeiras implicações de se efetuarem conversões (ou upgrades inplace) de versão existindo tabelas com inplace ALTERs pendentes (por pendentes quer-se dizer que têm efetivamente páginas com mais que uma versão de definição ou schema da tabela). Procurei pelos guias de migração de várias versões (7.3, 9.2, 9.4, 10, 11.1, 11.5 e 11.7) e são quase absolutamente consistentes: Pode fazer-se o upgrade com inplace ALTERs pendentes mas não se pode fazer o inverso (regressão). A única exceção a esta regra está no manual da versão 9.4 que refere que os mesmos têm de ser removidos antes de se efectuar a conversão.

A razão para permitir conversões, mas não regredir é bastante simples e compreensível: O Informix garante que a versão N+1 consegue lidar com toas as possibilidades de inplace ALTERs da versão N ou anteriores. Mas dado que em cada versão podem ser adicionadas novas situações onde o motor consegue fazer um inplace ALTER, não podemos correr o risco de portar um inplace ALTER pendente para uma versão anterior que não sabe como lidar com ele. Deixe-me lembrar que um inplace ALTER obriga a que o motor consiga mapear os dados de um formato para outro (com mais colunas, ou tipos de dados diferentes etc.)

No momento da escrita deste artigo não consegui verificar se a exceção no guia de migração da versão 9.4 se pode justificar com um erro de documentação ou se tem outro fundamento. Mas o facto é que a maioria dos utilizadores assumem que têm de completar (ou eliminar) os inplace ALTERs pendentes antes das conversões (upgrades). Uma razão válida para este raciocínio é que caso seja necessário regredir para a versão original não se quererá perder tempo a executar os dummy updates. Ou seja, eliminar os inplace ALTERs pendentes, antes da conversão, pode poupar tempo precioso caso se verifique a necessidade de regredir. O manual da versão 11.7 vai um pouco mais longe e refere que só é necessário remover os inplace ALTERs pendentes, se os mesmos foram gerados já na versão 11.7

Qualquer um anterior (que já existisse na versão original) não necessitará de ser eliminado.
Como um aparte, permita-me que diga que a única vez que fiz regressões foi num workshop para parceiros e clientes com o objetivo de demonstrar a funcionalidade. Nunca tive a necessidade de efectuar isto numa situação real em clientes. Em qualquer caso existem várias limitações às regressões que podem constituir verdadeiros desafios, pelo que os inplace ALTERs não deveriam ser a maior preocupação.

Identificar inplace ALTERs pendentes

Agora que vimos em que situações devemos remover os inplace ALTERs pendentes, chegamos a outro tópico que é alvo frequente de perguntas e discussões. A questão é: Como identificamos as tabelas que possuem páginas de dados com várias versões da sua definição? Há várias respostas e regra geral são controvérsias ou mal explicadas o que levanta enormes confusões. Decorreu uma discussão sobre este tema mais uma vez em finais de 2010. Como é hábito foram dadas três respostas para o problema:
  1. Uma forma rápida (baseada em SQL e tabelas SMI) que nos diz as tabelas que sofreram inplace ALTERs mas não permite saber se ainda estão pendentes (existem ainda páginas de dados com formato antigo). Isto significa que a menos que se refaça completamente a tabela, a mera execução dos dummy UPDATEs não impedirá a tabela de voltar a aparecer na lista gerada por este método.
  2. Uma forma lenta, baseada no resultado do oncheck -pT. Isto efetivamente diz-nos quantas páginas de dados existem para cada formato da tabela. Este método permite realmente identificar os inplace ALTERs pendentes.
  3. Uma ferramenta do suporte técnico que procura na metadata das tabelas e pode fornecer a resposta de forma rápida. O único problema é que não está disponível para os utilizadores em geral

E isto foi a minha motivação para efetuar alguma pesquisa sobre este tema. Após alguma troca de informação com o Andreas Legner do suporte técnico da IBM na Alemanha, consegui criar um script SQL que pode reportar as tabelas com inplace ALTERs pendentes. Este script consegue fornecer o número de páginas existentes em cada versão da definição da tabela. Retorna a base de dados, a tabela, a versão(ões) e quantas páginas contém.

O bom deste script é que é rápido (de uns segundos a poucos minutos para bases de dados muito grandes), e mostra a situação actual. Contrariamente à opção 1) acima, depois de fazermos os dummy UPDATEs numa tabela, essa mesma tabela não volta a aparecer no output do script. Apenas um aviso relativamente a isto: O script percorre o que chamamos de partition headers e estes só são escritos em disco durante um checkpoint. Assim, depois de correr os dummy UPDATEs devem forçar-se um checkpoint (ou esperar que ocorra um) antes de correr novamente o script.

O script traduz-se num procedimento SPL e baseia-se em informação disponível nas views da base de dados sysmaster. O script foi testeado em todas as versões que consegui encontrar (7.31, 9.3, 9.4, 10, 11.1, 11.5 e 11.7) e correru em todas sem problemas. Assim, se estiver a fazer uma conversão de um sistema antigo e quiser limpar todos os inplace ALTERs pendentes nessa instância, isto pode ser uma grande ajuda.

O script SQL contendo o procedimento está disponível no final deste artigo e não vou fazer uma explicação exaustiva do mesmo. Os desafios que enfrentei durante o desenvolvimento do procedimento foram principalmente entender se os os dados necessários estavam representados na base de dados sysmaster e também na interpretação desses dados (a representação dos dados é diferente conforme o "endianess" da plataforma). Mais uma vez, na primeira questão a ajuda do Andreas Legner foi preciosa e para a segunda questão tive a ajuda do Art Kagel a quem enviou um sincero agradecimento. Ambos me ajudaram a rever o procedimento e identificaram alguns bugs feios que tinha nas primeiras tentativas.

Utilização


Para usar esta função terá de copiar o código do script que se encontra no final do artigo, colá-lo num dbaccess (ou outra ferramenta) e executá-lo numa das bases de dados da sua instância. O script irá criar uma função chamada get_pending_ipa() que irá retornar os seguintes valores:

  • Nome da base de dados
  • Nome da tabela
  • Nome da partição
  • Tipo de objecto (pode ser table, partition ou partition main)
  • Número da partição
  • lockid da partição (o número da partição principal para tabelas fragmentadas)
  • Versão da estrutura da tabela
  • Número de páginas ainda existentes nesta versão
Se necessitar de criar a função numa versão 7 (pre-V9) deve alterar o cabeçalho e o final da função de acordo com o recomendado/comentado no código
Para executar basta dar a instrução:

execute function get_pending_ipa();
ou

execute procedure get_pending_ipa();

Exclusão de garantia

Apesar de o script ter sido testado tanto quanto pude, por favor assuma que o mesmo não é fornecido com qualquer tipo de garantia. Utilize-o por sua conta e risco. Nem eu nem o meu empregador poderão ser considerados responsáveis por qualquer mal ou prejuízo derivado do seu uso (difícil dado que apenas faz SELECTs), ou mais importante, por más decisões baseadas no seu output. Isto é apenas o normal termo de des-responsabilização. Naturalmente fiz o meu melhor para assegurar que o procedimento funciona bem e retorna resultados corretos. Qualquer problema que identifique no script ou sugestão de melhoria por favor contacte-me.





SQL script:



CREATE FUNCTION get_pending_ipa() RETURNING
        VARCHAR(128) as database, VARCHAR(128) as table, VARCHAR(128) as partition, VARCHAR(9) as obj_type,
        INTEGER as partnum, INTEGER as lockid, SMALLINT as version, INTEGER as npages
-- For version 7.x use this header instead:
--CREATE PROCEDURE get_pending_ipa() RETURNING VARCHAR(128), VARCHAR(128), VARCHAR(128), VARCHAR(9), INTEGER, INTEGER, SMALLINT, INTEGER;
-- Name: $RCSfile: get_pending_ipa.sql,v $
-- CVS file: $Source: /usr/local/cvs/stable/informix/queries/get_pending_ipa.sql,v $
-- CVS id: $Header: /usr/local/cvs/stable/informix/queries/get_pending_ipa.sql,v 1.5 2011/09/09 20:57:31 fnunes Exp $
-- Revision: $Revision: 1.5 $
-- Revised on: $Date: 2011/09/09 20:57:31 $
-- Revised by: $Author: fnunes $
-- Support: Fernando Nunes - domusonline@gmail.com
-- Licence: This script is licensed as GPL ( http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html )
-- Variables holding the database,tabnames and partnum
DEFINE v_dbsname, v_old_dbsname LIKE sysmaster:systabnames.dbsname;
DEFINE v_tabname, v_partname, v_old_tabname LIKE sysmaster:systabnames.tabname;
DEFINE v_partnum, v_old_partnum LIKE sysmaster:syspaghdr.pg_partnum;
DEFINE v_lockid, v_old_lockid LIKE sysmaster:sysptnhdr.lockid;
DEFINE v_pg_next INTEGER;
DEFINE v_pg_partnum INTEGER;
DEFINE v_obj_type VARCHAR(9);
-- Variables holding the various table versions and respective number of pages pending to migrate
DEFINE v_version SMALLINT;
DEFINE v_pages INTEGER;
-- Hexadecimal representation of version and pending number of pages
DEFINE v_char_version CHAR(6);
DEFINE v_char_pages CHAR(10);
DEFINE v_aux_char CHAR(8);
-- Hexadecimal representation of the slot 6 data. Each 16 bytes will appear as a record that needs to be concatenated
DEFINE v_hexdata VARCHAR(128);
-- Variable to hold the sysmaster:syssltdat hexadecimal representation of each 16 bytes of the slot data
DEFINE v_slot_hexdata CHAR(40);
DEFINE v_aux VARCHAR(128);
DEFINE v_endian CHAR(6);
DEFINE v_offset SMALLINT;
DEFINE v_slotoff SMALLINT;
DEFINE v_dummy INTEGER;
-- In case we need to trace the function... Uncomment the following two lines
--SET DEBUG FILE TO "/tmp/get_pending_ipa.dbg";
--TRACE ON;
-- Now lets find out the Endianess ( http://en.wikipedia.org/wiki/Endianness ) of this platform
-- The data in sysmaster:syssltdat will be different because of possible byte swap
-- Read the first slot of the rootdbs TBLSpace tblspace (0x00100001)
-- The first 4 bytes hold the partition number (0x00100001)
SELECT
        s.hexdata[1,8]
INTO
        v_hexdata
FROM
        sysmaster:syssltdat s
WHERE
        s.partnum = '0x100001' AND
        s.pagenum = 1 AND
        s.slotnum = 1 AND
        s.slotoff = 0;
IF v_hexdata = '01001000'
THEN
        -- Byte swap order, so we're little Endian (Intel, Tru64....)
        LET v_endian = 'LITTLE';
ELSE
        IF v_hexdata = '00100001'
        THEN
                -- Just as we write it (no byte swap), so we're big Endian (Sparc, Power, Itanium...)
                LET v_endian = 'BIG';
        ELSE
                -- Just in case something weird (like a bug(!) or physical modification) happened
                RAISE EXCEPTION -746, 0, 'Invalid Endianess calculation... Check procedure code!!!';
        END IF
END IF
-- Flags to mark the beginning
LET v_hexdata = "-";
LET v_old_dbsname = "-";
LET v_old_tabname = "-";
-- The information we want for each version description will occupy this number of characters
-- in the sysmaster:syssltdat.hexdata notation (after removing spaces). The size depends on the engine version.
LET v_offset=DBINFO('version','major');
IF v_offset >= 10
THEN
        LET v_offset = 48;
ELSE
        LET v_offset = 40;
END IF
LET v_old_lockid = -1;
FOREACH
        -- This query will browse through all the instance partitions, excluding sysmaster database, and will look for
        -- any extended partition header (where partition header "next" field is not 0)
        -- the ABS(...) is just a trick to make partnums that are equal to lock id appear at the end
        SELECT
                t.dbsname, t.tabname, t1.tabname, t.partnum, p.pg_partnum, p.pg_next, h.lockid, ABS(h.lockid - h.partnum)
        INTO
                v_dbsname, v_partname ,v_tabname, v_partnum, v_pg_partnum, v_pg_next, v_lockid, v_dummy
        FROM
                sysmaster:systabnames t,
                sysmaster:syspaghdr p,
                sysmaster:sysptnhdr h,
                sysmaster:systabnames t1
        WHERE
                p.pg_partnum = sysmaster:partaddr(sysmaster:partdbsnum(t.partnum),1) AND
                p.pg_pagenum = sysmaster:partpagenum(t.partnum) AND
                t.dbsname NOT IN ('sysmaster') AND
                h.partnum = t.partnum AND
                t1.partnum = h.lockid AND
                p.pg_next != 0
        ORDER BY
                t.dbsname, t.tabname, 8 DESC, t.partnum
        IF v_lockid = v_partnum
        THEN
                IF v_lockid = v_old_lockid
                THEN
                        LET v_obj_type = "Part Main";
                ELSE
                        LET v_obj_type = "Table";
                END IF
        ELSE
                LET v_obj_type = "Part";
        END IF
     
        LET v_old_lockid = v_lockid;
        WHILE v_pg_next != 0
                -- Find if we're dealing with a fragmented table or not...
                -- While this extended partition page points to another one...
                -- Get all the slot 6 data (where the version metadata is stored - version, number of pages, descriptor page etc.
                FOREACH
                SELECT
                        REPLACE(s.hexdata, ' '), s.slotoff, p.pg_next
                INTO
                        v_slot_hexdata, v_slotoff, v_pg_next
                FROM
                        sysmaster:syspaghdr p,
                        sysmaster:syssltdat s
                WHERE
                        s.partnum = p.pg_partnum AND
                        s.pagenum = p.pg_pagenum AND
                        s.slotnum = 6 AND
                        p.pg_partnum = v_pg_partnum AND
                        p.pg_pagenum = v_pg_next
                IF ( v_dbsname != v_old_dbsname OR v_tabname != v_old_tabname OR v_partnum != v_old_partnum)
                THEN
                        LET v_old_dbsname = v_dbsname;
                        LET v_old_tabname = v_tabname;
                        LET v_old_partnum = v_partnum;
                        -- First iteraction for each table
                        LET v_hexdata = v_slot_hexdata;
                ELSE
                        -- Next iteractions for each table
                        LET v_hexdata = TRIM(v_hexdata) || v_slot_hexdata;
                        IF LENGTH(v_hexdata) >= v_offset
                        THEN
                                -- We already have enough data for a version within a table
                                -- Note that we probably have part of the next version description in v_hexdata
                                -- So we need to copy part of it, and keep the rest for next iteractions
                                LET v_aux=v_hexdata;
                                LET v_hexdata=SUBSTR(v_aux,v_offset+1,LENGTH(v_aux)-v_offset);
                     
                                -- Split the version and number of pending pages part...
                                LET v_char_version = v_aux[1,4];
                                LET v_char_pages = v_aux[9,16];
                                -- Create a usable hex number. Prefix it with '0x' and convert due to little endian if that's the case
                                IF v_endian = "BIG"
                                THEN
                                        LET v_char_version = '0x'||v_char_version;
                                        LET v_char_pages = '0x'||v_char_pages;
                                ELSE
                                        LET v_aux_char = v_char_version;
                                        LET v_char_version[5]=v_aux_char[1];
                                        LET v_char_version[6]=v_aux_char[2];
                                        LET v_char_version[4]=v_aux_char[4];
                                        LET v_char_version[3]=v_aux_char[3];
                                        LET v_char_version[2]='x';
                                        LET v_char_version[1]='0';
                                        LET v_aux_char = v_char_pages;
                                        LET v_char_pages[9]=v_aux_char[1];
                                        LET v_char_pages[10]=v_aux_char[2];
                                        LET v_char_pages[7]=v_aux_char[3];
                                        LET v_char_pages[8]=v_aux_char[4];
                                        LET v_char_pages[6]=v_aux_char[6];
                                        LET v_char_pages[5]=v_aux_char[5];
                                        LET v_char_pages[3]=v_aux_char[7];
                                        LET v_char_pages[4]=v_aux_char[8];
                                        LET v_char_pages[2]='x';
                                        LET v_char_pages[1]='0';
                                END IF
                                -- HEX into DEC (integer)
                                LET v_version = TRUNC(v_char_version + 0);
                                LET v_pages = TRUNC(v_char_pages + 0);
                                IF v_pages > 0
                                THEN
                                        -- This version has pending pages so show it...
                                        RETURN TRIM(v_dbsname), TRIM(v_tabname), TRIM(v_partname), TRIM(v_obj_type), v_partnum, v_lockid, v_version, v_pages WITH RESUME;
                                END IF
                        END IF
                END IF
                END FOREACH
                IF LENGTH(v_hexdata) >= v_offset
                THEN
                        -- If we still have data to process...
                        LET v_aux=v_hexdata;
     
                        LET v_char_version = v_aux[1,4];
                        LET v_char_pages = v_aux[9,16];
                        IF v_endian = "BIG"
                        THEN
                                LET v_char_version = '0x'||v_char_version;
                                LET v_char_pages = '0x'||v_char_pages;
                        ELSE
                                LET v_aux_char = v_char_version;
                                LET v_char_version[5]=v_aux_char[1];
                                LET v_char_version[6]=v_aux_char[2];
                                LET v_char_version[4]=v_aux_char[4];
                                LET v_char_version[3]=v_aux_char[3];
                                LET v_char_version[2]='x';
                                LET v_char_version[1]='0';
                                LET v_aux_char = v_char_pages;
                                LET v_char_pages[9]=v_aux_char[1];
                                LET v_char_pages[10]=v_aux_char[2];
                                LET v_char_pages[7]=v_aux_char[3];
                                LET v_char_pages[8]=v_aux_char[4];
                                LET v_char_pages[6]=v_aux_char[6];
                                LET v_char_pages[5]=v_aux_char[5];
                                LET v_char_pages[3]=v_aux_char[7];
                                LET v_char_pages[4]=v_aux_char[8];
                                LET v_char_pages[2]='x';
                                LET v_char_pages[1]='0';
                        END IF
                        -- HEX into DEC (integer)
                        LET v_version = TRUNC(v_char_version + 0);
                        LET v_pages = TRUNC(v_char_pages + 0);
                        IF v_pages > 0
                        THEN
                                -- This version has pending pages so show it...
                                RETURN TRIM(v_dbsname), TRIM(v_tabname), TRIM(v_partname), TRIM(v_obj_type), v_partnum, v_lockid, v_version, v_pages WITH RESUME;
                        END IF
                END IF
        END WHILE
END FOREACH;
END FUNCTION;
-- For version 7.x use this close statement instead:
--END PROCEDURE;

Saturday, August 20, 2011

10 years of IBM / 10 anos de IBM

This article is written in English and Portuguese

Este artigo está escrito em Inglês e Português



English version



On July 2, 2001, IBM announced the completion of Informix acquisition. So, 10 years have passed since the deal that changed many people lives. A lot was written at the time and since then about the deal, about Informix future, about competitors reactions etc. This historical milestone made me take a look back and think about what's been going on. There are several perspectives about this: The professional, personal, the technical and the marketing ones (and probably more that don't come to mind at this moment). Personally, the acquisition happened three years after I joined Informix Portugal. At the time I was already deeply involved with a Portuguese customer (large Telco) and I believe I gained precious experience since then. Being at IBM I had the opportunity to have some experience with other products (from areas that touch the database area), although the focus was and still is Informix. Informix allowed me to interact with many large (from a small country perspective) companies. So, it was a very positive transition. Of course not everything is perfect. Needless to say that the environment in a small company branch (around 20 people at the time) is by no means similar to the environment of a larger corporation like IBM. The processes inside big corporations are more complex. This is a fact and there's nothing we can do against it.



From a technical perspective, the Informix evolution was incredible. For those of you who know Informix, just think about the releases that came out inside IBM: 9.3 (little to no influence from IBM because it was launched in 2001), 9.4 (2003), 10 (2005), 11.10 (2007), 11.50 (2008) and 11.7 (2010). By the way, from these, only 9.3 has no support at all and 9.4 and 10 are on limited support. There's value for money here, and investment protection. You can compare this to our main competitor for example. They launched 9i R1, 9i R2, 10g R1, 10 R2, 11g R1 and 11g R2. To the best of my knowledge only latest two are fully supported, so more or less the same number of releases and more supported versions for us. Not bad for a database which had no future ten years ago, I'd say.

If I try to recall all the new features I'll end up with another very large article. But some of them must be mentioned:

  • 9.3

    ER in the ORDBMS product line (9.x)

  • 9.4

    Larger chunks

    ER and HDR at the same time

    PAM authentication

    B-Tree scanners (as opposed to older B-Tree cleaner)

  • 10

    Multiple page sizes

    Online index build

    Column encryption

    External directives

    Table level restore

  • 11.10

    MACH 11 (multiple secondary nodes)

    Non blocking checkpoints

    Open Admin Tool

    SQL admin API

    Database scheduler

    Last Committed Read

  • 11.50

    Updatable secondaries

    Compression

    Connection Manager

    Start of XPS to IDS feature porting

  • 11.70

    Storage provisioning

    Non OS users (mapped users)

    No limit for the number of extents

    On line table reorg

    Several XPS features (multi-index path, star join...)

    Informix warehous accelerator





And then we get to the marketing perspective... This is the fun part. It's a never ending discussion, and I thought it would be interesting to make some comparisons, like for example quotes versus reality. Announcements versus reality. Declarations of intentions versus reality. I browsed the Internet trying to find what people said and thought at the time and since then.



Let's start a few years before:



"I think Informix is doing a great job of marketing. They now get the Sybase marketing award. It's something we have never done a very good job of. Talk to somebody at Sybase or Microsoft and ask them what they think of DataBlades. Everyone thinks it's crazy. It's not that it's a bad idea -- it's madness. And they did not -- they did not -- integrate those two products. They did not, they cannot, they will not, it's impossible.", Larry Ellison, at InfoWorld interview, February 1997



Actually, we now "activate" ("register" in Informix jargon) datablades automatically if the user calls a function that belong to one of them. And we ship several of them for free. One of them (TimeSeries) is used to beat competition on "smart metering". Other (BTS) is used to incorporate open source text indexing technology into Informix.

On the same article, Larry Ellison mentions that Informix had 4 products. Although he apparently only names 3 (and 2 seem to be the same), this was in part true. There was the "OLTP" engine, the "DW" (XPS) and the Universal Server (IUS). These days are gone. XPS does still exists, although some of it's functionality is in IDS. There is no distinction between OLTP and "object" or universal servers.



By the time of the acquisition:



"We've found in the past is that when you're acquiring other products, the integration problem is greater than the value you gain from acquiring the product. This will be an integration nightmare.", Paul Marriott, business development manager for 9I at Oracle, in ARNnet site, on April 2001



Was this opinion taken into account when Oracle bought JD Edwards, Peoplesoft, Siebel, Hyperion, Innobase, BEA, Sun....? I believe not. Maybe they just don't learn from their "mistakes", or this quote was just another FUD statement...



"Surely Oracle is going to pick up a few customers from you though -especially the Informix customers?
JK; I don't think you can make that general a statement. Oracle is trying to give the impression that we are going to tell the Informix customers that they've now got to move to DB2. But obviously we aren't doing that. We acquired the Informix assets because we value them. We aren't going to force a migration on customers and partners that isn't right for them - that makes no business sense at all. We've spoken to the Informix customers and partners and have told them that Informix will be supported and developed for the foreseeable future - and the Informix customers are very happy with this. They appear to like the whole proposition so we certainly don't anticipate losing them to Oracle." , Jim Kelly, IBM's Vice President, Marketing Data Management Solutions Division, in an interview to an analyst from Bloor Research, on July 2001

AFAIK, no customer was forced to move to DB2. Some customers were forced to move, because their application suppliers (SAP for example) discontinued Informix in their latest versions. These customers had the chance to choose the new database platform. Some choose DB2, others Oracle, others SQL Server (or other databases like SAPdb)... Similar statements were produced by different IBM executives at the time of the acquisition and later.



And just for fun:



"But quite frankly if Informix is still being marketed as an

independent product five years from now I'll be shocked.", Daniel Morgan, an Oracle ACE in comp.databases.oracle.server on June 2001



Hopefully, five or six years after the predicted date, he has already recovered from the shock.





Let's leave the quotes... I'd also like to give you an example of "declarations of intentions vs reality". While working on a project with another IBM product, I felt the need to test something with a competitor (Oracle) database which is used at the customer site. For my purposes the "free edition" was perfectly enough and it allowed me to work on my own environment. I did the download, but after some days I stopped to think about one detail: The current available version of the "free edition" was 10g (launched 4 or 5 years ago). Now... this version is not fully supported anymore (at least without further costs). So I decided to look for a more recent version. Guess what? It' not available. Some more investigation showed me that a new version was made available in April this year, but only for "beta". Now... What on earth is a "beta" version of a free edition?! After all the product should be the same. Only with certain restrictions.

If you want to compare this with the IBM policy for Informix, you'll noticed that the "free edition" is up to date with the latest available fixpack. Do you notice a different behavior here? I do. And I don't think that's because I work for IBM...





On a more personal perspective, from local market, we see that we haven't been loosing customers. More important our customer are very happy with Informix for the well known reasons (reliability, simplicity, robustness, ease of management). This is not marketing. It's a bit hard to point out a true "pure" Informix DBA and I know the biggest installations in my country. We have Informix in some of the biggest retail chains, in the Telcos, in logistics/transportation, in Finance, in central and local administration and in industrial environments. And all of these barely notice that they run Informix. This is a great achievement, but at the same time I feel it's also a downside. Although this is a paradox, I truly believe that a software that has problems may have better chances of success. Why? Because it makes the people who work with it more "visible" when they solve problems.

As an example, in 2010 I was extensively congatulated when I got involved in a critical situation (caused by a sequence of human errors). The issue was escalated to an high level, and after it was solved the appreciation messages and the echos spread across the hierarchical chain. Now... In a normal situation, no problem should have ocurred, and I would still be completely anonymous from a hierachical point of view.

People who manage Informix tend to do other stuff as well and many times they're a bit "invisible". This is not fair since it also means they're doing their job right, but I've seen this happen several times. You probably know the saying... It's better to have "bad publicitly" than no publicity at all...



Now, let's take a look at what changed in Informix (not the new features) since the acquisition:

  • It gained presence in the IBM events like Information on Demand
  • We have monthly webcasts (chat with the labs)
  • We have PIDs (Post Interim Drops) which are cumulative patch updates This means that I rarely ask for a specific patch since most of the time there's a PID with the fix already available
  • We've been seeing major version releases each 1-2 years (2001,2003,2005,2007,2008,2010). And we've been having new fixpacks each 3 or 4 months which include new features
  • We have InfoCenter with the most up to date documentation in an easily searchable interface
  • We still have the PDF documentation for the people who know their ways around the manuals
  • We have better integration with the IBM product porfolio
  • Informix is used as a repository for some of these products (Cognos express, Optim as an option...)
  • Some new features came directly from other products (DB2 for example). Meaning we get improvements with little engineering effort
  • We have a wider range of editions, including a free one
  • We are still innovators, as the recent TimeSeries success stories show. There are new requirements and we're able to fulfill them
  • Informix is a brand inside the IBM Information Management pillar. Remember that at first we were integrated in the "DB2" pillar. Informix is currently on par with DB2, Cognos, Guardium etc.


... And what didn't change:



  • Informix is still light, easy to install and manage
  • Informix is still robust
  • Informix still scales pretty well
  • Informix support is still good (I'm biased, but I talk a lot with customers that have to deal with other vendors support)
  • Customers still like Informix
  • People still complain about the marketing of the product
  • We don't see Informix in the news
  • IIUG is still a great asset for the Informix community


I believe most people reading this who are aware of Informix history may consider I looked only at the bright side, and there is a dark side. Things that were not accomplished or things that become worst since the acquisition. But keep in mind that it's not totally fair to compare what happened inside IBM with what happened before IBM (specially during the "golden years"). A fair comparison would have to be done between what would have happened if IBM had not buy Informix, and that's impossible to tell. Naturally every Informix supporter can think that it should have more visibility inside IBM (this is a general idea we pick from the forums and independent blogs and sites), or that we're lacking better marketing etc.

From my point of view the balance is positive. And I'm looking forward to the 20th anniversary after IBM acquisition. Let's see what happens in the next ten years. Ten years ago I think many people would not expect the evolution we had.







Versão Portuguesa



No dia 2 de Julho de 2001 a IBM anunciou a conclusão da aquisição da Informix. Portanto, passaram 10 anos desde o negócio que mudou a vida de muitas pessoas. Muito foi escrito na altura e desde então sobre o negócio, sobre o futuro do Informix, sobre as reacções da concorrência etc. Este marco histórico fez-me olhar para trás e pensar sobre o que se tem passado. Há várias perspectivas sobre isto: A pessoal, a profissional, a técnica e a de marketing (bem como outras que não me ocorrem de momento).

Pessoalmente, a aquisição aconteceu três anos depois de ter ingressado na Informix Portugal. Na altura já estava bastante envolvido com um cliente Português (grande empresa de telecomunicações) e penso que ganhei uma experiência preciosa desde então. Pertencer à IBM deu-me oportunidade de me envolver com outros produtos (de outras áreas, mas que tocam o mundo das bases de dados), embora o foco fosse e ainda o seja, o Informix. O Informix permitiu-me interagir com várias grandes (da perpectiva de um país pequeno) empresas. Portanto foi uma transição muito positiva. Naturalmente nem tudo é perfeito. Escusado será dizer que o ambiente de uma filial (cerca de 20 pessoas na altura) de uma pequena companhia mundial, não é de todo semelhante ao ambiente de uma grande companhia como é o caso da IBM. Os processos dentro de grandes empresas têm necessariamente de ser mais complexos. Isto é um facto e ninguém poderá fazer nada contra isso.



Do ponto de vista técnico, a evolução do Informix foi incrível. Para os que conhecem Informix, basta que recordem as versões que sairam já dentro da IBM: 9.3 (pequena ou nenhum influência da IBM dado que foi lançada em 2001), 9.4 (2003), 10 (2005), 11.10 (2007), 11.50 (2008) e 11.7 (2010). Já agora, destas apenas a 9.3 não tem qualquer tipo de suporte e a 9.4 e 10 estão num esquema de suporte limitado (mas sem custos adicionais). Há aqui valor e protecção de investimento. Pode comparar isto com o nosso maior concorrente: Lançaram o 9i R1, 9i R2, 10g R1, 10 R2, 11g R1 and 11g R2. Tanto quanto julgo saber, só os últimos dois são suportados sem mais custos adicionais, por isso, mais ou menos o mesmo número de releases e maior número delas suportadas por nós. Nada mal para uma base de dados que como muitos diziam não tinha futuro há dez anos atrás.



Se enumerasse as novas funcionalidades acabaria com mais um artigo muito grande. Mas pelo menos algumas devem ser referidas:

  • 9.3

    ER na linha de produto ORDBMS (9.x)

  • 9.4

    Chunks maiores que 2GB

    ER e HDR ao mesmo tempo

    Autenticação PAM

    B-Tree scanners (em oposição à anterior B-Tree cleaner)

  • 10

    Diferentes tamanhos de página

    Criação de indíces Online

    Encriptação de colunas

    Directivas externas

    Restore de uma tabela a partir de um arquivo

  • 11.10

    MACH 11 (multiplos nós secundários)

    Checkpoints sem bloqueio

    Open Admin Tool

    SQL admin API

    Database scheduler

    Last Committed Read

  • 11.50

    Secundários com possibilidade de alterações (DML)

    Compressão

    Connection Manager

    Início da transposição de funcionalidades do XPS para o IDS

  • 11.70

    Storage provisioning

    Utilizadores não reconhecidos pelo SO (mapped users)

    Eliminação do limite de extents para uma partição

    Reorganização de tabelas Online

    Várias funcionalidades do XPS (multi-index path, star join...)

    Informix Warehouse Accelerator





E agora temos a perspective de marketing.... Este é o aspecto mais divertido. Trata-se de uma discussão sem fim e lembrei-me que seria interessante fazer algumas comparações, como por exemplo citações versus realidade, anúncios versus realidade e declarações de intenções versus realidade. Efectuei umas pesquisas sobre o que as pessoas disseram na altura e desde então.



Comecemos uns anos antes (tradução pessoal. Pode consultar o original nos links):



"Eu penso que a Informix está a fazer grande trabalho de marketing. Eles agora obtêm o prémio de marketing Sybase. É algo em que nós nunca fizemos um bom trabalho. Fale com alguém na Sybase ou Microsoft e pergunte-lhes o que pensam dos Datablades. Toda a gente lhe dirá que é uma loucura. Não é que seja uma má ideia -- é loucura. E eles não -- eles não -- integraram esses dois produtos. Eles não o fizeram, não o podem fazer, não o irão fazer, é impossível.", Larry Ellison, numa entrevista à InfoWorld, em Fevereiro de 1997



Na verdade, nós actualmente "activamos" ("registamos" em linguagem Informix) datablades automaticamente sempre que um utilizador chama uma função que pertence a um deles. E fornecemos vários gratuitamente. Um deles (TimeSeries) é usado para bater a concorrência em "smart metering". Outro (BTS) é usado para incorporar tecnologia de código fonte aberto de indexação de texto, no Informix.

No mesmo artigo, Larry Ellison menciona que o Informix tinha 4 produtos diferentes. Embora aparentemente só refira 3 (e dois parecem ser o mesmo), isto era em parte verdade. Existia o motor "OLTP", o de "DW" (XPS) e o servidor universal (IUS). Esses dias já terminaram. O XPS ainda existe, embora muitas das funcionalidades já estejam no IDS. Não há distinção entre o produto para OLTP e o que na altura era chamado de servidor universal.



Na altura da aquisição:



"Descobrimos no passado que quando adquirimos outros produtos, o problema da integração é maior que o valor ganho pela aquisição do produto. Isto será um pesadelo de integração", Paul Marriott, gestor de desenvolvimento de negócio para o 9I na Oracle, no site ARNnet, em Abril de 2001



Esta opinião foi tida em conta quando a Oracle comprou a JDEdwards, Peoplesoft, Siebel, Hyperion, Innobase, BEA, Sun....? Calculo que não. Talvez não aprendam com os erros ou esta citação tenha sido apenas mais uma a contribuir para o FUD (fear, uncertainty and doubt)...



"Certamente a Oracle irá conseguir obter algums clientes vossos - especialmente clientes Informix?
JK; Não me parece que se possa generalizar essa afirmação. A Oracle está a tentar dar a impressão que nós iremos dizer aos clientes Informix que agora têm de migrar para DB2. Mas obviamente não faremos isso. Adquirimos os bens da Informix porque os valorizamos. Não iremos forçar uma migração em clientes e parceiros que não seja indicada para eles - Isso não faz qualquer sentido em termos de negócio. Temos falado com clientes e parceiros Informix e temos dito que o Informix será suportado e desenvolvido no futuro previsível - e os clientes Informix estão muito contentes com isto. Parecem gostar de toda a proposição de valor e portanto não antecipamos perdê-los para a Oracle", Jim Kelly, IBM's Vice President, Marketing Data Management Solutions Division, numa entrevista a um analista da Bloor Research, em Julho de 2001

Tanto quanto sei, nenhum cliente foi forçado a migrar para DB2. Alguns clientes foram forçados a migrar porque os seus fornecedores aplicacionais (SAP por exemplo) descontinuaram o suporte para Informix nas suas versões mais recentes. Estes clientes tiveram a possibilidade de escolher a nova plataforma para base de dados. Alguns escolheram DB2, outros Oracle e outros SQL Server (ou outras BDs como SAPdb)...

Afirmações semelhantes foram proferidas por outros executivos da IBM na altura da aquisição e após a mesma.



E apenas por brincadeira:



"Mas muito sinceramente, se o Informix ainda for comercializado como um produto independente, daqui a cinco anos ficarei chocado.", Daniel Morgan, um Oracle ACE no comp.databases.oracle.server em Junho de 2001



Com um pouco de sorte, após cinco ou seis anos depois da data prevista, ele já terá recuperado do choque.



Deixemos as citações... Também gostaria de deixar um exemplo de "declarações de intensões versus realidade". Durante um projecto com outro produto IBM, senti a necessidade de testar algo com uma base de dados da concorrência (Oracle), que é usada no cliente onde decorre o projecto. Para as minhas necessidades, a edição gratuita era perfeitamente suficiente e permitia-me trabalhar mais confortavelmente no meu próprio ambiente. Efectuei o download, mas após alguns dias parei para pensar sobre um detalhe: A versão actualmente disponível da edição gratuita era a 10g (lançada há 4 ou 5 anos). Repare-se... esta versão já nem é totalmente suportada (sem custos adicionais). Por isso decidi procurar a versão mais recente. Adivinhe...? Não está disponível. Alguma investigação mostrou-me que a nova versão foi disponibilizada em Abril deste ano, mas apenas em "beta". Agora... O que diabo é uma versão "beta" de uma edição livre?! Ao fim ao cabo o produto deverá ser o mesmo. Apenas com algumas restrições.

Se compararmos isto com a politica da IBM para o Informix, reparamos que a edição gratuita, está a par com os último fixpack disponibilizado. Nota aqui uma diferença de comportamento? Eu noto e julgo que não é por trabalhar na IBM...



Numa perspectiva mais subjectiva, sobre o mercado local, vemos que não temos perdido clientes. Mais importante, os clientes continuam contentes com o Informix pelas razões bem conhecidas (fiabilidade, simplicidade, robustez e facilidade de gestão). Isto não é marketing. É-me um pouco difícil indicar um verdadeiro e "puro" DBA Informix, e conheço as maiores e mais criticas instalações de Informix no meu País. Temos Informix em grandes cadeias de lojas, nas telecomunicações, em logística e transportes, na área financeira, na administração central e local e na área industrial. E em todos estes sitios mal se apercebem que correm Informix. Isto é um grande feito, mas ao mesmo tempo é um grande problema. Apesar de isto ser um paradoxo, acredito verdadeiramente que um software que cause ou esteja envolvido em problemas tem mais facilidade em ter sucesso. Porquê? Porque faz com que as pessoas que trabalhem com ele se tornem mais "visíveis" quando resolvem problemas. A título de exemplo, em 2010 fui extraordinariamente elogiado pelo envolvimento numa situação complicada (originada por uma sequência de erros humanos). O assunto foi escalado ao mais alto nível e após resolvido surgiram os elogios e os ecos percorreram a cadeia hierarquica. Ora numa situação normal, nada de errado teria acontecido e eu continuaria anónimo para a hierarquia.

Quem gere Informix tende a efectuar uma série de outras tarefas. E tendem a ser "invisíveis". Isto não é justo, pois naturalmente significa que estão a fazer o seu trabalho correctamente, mas já o tenho presenciado inúmeras vezes. Como diz o ditado: "que falem mal, mas que falem"...



Vejamos agora o que mudou (não as novas funcionalidades) desde a aquisição:

  • O Informix ganhou presença nos eventos globais da IBM (como o Information on Demand)
  • Temos webcasts mensais (chat with the labs)
  • Temos PIDs (Post Interim Drops) que são patches cumulativos. Isto significa que raramente peço um patch específico pois na maioria dos casos já existe um PID com a correcção necessária já disponível
  • Temos tido novas versões (major releases) cada 1-2 anos (2001,2003,2005,2007,2008,2010). E temos tido fixpacks cada 3-4 meses, que inclúem novas funcionalidades e não apenas correcções
  • Temos o InfoCenter com a documentação mais actualizada e uma interface que permite a procura fácil de termos
  • Continuamos a ter a documentação em PDF para quem já conhece a sua estrutura e prefere tê-la disponível no computador (ou dispositivo móvel)
  • Temos melhor integração com o portfolio de produtos IBM
  • O Informix é usado como repositório em alguns dos outros produtos IBM (Cognos Express e Optim como opção, ...)
  • Algumas novas funcionalidades vieram directamente de outros produtos (DB2 por exemplo). Isto traduz-se em novas melhorias com pouco esforço de engenharia
  • Temos um leque maior de edições, incluindo uma gratuita
  • Continuamos inovadores, como as recentes histórias de sucesso com o TimeSeries mostram. Existem novos requisitos e somos capazes de os preencher
  • Informix é uma marca dentro do pilar de Information Management da IBM. Recorde-se que de início foi incluído no pilar chamado "DB2". O Informix está actualmente a par do DB2, Cognos, Guardium etc.


... E o que não mudou:



  • Informix ainda é leve, fácil de instalar e gerir
  • Informix ainda é robusto
  • Informix ainda é escalável
  • O suporte Informix ainda é bom (sou suspeito, mas falo muito com clientes que têm de lidar com o suporte de outros vendedores...)
  • Os clientes ainda gostam do Informix
  • As pessoas ainda se queixam do marketing em torno do Informix
  • Continuamos sem ver o Informix nas notícias com frequência
  • O IIUG continua a sem um bem precioso para a comunidade Informix


Acredito que muitas pessoas ao lerem isto, e conhecendo a história do Informix possam considerar que apenas foquei o lado positivo e que existe um lado negro. Pontos que não foram alcançados ou coisas que correm pior desde a aquisição. Mas convém não esquecer que não é totalmente justo comparar o pós aquisição com o pré-aquisição (especialmente durante os "anos dourados"). Uma comparação para ser justa teria de ser feita entre o que se tem passado dentro da IBM com o que se passaria fora da IBM se não tivesse havido a aquisição. Mas isto é pura especulação. Naturalmente todos os apoiantes do Informix pensam que deveria ter mais visibilidade dentro da IBM (ideia recorrente que se percebe nos forums e em blogs e sites externos à IBM), ou que precisamos de mais/melhor marketing. Mas na minha perspectiva o balanço tem sido positivo. E fico expectante pelo 20º aniversário da aquisição. Vamos ver o que acontece nos próximos 10 anos. Há 10 anos atrás penso que muita gente não acreditaria na evolução que o Informix sofreu.