By default, for SAP applications based on SAP Netweaver, SAP ASE 16.0 will compress the data pages within the tables inside the database. In some scenarios this will not help with performance.
In this brief post I explain the scenario, I correct a SAP note and show you how to check and adjust the tables in a safe way (do not just follow the note, you could corrupt the table data).
Data Page Compression
In ASE 16.0, table data pages can be compressed.
For SAP Netweaver based SAP systems such as SAP ERP, the use of table data page compression can help improve performance in two ways:
Reduced I/O Reading and writing compressed data pages to disk makes it more efficient. Imagine that it’s a bit like copying a 4MB zip file on your computer, instead of an uncompressed 40MB text file! Reduced Memory Consumption In memory (in the data cache), the data pages can be held in compressed form and may not need to be uncompressed in order to satisfy certain queries.
The above sounds good and indeed it is good. But there are some borderline cases where compression on a table may not be beneficial.
The Drawback with Compression
In some cases, compression can affect the response time of queries in very specific circumstances.
If you have “small” tables and those tables are accessed frequently with SQL queries that perform full table scans, then the extra CPU time required to decompress the table contents in the data cache, can impact the response time.
How do We Identify Candidate Tables?
If there are tables which are adversely affected from having compression turned, on, how do we identify those tables?
We can follow SAP note 1775764, which provides a nice simple SQL statement to list likely candidates. Great!
However, the provided SQL statement actually does not do what it should! Oh dear! Instead, the SQL incorrectly lists tables that are definitely not good candidates for decompression. In fact, some of them are the complete opposite of good candidates!
The SQL taken from the SAP note is:
--- DO NOT RUN THIS IT IS WRONG!!! ---
use <SID>
go
select top 10 ObjectName,
LogicalReads
from master..monOpenObjectActivity
where DBID = db_id()
and LogicalReads > 1000000
--> and data_pages(DBID,0)) < 6400 <-- WRONG LINE HERE!
and object_attr(DBName || '.SAPSR3.' || ObjectName,'compression') <> 'none'
order by LogicalReads desc
go
You will see in the above SQL taken from the SAP note, the “data_pages ” function call has 2 parameters, the ID of the current database and an object id. Except the object id on line 9, has been hard coded to “0”.
This causes a value of “0” to be returned from the “data_pages ” call, which is obviously always less than 6400.
Essentially, any table that has compression enabled, with high numbers of LogicalReads (table scans in the data cache), will be reported as a candidate! How confusing.
Correcting the SQL
We can see that we need to correct the SQL. Here’s how:
--- This is the corrected statement ---
use <SID>
go
select top 10 ObjectName,
LogicalReads
from master..monOpenObjectActivity
where DBID = db_id()
and LogicalReads > 1000000
and data_pages(DBID,ObjectID)) < 6400
and object_attr(DBName || '.SAPSR3.' || ObjectName,'compression') <> 'none'
order by LogicalReads desc
go
It’s simple enough, we just substitute the incorrect “0” on line 9, with the column “ObjectID ” from the monOpenObjectActivity table we are selecting from. This correction then allows the correct output from the call to function “data_pages “. With the correction in place, tables with a data page count of less than 6400 pages (using 16KB pages, means tables less than 100MB in size), with compression enabled and a high number of LogicalReads, will be listed as candidates. Yay!
Adjusting the Candidate Tables
Once you have your table list, you might now wish to turn off compression. This is simple enough. You can use the additional SQL supplied in the SAP note:
--- WARNING: check SAP note 2614712 first! ---
use <SAPSID>
go
setuser 'SAPSR3'
set quoted_identifier on
set chained on
go
alter table SAPSR3.<tablename> set compression = none
reorg rebuild SAPSR3.<tablename> [with online] <-- check 2614712 first!
commit
go
As you can see, you will need to perform a REORG on the table. The SQL statement specifies the optional “with online ” option.BE WARNED : There are lots of SAP notes about issues with REORG ONLINE, please ensure that you check SAP note 2614712 first! Shame on SAP for not mentioning this in the SAP note!
Checking the Result
We’ve gone through the effort of adjusting tables we think that might benefit from no-compression, but how do we now confirm that we have positively impacted the response time?
Well that’s a difficult one. I’ll leave that for another post.
Summary
The summary for this post, is a little bit “Boris Johnson”:
Follow the SAP notes. But don’t follow the SAP notes. Check and double check what is output from commands, don’t just take the output as being correct! Check your results. Compressing tables is a good thing. Compressing specific tables may not be a good thing.