Prevodnik

Elekt Labs s.r.o.

Sofistikovaná řešení pro běžný den.

MASA

Firebird SQL improvement: Elekt Labs RLE for record compression

Autor: Ing. Slavomír Skopalík
Date: 7.5.2015

Abstract

Reducing DB size and improving performance of Firebird SQL 3.0 series by replacing outdated record fragment compression by better one.

Motivation

When I change character set from WIN1250 to UTF-8, DB size was increase from ~75GB to ~90GB. Database performance was slightly reduced.

The problem

During analysis I found, that current schema can handle one block up to 128 bytes. This is effective if you have unpacked record size less then ~1kB. For larger records length you will receive huge overhead. For example 32000 bytes of zeros (null VARCHAR) is packed as 500 bytes. If this block is incompressible, size will increase by 250 bytes.

UTF-8

The UTF-8 character set is great common standard the minimize size of data. But in the worst case, one character occupied 4 bytes. FB calculate with the worst situation and allocate for each character 4 bytes in record buffer.

For example, VARCHAR(2000) in character set WIN1250 will occupied 2002 bytes, but for UTF-8 will occupied 80002 bytes.

8000 bytes in current IT is really small block, but if you have 100M of this blocks, the situation is really different.

To handle record buffer like this one, I was prepare much more effective compression schema that focus to effective compress of zeros.

Elekt Labs RLE

Elekt Labs RLE is designed to handle three different blocks (zeros, repeated same byte, uncompressed block) in three different lengths (1 byte header, 2 bytes header and 3 bytes header) that can handle record buffer up to 1MB.

Write performance gain come from less IO, compression encoding has similar complexity.

Read gain multiplying two separate gains. The first one, because much more dense data on data page, about 30% in our databases is saved. This causes much more hits into all caches (Firebird internal, OS, disk controller) as you can see in SELECT COUNT(*) second pass duration. The second gain is coming from using well implemented memory move and memory set functions in c/c++. This function works much more better on large size then on small sizes (SSE instructions is used).

Performance results

We create tests, that are focused to compare WIN1250 and UTF-8.

We create database and in this database one table:

CREATE TABLE a(

a VARCHAR(8000)

)

once for character set NONE, once for character set WIN1250 and once for UTF-8.

We run this test under version 2.5.4, official 3.0 beta1 and our private build from SVN revision 61366.

Insertion of 100M of NULL values decrease from 1:51:29 to 32:21 (~3.5 faster). This speed up is because much more dense data (more records on data page, nothing else).

Database size was reduced from ~52GB to 5GB

SELECT COUNT(*) from inserted table decrease from 11:48 to 0:48 (~14.7 faster).

Restore of real database backup decrease 10:21:18 to 9:49:45, just save 32 minutes.

DB size was reduced from ~88GB to ~61GB

SELECT COUNT(*) decrease from 8.28s to 1.88 (~4.4 faster)

Full set of graphs you can see in gallery. As you can see, Elekt Labs RLE is always faster and produce smaller DB size.

The fail

I'm programmer, may be one of good one, but I'm new in Open Sources cooperation. I have promise, that new RLE (if I will prepare quickly) will be included in Firebird 3.

When I finished my work including test script, I was revived this (15.3.2015):

First of all, your code does not compile on my box. There should be no UINT32 / MAXINT32 there, Firebird native typedefs SLONG/MAX_SLONG should be used.

Second, please favor our coding style:

http://www.firebirdsql.org/en/coding-style/

Code without separating spaces like "if(size==1)" or "cc2=(nc>>5)&0x7F" is unreadable and thus unacceptable.

Also, I feel a "break" missing here:

case RLE_cmp:

RLE_WriteCmp(n, space_n, 0, np);

RLE_WriteCmp(nr, space_nr, 0, np);

<------ BUG HERE?

default:

BUGCHECK(178); // msg 178 record length inconsistent

break;

Finally, after fixing everything compilation hangs on GCC at the lang_helpers rule. AFAIU, this new encoding is not backward compatible, so older databases (already created during the build) cannot be processed. If so, this may be OK for v4 but not for v3.

I believe for v3 we'll have to try your simpler RLE modification, the one which is backward compatible.

Dmitry

Our way

