Thursday, July 28, 2016

Informix 12.10.xC7

A description of the new features introduced in Informix fixpack 12.10.xC7 (original version here:

English version
And another fixpack has come out. Informix 12.10.xC7 has been available to customers for around  two weeks. The documentation is available in the Knowledge Center.

The new fixpack will not be known as the greatest ever. The list of features is not long, and more important is highly dedicated to the new features we've been seeing in the latest releases. Things like JSON, Spatial temporal and Timeseries have been the main focus of the enhancements. I'd call this essentially a stability and IoT release. However, not all new features were documented (more on this later). Let's dig into the list:

  • Application development
    • COALESCE function
      This is the only "regular SQL" enhancement. The COALESCE() function accepts an undetermined number of arguments and returns the first non NULL value. It's a sort of glorified NVL(). This is important for compatibility with other vendors, specially considering this would not be possible to implement in a custom function (considering the unknown number and type of the arguments)
  • JSON compatibility
    • Update BSON arrays in an SQL statement
      New MongoDB operators were added to the list of possibilities in the BSON_UPDATE() function: $addToSet, $pop, $pullAll, and $push, plus the array update operator modifiers $each, $position, $slice, and $sort
    • JSON compatibility enhancements
      Several improvements in the JSON handling and MongoDB compatibility:
      • The behavior of the wire listener was changed. Now it send the updates to the database server first. Before the updates were run on the listener
      • We can now use bind variables in SQL statements sent through the wire listener
      • Even if the SQL statements feature is disabled we can activate the execution of procedures and functions. This allows greater control and security without allowing generic SQL execution
      • The transaction command can be used to execute several statements as a single transaction.
      • Compatibility with MongoDB shell version 3.2
      • GridFS functionality (available in the MongoDB drivers) can be used with Informix. This functionality was introduced as a way to sotre files in MongoDB that exceed the 16MB limit of MongoDB objects (note that Informix limit is 2GB).
        This splits the file into smaller chunks and stores the chunks in one collection and the metadata of the file in another collection
      • You can now use the MongoDB aggregation framework pipeline to aggregate time series data or return the time series element in a time range.
    • Load JSON documents with the MQTT protocol
      The MQTT protocol is an ISO lightweight protocol defined to allow sensors and other endpoint devices to send data to repositories or message brokers. Now Informix wire listener can be configured as an MQTT protocol receiver so that data can be sent to the database without further programming
    • Quickly add or remove shard servers with consistent hashing
      A new sharding method, "chash" or consistent hashing allows a member to be added or removed to a sharded object (table or collection) without having to redistribute all the data (only part has to be distributed)
  • Spatiotemporal searching
    • Improved spatiotemporal searching
      There are many improvements in this area. They are very specific and the description requires knowledge of what spatioltemporal data is and how it works. One highlight is the fact that the distance measures now are done in a spherical model and not the old Cartesian one. This was previously done for the spatial datablade and is very important considering the old method would introduce significant errors in the calculations (specially for longer distances and some parts of the globe)
  • Time series
    • Trigger spatiotemporal indexing while loading time series data
      New option allows us to require the indexing of spatiotemporal data when TimeSeries loaded data is written to disk
    • Improved pattern match searching
      TimeSeries pattern matching on BSON documents for numeric data and TimeSeries sub-type
    • Limit future data for rolling window containers
      We can define how many partitions "in the future" can be added. This may avoid that some application or user mistakes delete valid (old) data partitions
    • Enhancements for hertz data
      Removal of some limitations. Hertz (sub-second) data can be inserted after more recent data (out of chronological order), although within a second the order must be respected. And this type of data can now use rolling window containers
    • Longer fragmentation schemes for time series virtual tables
      I have troubles understanding this feature... Apparently the statement for a virtual table creation on top of a timeseries structure could result in an SQL statement that exceeds the maximum size of an SQL statement. So two flags were created to shorten the statement, depending on the scheme used in the base table. What puzzles me is that the SQL statement size was hugely increased in some recent versions
  • Spatial data
    • Convert spatial data to GeoJSON format
      A new function, SE_AsBSON() can be used to convert spatial data into the Geo/JSON format for applications that handle preferably JSON formatted data  
Now... about the non-documented features... Actually this fixpack introduces two important changes that were not (initially at least) documented:
  • The Informix Warehouse Accelerator (the in-memory database add-on that works together with Informix) can now be installed on Linux running on Power8 processors running in Little Endian mode.After several years since it's introduction when we told customers that this component had been designed for Intel processors IBM changes the game. This doesn't mean that what was told to customers was not true... The product really required a special type of instructions called SMD (Single introduction Multiple Data) that were present on Intel processors. Actually these were also present in Power processors, but the programming needed to be adapted to really take advantage of them since the use of these instructions really depends on the data layout in memory. IBM decided to do it now eventually taking advantage that with the Little Endian mode the data layouts will be equal on both platforms. And on the IIUG conference Sandor Szabo made a presentation comparing the product performance in both technologies with a clear advantage for Power. Naturally with anything related to CPUs, we already know it's a leap frog game. Anyway, now customers have a choice for the platform where they'll run the IWA component and this is specially relevant for IBM since it has sold it's x86 line of servers to Lenovo a few years ago.
  • The second feature is "small" but may be very relevant. We introduced the ability to create foreign key constraints with the NOVALIDATE option a few fixpacks ago. Now this was extended to the check constraints. Besides the typical scenario of export/import the other very useful use case for this is when we need to attach a table as a new partition of an existing and already partitioned table. By default Informix will validate that the data in the table validates the expression used for partitioning. This can consume a significant amount of time during the attach, which is clearly undesirable. The workaround was to create a check constraint matching the expression. Informix is smart enough to understand the data is ok, because we have the check constraint. This would consume time, but it could be done prior to the attach during data preparation. Now the constraint can be created with the NOVALIDATE option and that means much faster operations.

Versão Portuguesa
E saiu outro fixpack do Informix, 12.10.xC7. Está disponível para os clientes há cerca de duas semanas. A documentação está acessível no  Knowledge Center.

Este novo fixpack não ficará conhecido como o maior de sempre. A lista de novidades não é longa e mais importante que isso é altamente dedicada às novas áreas que temos visto nas últimas versões. Áreas como JSON, espaço temporal, timeseries têm sido o principal foco das melhorias. Chamar-lhe-ia essencialmente uma versão de estabilidade e dedicada à IoT. Em todo o caso nem todas as novidades foram documentadas (mais sobre isto adiante). Analisemos então a lista:
  • Desenvolvimento de aplicações
    • Função COALESCE
      Esta é a única melhoria do "SQL normal". A função COALESCE() aceita um número indeterminado de argumentos e retorna o primeiro valor não NULO. Como se fosse uma versão glorificada do NVL(). É importante para compatibilidade com outros fornecedores, especialmente porque devido ao número e tipo indeterminado de argumentos, isto não era algo fácil de implementar como uma função desenvolvida pelos utilizadores
  • Compatibilidade JSON
    • Update arrays BSON em instruções SQL
      Novos operadores MongoDB foram adicionados à liste de possibilidades da função BSON_UPDATE(): $addToSet, $pop, $pullAll, e $push, mais os modificadores de operadores  em update array $each, $position, $slice, e $sort
    • Melhorias de compatibilidade JSON
      Várias melhorias na manipulação de JSON e melhor compatibilidade com MongoDB
      • O comportamento do wire listenert foi modificado. Agora envia os updates para a base de dados como primeira opção. Antes os updates eram feitos pelo listener
      • Possibilidade de usar bind variables em instruções SQL enviadas através do wire listener
      • Mesmo que a funcionalidade de envio de SQL esteja desativada é possível ativar a execução de procedimentos e funções. Isto permite maior controlo e segurança por não deixar enviar SQL genérico
      • O comando de transação pode ser usado para executar várias instruções dentro da mesma transação
      • Compatibilidade com a versão 3.2 do MongoDB shell
      • A funcionalidade GridFS (disponível nos drivers MongoDB) pode agora ser usada com Informix. Esta funcionalidade foi introduzida como uma forma de guardar ficheiros no MongoDB que ultrapassassem os 16MB de limite dos objectos em  MongoDB. (note-se que em Informix o limite é de 2GB)
        A funcionalidade parte o ficheiro em pedações mais pequenos e guarda-os numa collection e a metadata sobre os mesmos noutra collection.
      • Possibilidade de utilização da pipeline da framework de agregação do MongoDB para agregar dados TimeSeries ou retornar os elementos TimeSeries num intervalo de tempo
    • Carregar documentos JSON com o protocolo MQTT
      O protocolo MQTT é um protocolo "leve" definido pelo comité ISO para sensores e outros dispositivos terminais, com o objetivo de enviar dados para repositórios de dados ou gestores de mensagens.
      Agora o wire listener do Informix pode ser configurado como um receptor do protocolo MQTT, de forma a que os dados possam ser-lhe enviados sem qualquer programação
    • Adição e remoção rápida de servidores shard com consistent hashing
      Um novo método de sharding, "chash" ou hashing  consistente permite que um membro seja adicionado ou removido a um objeto (tabela ou collection) sem que se tenha de redistribuir todos os dados (apenas uma parte será redistribuída)
  • Pesquisa Spatiotemporal
    • Melhorias na pesquisa spatiotemporal
      Existem muitas novidades nesta área. São muito específicas e a explicação requer um bom entendimento do que são dados spatiotemporal e como funcionam. Um ponto em destaque é o facto de as medidas de distâncias passarem a ser feitas no modelo "esférico" e não no antigo cartesiano. Isto foi introduzido anteriormente no spatial datablade e é muito importante considerando que o método antigo introduzia erros consideráveis nestes cálculos (em particular para distâncias mais longas e certas regiões do globo terrestre)
  • Timeseries
    • Despoletar indexação spatiotemporal durante o carregamento de dados timeseries
      Uma nova opção permite-nos requerer a indexação spatiotemporal enquanto os dados TimeSeries são carregados e escritos em disco
    • Melhoria na pesquisa  pattern match
      TimeSeries "pattern matching" em documentos BSON para dados numéricos e sub-tipo TimeSeries
    • Limite para dados futuros em rolling window containers
      Podemos definir quantas "partições" "no futuro" podem ser adicionadas. Isto pode evitar que alguma aplicação ou utilizador possa, por erro, apagar partições antigas que sejam ainda válidas
    • Melhoria para dados "hertzianos"
      Remoção de algumas limitações. Dados "hertzianos" (sub-segundo) podem ser inseridos após dados mais recentes (fora da ordem cronológica), embora dentro de um mesmo segundo a ordem tenha de ser respeitada. Este tipo de dados pode agora ser também usar rolling window containers
    • Esquemas de fragmentação mais longos para tabelas virtuais sobre timeseries
      Confesso que tenho alguns problemas em entender esta funcionalidade... Aparentemente a instrução para criação de uma tabela virtual sobre uma estrutura timeseries poderia resultar numa instrução que excedesse o limite de tamanho de uma instrução SQL. Para o evitar foram criadas duas flags que permitem encurtar a instrução, dependendo do esquema de fragmentação existente na tabela base. O que me intriga é que o tamanho de uma instrução SQL foi enormemente aumentado em versões recentes, pelo que me parece impensável à partida que pudesse ser atingido
  • Dados Spatial
    • Conversão de dados spatial para formato GeoJSON
      Uma nova função, SE_AsBSON() pode ser usada para converter dados spatial para o formato GeoJSON em aplicações que prefiram lidar com este formato

Agora... sobre as funcionalidades não documentadas.... Na verdade, este fixpack introduz duas mudanças importantes que não foram (inicialmente pelo menos) documentadas:
  • O Informix Warehouse Accelerator (o componente de base de dados em memória que trabalha em conjunto com o Informix) pode agora ser instalado em Linux a correr em processadores Power8 configurados no modo de Little Endian. Após vários anos desde a introdução do produto em que foi dito aos clientes que o mesmo tinha sido desenhado para processadores Intel a IBM decidiu mudar o "jogo". Isto não quer dizer que o que foi dito aos clientes não fosse verdade... O produto realmente necessita um tipo especial de instruções no CPU, chamadas SMD (Single instruction Multiple Data) que existe nos processadores Intel. Mas na verdade os processadores Power também têm o mesmo tipo de instruções, mas a programação tinha de ser alterada / reoptimizada (este tipo de instruções depende da disposição de dados em memória). E a IBM decidiu fazê-lo agora, porventura tirando partido de as diferenças em modo Little Endian serem menores. Na conferência do IIUG o Sandor Szabo efetuou uma apresentação que compreendia uma comparação do produto em ambas as plataformas com vantagem clara para a arquitetura Power. Naturalmente com tudo o que está relacionado com CPUs, todos sabemos que se trata de "saltos de rã", ou seja, uma futura geração de processadores Intel pode reverter estas observações ou minimizar as diferenças.
    De qualquer forma os clientes agora têm duas opções para executar o IWA, sendo isto relevante para a IBM visto que vendeu a sua linha de servidores Intel à Lenovo há uns anos atrás
  • A segunda funcionalidade parece pequena mas é relevante. Introduzimos a possibilidade de criar constraints do tipo chave estrangeira com a opção de NOVALIDATE há uns fixpacks atrás. Agora a opção foi estendida às check constraints. Para além do cenário óbvio de exportação/importação de dados a outra situação em que isto pode ser muito útil é quando queremos adicionar uma tabela como uma nova partição a uma tabela já existente e já particionada. Por omissão o Informix vai validar que os dados existentes na tabela que será o novo fragmento verificam a expressão de particionamento utilizada. Isto pode consumir muito tempo e é feito durante o attach o que é claramente indesejável. A forma de contornar isto seria criar uma check constraint com a mesma condição de particionamento usada na nova partição. O Informix é suficientemente esperto para perceber que se existe uma constraint não tem de voltar a fazer a validação. Ainda assim demorava-se tempo ainda que durante a fase de preparação dos dados. Agora com a possibilidade de criar as check constraints com a cláusula NOVALIDATE poupa-se esse tempo, tornando este tipo de operação muito mais rápido