Re: [HACKERS] Custom compression methods
Dilip Kumar <dilipbalaut@gmail.com>
Attachments
- v37-0001-Get-datum-from-tuple-which-doesn-t-contain-exter.patch (text/x-patch) patch v37-0001
- v37-0003-Built-in-compression-method.patch (text/x-patch) patch v37-0003
- v37-0004-Add-default_toast_compression-GUC.patch (text/x-patch) patch v37-0004
- v37-0005-Alter-table-set-compression.patch (text/x-patch) patch v37-0005
- v37-0002-Expand-the-external-data-before-forming-the-tupl.patch (text/x-patch) patch v37-0002
- v37-0006-default-to-with-lz4.patch (text/x-patch) patch v37-0006
On Thu, Mar 18, 2021 at 1:32 AM Robert Haas <robertmhaas@gmail.com> wrote: > > ).On Mon, Mar 15, 2021 at 6:58 PM Andres Freund <andres@anarazel.de> wrote: > > - Adding all these indirect function calls via toast_compression[] just > > for all of two builtin methods isn't fun either. > > Yeah, it feels like this has too many layers of indirection now. Like, > toast_decompress_datum() first gets TOAST_COMPRESS_METHOD(attr). Then > it calls CompressionIdToMethod to convert one constant (like > TOAST_PGLZ_COMPRESSION_ID) to another constant with a slightly > different name (like TOAST_PGLZ_COMPRESSION). Then it calls > GetCompressionRoutines() to get hold of the function pointers. Then it > does an indirect functional call. That seemed like a pretty reasonable > idea when we were trying to support arbitrary compression AMs without > overly privileging the stuff that was built into core, but if we're > just doing stuff that's built into core, then we could just switch > (TOAST_COMPRESS_METHOD(attr)) and call the correct function. In fact, > we could even move the stuff from toast_compression.c into detoast.c, > which would allow the compiler to optimize better (e.g. by inlining, > if it wants). > > The same applies to toast_decompress_datum_slice(). Changed this, but I have still kept the functions in toast_compression.c. I think keeping compression related functionality in a separate file looks much cleaner. Please have a look and let me know that whether you still feel we should move it ti detoast.c. If the reason is that we can inline, then I feel we are already paying cost of compression/decompression and compare to that in lining a function will not make much difference. > There's a similar issue in toast_get_compression_method() and the only > caller, pg_column_compression(). Here the multiple mapping layers and > the indirect function call are split across those two functions rather > than all in the same one, but here again one could presumably find a > place to just switch on TOAST_COMPRESS_METHOD(attr) or > VARATT_EXTERNAL_GET_COMPRESSION(attr) and return "pglz" or "lz4" > directly. I have simplified that, only one level of function call from pg_column_compression, I have kept a toast_get_compression_id function because in later patch 0005, we will be using that for getting the compression id from the compressed data. > In toast_compress_datum(), I think we could have a switch that invokes > the appropriate compressor based on cmethod and sets a variable to the > value to be passed as the final argument of > TOAST_COMPRESS_SET_SIZE_AND_METHOD(). Done > Likewise, I suppose CompressionNameToMethod could at least be > simplified to use constant strings rather than stuff like > toast_compression[TOAST_PGLZ_COMPRESSION_ID].cmname. Done Other changes: - As suggested by Andres, remove compression method comparision from eualTupleDesc, because it is not required now. - I found one problem in existing patch, the problem was in detoast_attr_slice, if externally stored data is compressed then we compute max possible compressed size to fetch based on the slice length, for that we were using pglz_maximum_compressed_size, which is not correct for lz4. For lz4, I think we need to fetch the complete compressed data. We might think that for lz4 we might compute lie Min(LZ4_compressBound(slicelength, total_compressed_size); But IMHO, we can not do that and the reason is same that why we should not use PGLZ_MAX_OUTPUT for pglz (explained in the comment atop pglz_maximum_compressed_size). -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com
Commits
-
docs: Update TOAST storage docs for configurable compression.
- e8c435a824e1 14.0 landed
-
Further tweaking of pg_dump's handling of default_toast_compression.
- 54bb91c30e39 14.0 landed
-
Fix interaction of TOAST compression with expression indexes.
- 5db1fd7823a1 14.0 landed
-
Tidy up more loose ends related to configurable TOAST compression.
- e5595de03ec6 14.0 landed
-
Short-circuit slice requests that are for more than the object's size.
- 063dd37ebc76 14.0 landed
-
Mostly-cosmetic adjustments of TOAST-related macros.
- aeb1631ed207 14.0 landed
-
Remove useless configure probe for <lz4/lz4.h>.
- 2c75f8a612b2 14.0 landed
-
Error on invalid TOAST compression in CREATE or ALTER TABLE.
- a4d5284a10b5 14.0 landed
-
docs: Fix omissions related to configurable TOAST compression.
- 24f0e395ac58 14.0 landed
-
More code cleanup for configurable TOAST compression.
- 226e2be3876d 14.0 landed
-
Bring configure support for LZ4 up to snuff.
- 4d399a6fbeb7 14.0 landed
-
Make compression.sql regression test independent of default.
- fd1ac9a54896 14.0 landed
-
Use valid compression method in brin_form_tuple
- 882b2cdc08c4 14.0 landed
-
Fix up pg_dump's handling of per-attribute compression options.
- aa25d1089ac0 14.0 landed
-
Allow configurable LZ4 TOAST compression.
- bbe0a81db69b 14.0 landed
-
Fix inconsistencies in the code
- 6b8548964bcc 13.0 cited
-
Mostly-cosmetic improvements in memory chunk header alignment coding.
- f65d21b25808 11.0 cited
-
Allow numeric to use a more compact, 2-byte header in many cases.
- 145343534c15 9.1.0 cited