| Subcribe via RSS

DB2 Data compression

September 17th, 2009 | No Comments | Posted in IBM DB2 |

Disk storage is not cheaper, take place, make noise, so, for large warehouses (or huge volumes database), the cost of the storage become important. IBM DB2 have a solution, with the data compression named “Venom” technology, reducing storage requirements, improving I/O, and providing quicker data access from the disk.

DB2 uses a dictionary based algorithm for compressing data records. DB2 9 will scan tables, and search for duplicate occurrences, then assign a short numeric key to each entries. You will understand better with a picture:

Compress data

Compress data

Each new occurences of “Sophie”, “New York”, “IBM US”, will be respectively assign to “(01)”, “(19)” and “(09)”. This is very useful on large table. Each time a new row is added to the table, DB2 will automatically compress these new data.

Seems to be good, let’s try on our DB2 now. To enable the compression,  we should turn on the “COMPRESS” option on the table.

CREATE TABLE Users COMPRESS YES

or use alter if the table is already created:

ALTER TABLE Users COMPRESS YES

Typically, we can save an average ratio of 45 to 75 percent of our storage space. Next time, we’ll see how to use the inspect tool, to determine the compression ratio.

Tags: ,

Customize your DB2 CLP prompt

September 3rd, 2009 | 3 Comments | Posted in IBM DB2 |

You have a nice DB2 CLP prompt, looks like “db2>”, but you want more, you want a efficient prompt. It is possible with DB2 to add or modify your CLP ! DB2 have a registry variable named DB2_CLPPROMPT which allows us to define the prompt to be used in the CLP interactive mode.

To define this variable, let’s use the DB2set command:

Db2set DB2_CLPPROMPT="db2isgreat> "

Our new DB2 Prompt will be “db2isgreat> “. It’s much more better, but we can do more. DB2_CLPPROMPT registry variable can contain the tokens %n, %ia, %d, %da and %i:

  • %n – New line
  • %ia – Authorization ID of the current instance attachment
  • %d – Local alias of the currently connected database
  • %da – Authorization ID of the current database connection
  • %i – Local alias of the currently attached instance

Now, let’s try with these tokens:

Db2set DB2_CLPPROMPT="%ia@%i, %da@%d> "

With an instance attachment to instance “DB2″ with authorization ID “mycado”. Database “sample” with authorization ID “mycadoax”, will return something like:

MYCADO@DB2, MYCADOAX@SAMPLE >

You can now everytime where you are, and one which instance/database you’re working on.

Tags: , , ,

Terminology mapping between Oracle and DB2

August 28th, 2009 | 2 Comments | Posted in IBM DB2 |

For people wants move from Oracle to DB2, this a little terminology mapping:

Oracle DB2
Instance Instance
Redo logs Logs files
Statement cache Package cache
Datafiles DMS containers
Data cache Buffer pools
Data dictionary System catalog
Datafiles Containers
Segments Objects
Data blocks Pages
Database Link Federated System

And also, some useful mapping between Oracle and DB2 products:

Oracle DB2
Oracle EE DB2 Entreprise
Oracle Gateway DB2 Connect
SQL *PLUS DB2 CLP / DB2 CLP PLUS
PL/SQL SQL Procedural Language

You should also take care of the “package” term. For Oracle it’s a logical grouping of PL/SQL blocks that can be invoked by other PL/SQL applications, and for DB2 it’s a precompiled access plan for an embedded static SQL application stored in the server.

Tags: , ,

Queries on XML data with XQuery

August 26th, 2009 | No Comments | Posted in IBM DB2 |

We know how to store native XML data in our DB2 tables, and now we will see how we can access to these data. We can choose between standard SQL queries and XQuery.. or both ! The first solution, with a SQL query, only query at the column level of your table; this query will return the full XML data. The second solution, with XQuery, allow us to make a “query” inside our XML data.

For the SQL query, nothing more than a SELECT:

SELECT id, info from client

Easy, but not really powerful for XML data, let’s try with XQuery, who give us two functions for DB2. db2-fn:sqlquery and db2-fn:xmlcolumn. The first function retrieves a sequence that is the result of an SQL fullselect and the second retrieves a sequence from a column. One important thing you should keep in mind, SQL is not a case-sensitive language alors que XQuery is a case-sensitive language.

An example which return all the XML data from the “info” column:

XQUERY db2-fnxmlcolumn ('CLIENT.INFO')

Which is same as this SQL query:

SELECT info FROM client

Let’s see something more nice. This query will return all the elements in <name> , inside the “info” column, and with the <city> element which containt “Paris”:

XQUERY declare defaut element namespace "http://posample.org";
for $d in db2-fn:xmlcolumn('CLIENT.INFO')/clientinfo
  where $d/addr/city="Paris"
return <out>{$d/name}</out>

db2-fn:xmlcolumn retrieves the data from the “info” column in the “client” table. We add a $d variable, for each element of <clientinfo>, and we use a where to filter the <city> element which should be “Paris. To finish, we use <out> to output the data:

<out xmlns="http://posample.org">
  <name>Sophie Bool</name>
</out>

To finish, the same example with a SQL query inside the XQuery:

XQUERY declare default element namespace "http://posample.org";
for $d in db2-fn:sqlquery('SELECT info FROM client')/clientinfo
  where $d/addr/city="Paris
return <out>{$d/name}</out>

Enough for today, we will see next time how to do more complex and more powerful query with XQuery !

Tags: , , ,

Store native XML in a DB2 table

August 23rd, 2009 | 1 Comment | Posted in IBM DB2 |

IBM DB2 is the first RDBMS to provide a native XML facility, in a table. You will be able to insert in a column, some XML data. It will be easier to make direct requests to these data with XQuery.

So, it’s funny, but why it’s interesting to do that ? Because XML data are hierarchic (instead of relational data which are flat) and data self-describing through XML tags. XML also allows a better flexibility for data structures required to change very often. In the other hand, access time performances will be a little slower, we lose the integrity constraints, and OLAP queries will be more difficult. The important question is “Which flexibility-performance ratio do you need ?”.

Let’s start now with the creation of a database, which should be encoded with UTF-8, to store XML. For that, we use the CREATE DATABASE command:

CREATE DATABASE xmldb USING CODESET UTF-8 TERRITORY US

We have our table, now we should create the “client” table, with an “info” column who contain client information, in XML format:

CONNECT TO xmldb
CREATE TABLE client (id INT, info XML)

Let’s try to insert a new client with a SQL query:

INSERT INTO client (id, info) VALUES (1, '<clientinfo xmlns="http://posample.org" Cid="1"><name>Sophie Bool</name><addr country="France"><street>5 rue du chateau de stable</street><city>Paris</city></addr><phone type="work">01 72 92 02 88</phone></clientinfo>')

The first thing you will told me is this query is a normal SQL query, and this is right, insert XML isn’t more difficult. The second thing is about the XML, here we have a short XML data, but if we have more, it will be very difficult to use. This why, we will use XQuery to manipulate these data or use a XDS import. I’ll come back soon on these points.

Tags: , ,