We were fork Firebird project and when we build our version for us and our customer. 30% of DB size and speed gain between few % to 10x is really important.

We will publish our fork for free. Enjoy it!

If some one will interesting, we can back port this feature to FB 2.5.x series (it is faster and stable).

Feel free to contact us.

This is not the final, this is the beginning

We were analyze internal FB and we can prepare better compression/encoding that I currently presents, but this change will be more invasive to Firebird source code.

Switch from record fragment compression to real record buffer compression. This will produce slightly better compression, but faster and simpler code. Also, it is enable much more possibilities in record compression.

Use value encoding instead RLE. This will reduce data by understanding of data (integer stored in float point will be stored as integer...)

Use LZ4 over encoding or RLE. LZ4 is one of the fastest dictionary based compression that can fully utilize yours hard drives (compression over 480MB/s).

BLOB compression, mainly useful for text blobs

Download

FirebirdWin64_ElektLabs.zip - Sources and all necessary binaries for Windows x64(SVN revision 61366)

Aktuality


15.2.2013

Na webovém portálu www.blaja.cz vyšel článek Automatizace mezioperační kontroly kvality. Článek se zabývá automatizací mezioperační kontroly kvality v Ball Aerocan CZ s.r.o., zejména se zaměřením na sběr dat z měřících přístrojů s rozhraním Digimatic.


8.2.2013

Uvolněna nová aplikace ELFoxSound, která umožňuje číst data z plc Tecomat Foxtrot a poté je přehrát přes standardní zvukovou kartu pomocí řečového syntezátoru Epos.


3.9.2012

Zveme Vás na seminář Perspektivy automatizace II, kterého se zúčastníme s přednáškou Automatizace mezioperační kontroly kvality. Přednášet bude Ing. Slavomír Skopalík. Seminář se bude konat 12. září 2012 jako součást doprovodného programu 54. mezinárodního strojírenského veletrhu na Výstavišti v Brně. Naše přednáška bude začínat v 11:00 na Výstavišti v Brně v pavilonu P, sále P-1.


28.2.2010

Nový ceník produktů a služeb.


28.12.2009

Uvolněna aplikace S7Backup pro zálohování obsahu databloku z PLC Siemens S7-200, S7-300/400, S7-1200 přes ethernetové rozhraní.

  • Protokol ISO over TCP - S7 communication
  • Záloha dat do txt souboru
  • Aplikace je distribuována volně pro komerční i nekomerční použití


3.8.2009

Aktualizována ukázka online monitování linek přes WWW rozhraní.


4.7.2009

Uvolněna verze 1.0.2 programu MailAgent.


17.6.2009

V sekci ukázky je nová ukázka možností systému MASA.


4.5.2009

Elekt Labs s.r.o. se stala systémovým partnerem firmy ELKO EP, s.r.o. v oblasti nasazování systému INELS.


4.5.2009

Byla dokončena instalace systému MASA na Linku č.5 ve firmě Moravia cans a.s..


21.11.2007

Firma se zúčastnila semináře Řízení strojírenských podniků pořádaného VŠB TU Ostrava s přednáškou Zavedení mezioperační kontroly bez instalace PC.


1.11.2007

Firma se zúčastnila konference Firebird Developers' Day 2007 s přednáškou na téma Základy instalace a optimalizace. Přidáno do sekce Ke stažení.


10.11.2006

Firma se zúčastnila konference Databázový svět 2006 s přednáškou Náklady na vývoj databázových řešení. Konference proběhla 30.11.2006 ve Zlíně. Více informací naleznete na http://www.dbsvet.cz/, nebo http://www.cvis.cz/.


29.9.2006

Firma se bude účastnit 7.odborného semináře s mezinárodní účastí ŘÍZENÍ STROJÍRENSKÝCH PODNIKŮ , který pořádá Vysoká škola Báňská v Ostravě. Seminář se koná dne 17.-18.10.2006. Naše firma zde vystoupí s přednáškou na téma Využití sběru dat pro hodnocení pracovníku. Součástí této přednášky bude i vystoupení zástupce firmy Cebalsol s.r.o.


20.4.2006

Přednášky z konferencí Mezinárodní konference při příležitosti založení Fakulty strojní a Bělohrad 2006 přidány do sekce ke stažení.