Techniques for configuring your Progress
OpenEdge Database in order to minimize
IO operations.
• Tom Bascom, Roaming DBA & Progress User since 1987
• President, DBAppraise, LLC
– Remote Database Management Service.
– Simplifying the job of Managing and Monitoring The
World’s Best Business Applications.
– tom@dbappraise.com
• VP, White Star Software, LLC
– Expert Consulting Services related to all aspects of
Progress and OpenEdge.
– tom@wss.com
• The trade press thinks we mean BIG DISKS.
• Bean counters think we mean using the cheapest possible disks.
• SAN vendors think that we mean whatever it is that will get them the biggest commission.
• Programmers think we mean that they can store
even more “stuff”. Without a care in the world.
• DBA’s seek the best possible reliability and performance at a reasonable cost.
• SANs
• Servers
• Operating Systems
• RAID Levels
• … and so forth.
• Avoid unnecessary IO.
• Only read the blocks that you need to read.
• Make every IO operation count
• Perform IO in the optimal order.
• Cluster Sizes of 0 or 1 are Type 1 Areas.
– The Schema Area is always a Type 1 Area.
– It would be nice if a Cluster Size of 1 was a Type 2 Area.
• Type 2 Areas have Cluster Sizes of 8, 64 or 512.
• Data Blocks in Type 2 Areas contain data from just one table.
A
C
E
A
G
H
A
F
C
D
H
A
Type 1 Mixed Area
C
D
A
B
T1 Dedicated Area
Z
Z
Z
Z
Z
Z
Z
Z
Z Z
Z Z
Z Z
Z Z
A
A
A
A
B
B
B
B
B
B
B
B
Type 2 Area
A
A
A
A
Type 2 Area
C
C
C C
C C
C
C
C
C
C C
C C
C
C
F F
F F
F F
F F
Y Y
Y Y
Y Y
Y Y
• Type 2 Storage Areas are the foundation for all advanced features of the OpenEdge database.
– New features will almost always require that Type 2 areas be in use in order to be leveraged.
• 10.2B is expected to support a new feature called
“Alternate Buffer Pool”.
• This can be used to isolate specified database objects (tables and/or indexes).
• The alternate buffer pool has its own distinct –B.
• If the database objects are smaller than –B there is no need for the LRU algorithm.
• This can result in major performance improvements for small, but very active, tables.
• Because Type 2 Storage Areas are “asocial”:
– Data in the block is from a single table.
– Locality of Reference is leveraged more strongly.
– Table oriented utilities, such as index rebuild, binary dump and so forth know which blocks they need to read and which blocks they do not need to read.
– DB features, such as the SQL-92 fast table scan and fast table drop can operate much more effectively.
• … for large tables – very small, yet active tables can dominate an application’s IO.
• Case Study: A system with 30,000 record reads/sec.
– The bulk of the reads were from one 10,000 record table.
– That table was in a Type 1 area and its records were widely scattered.
– Big B was set to 10,000 and RAM was tight.
– Moving the table to a Type 2 Area patched the problem.
Only 10% of –B was now needed for this table.
• Do NOT assign tables to areas based on
“function”.
• Create distinct storage areas for:
– Each very large table
– Each very active table
– Indexes vs Data
– Tables with common Rows Per Block settings
• Large Blocks reduce IO, fewer operations are needed to move the same amount of data.
• More data can be packed into the same space because there is proportionally less overhead.
• Because a large block can contain more data it has improved odds of being a cache “hit”.
• Large blocks enable HW features to be leveraged. Especially SAN HW.
• Use the largest Rows Per Block that:
– Fills the block!
– But does not unnecessarily fragment it.
• Rough Guideline:
– Next power of 2 after BlockSize / (AvgRecSize + 20)
– Example: 8192 / (90 + 20) = 74, next power of 2 = 128
– Range is powers of 2 from 1 to 256.
• Caveat: there are far more complex rules that can be used and a great deal depends on the application’s record creation & update behavior.
8
8
8
8
8
BlkSz
1
4
4
4
4
RPB
4
4
8
16
32
4
16
32
64
128
Blocks
3,015
2,500
1,250
627
596
2,500
625
313
286
285
Disk (KB) Waste/Blk %Used Actual RPB
3,015 124 86% 3
10,000
5,000
2,508
2,384
20,000
5,000
2,504
2,288
2,280
2,965
2,075
295
112
7,060
4,383
806
114
109
23%
46%
92%
97%
11%
45%
90%
98%
98%
4
8
16
17
4
16
32
35
35
Table is a 10,000 record simulation based on real table data with average row size of 220.
• Caveats:
– Blocks have overhead which varies by storage area type, block size, Progress version and by tweaking the create and toss limits.
– Not all data behaves the same:
• Records which are created small and which grow frequently may tend to fragment if RPB is too high.
• Record size distribution is not always Gaussian
• Free space needed in a block for:
– Allow creation of new records if more.
• Type 2 default = 150.
– Toss (remove) from RM Chain if less.
• Type 2 default = 300.
– Changed significantly between V9 and OE10.
– Change with PROUTIL
• Can be set either per area, or per object
Symptom
Fragmentation occurs on updates to existing records.
You anticipated one fragment, but two were created.
Fragmentation occurs on updates to existing records or you have many (thousands, not hundreds) blocks on the RM chain with insufficient space to create new records.
There is limited fragmentation, but database block space is being used inefficiently, and records are not expected to grow beyond their original size.
There is limited fragmentation, but database block space is being used inefficiently, and records are not expected to grow beyond their original size.
Action
Increase
Create Limit
Increase
Toss Limit
Decrease
Create Limit
Decrease
Toss Limit
• There is no advantage to having a cluster more than twice the size of the table.
• Except that you need a cluster size of at least 8 to be Type 2.
• Indexes are usually smaller than data and there may be dramatic differences in index size.
$ proutil dbname –C dbanalys > dbname.dba
…
RECORD BLOCK SUMMARY FOR AREA "APP_FLAGS_Dat" : 95
-------------------------------------------------------
Record Size (B) -FragmentsScatter
Table Records Size Min Max Mean Count Factor Factor
PUB.APP_FLAGS 1676180 47.9M
28 58 29 1676190 1.0 1.9
…
INDEX BLOCK SUMMARY FOR AREA "APP_FLAGS_Idx" : 96
-------------------------------------------------------
Table Index Fields Levels Blocks Size %Util Factor
PUB.APP_FLAGS
AppNo
FaxDateTime
FaxUserNotified
183 1 3 4764
184 2 2
185 2 2
45
86
37.1M 99.9 1.0
259.8K 72.4 1.6
450.1K 65.6 1.7
Layer Time # of
Recs
# of Ops Cost per
Op
0.96
100,000 203,473 0.000005
Progress to –B
-B to FS Cache
FS Cache to SAN
10.24
100,000 26,711 0.000383
5.93
100,000 26,711 0.000222
-B to SAN Cache* 11.17
100,000 26,711 0.000605
SAN Cache to Disk 200.35 100,000 26,711 0.007500
-B to Disk 211.52 100,000 26,711 0.007919
Relative
1
75
45
120
1500
1585
* Used concurrent IO to eliminate FS cache
• Use big blocks
– DB Blocks size should be at least equal to OS block size.
– Bigger is good – Especially for read-heavy workloads, it leverages read-ahead capabilities of
HW.
• Pack the data densely.
– Set Rows Per Block (RPB) high.
– But not so dense as to fragment records.
Perform IO in the Optimal Order
4k DB Block Table
Table1
Index idx1 idx2* idx3
%Sequential %Idx Used Density
69%
98%
74%
99%
1%
0%
0.51
0.51
0.51
8k DB Block Table
Table1
Index idx1 idx2* idx3
%Sequential %Idx Used Density
85% 99% 1.00
100%
83%
1%
0%
1.00
0.99
Block Size Hit Ratio %Sequential Block References
4k
4k
95
98
69
69
319,719
320,149
4k
8k
8k
8k
99
95
98
99
69
85
85
85
320,350
160,026
159,805
160,008
IO Ops
19,208
9,816
6,416
9,417
4,746
3,192
Time
120
60
40
55
30
20
The process was improved from an initial runtime of roughly 2 hours
(top line, in red) to approximately 20 minutes (bottom) by moving from
4k blocks and 69% sequential access at a hit ratio of approximately 95% to 8k blocks, 85% sequential access and a hit ratio of 99%.
• While these are general best practices that should be thought of as a baseline it is certainly possible that testing will reveal advantages to different approaches.
• Optimizing Storage requires substantial testing of many different variations.
• Methods which work with one particular combination of application, database, hardware and Progress release may very well change dramatically as the underlying components change.
• White Star Software has a great deal of experience in optimizing storage. We would be happy to engage with any customer that would like our help!