Re: Tables with VARCHAR

Charles Wilt <[email protected]>
Newsgroups gmane.comp.lang.as400.c
Message-ID <CAJ=Tnc77WtQ4rMu1wd1TCAMRdqub5oMZN1XbbV6DiHEDTc-Vyg@mail.gmail.com>
IBM recommends allocate large enough to handle 90-95% of the data
https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzajq/vardatatypes.htm

I believe that one 26 byte pointer is include for every record, regardless
of how many VARxxx/LOBxxx objects are present.  This is inferred from the
MAX ROW SIZE documentation, "The maximum row buffer size is 32766 or, if a
VARCHAR, VARGRAPHIC, VARBINARY, LOB, or XML column is specified, 32740."

Yes, VARCHAR2(80) will always be full size in the record buffer presented
to your program.

Charles



On Thu, Apr 5, 2018 at 3:04 AM, Jevgeni Astanovski <[email protected]>
wrote:

> Thanks, Jon and Charles.
>
> Suspected that there is no simple answer and I need to make content
> analysis.
> So first of all I've identified the 3 fields as potential candidates for
> switching to VARCHAR.
> They are of 80, 255 and 140 length.
> Then I applied a query that Charles advised to smaller pieces of data -
> just one month instead of 12 years.
> Selected 2 one-month chunks, in the beginning and in the end of the period,
> as data usage could change also.
> Got numbers, sorted them and now I can easily find, that, for example for
> CHAR(80) field, in 99% of records actual field length is 30 or less. This
> should make sense to switch to VARCHAR2(80) ALLOCATE(30) I suppose?
> By the way - are there any "rules of thumb" for this %? Should it be 80% or
> 99% for example?
>
> I thought that I've indicated it in my question, however probably forgot -
> to write that I'm using record-level access (_Rreadx) functions.
> Do I understand correctly that for these functions ALLOCATE number has no
> effect? I mean that if record has one field VARCHAR2(80), its size will be
> ALWAYS 82 bytes in the returned buffer?
>
> And I have not fully understood if this 16-bytes pointer to "overflow" area
> is allocated to every record or only to those, where this "overflow"
> happened in reality...
> Will now make some experiments with the information obtained.
>
> Thanks again,
> J.A.
>
>
>
>
> On Wed, Apr 4, 2018 at 7:12 PM, Charles Wilt <[email protected]>
> wrote:
>
> > Yep...it depends...
> >
> > what's "pretty large char fields"?  The entire record is only 650
> > bytes...so they can't be all that large to my way of thinking..
> >
> > What's "almost empty"?
> >
> > run a
> > select length(trim(MYFLD)), count(*) as cnt
> > from myfile
> > group by  length(trim(MYFLD))
> > order by 2 desc
> >
> > If the field is CHAR(100) and most of the records have 20 chars or
> less...
> >
> > Then you might be better off with VARCHAR(100) ALLOCATE (20)
> >
> > That'd save 78 bytes for every record with less than 20 chars.
> >
> > However, one additional point to consider.  Are you using SQL or record
> > level access (RLA)?
> >
> > With RLA, the system will do two disk I/Os for every record with more
> than
> > 20 chars.  With SQL, those 2 I/Os will only be done if you ask for MYFLD
> to
> > be returned.
> >
> > (Thus the reason ALLOCATE(0) is not recommended, unless most records are
> > empty)
> >
> > Charles
> >
> >
> > On Wed, Apr 4, 2018 at 8:30 AM, Jon Paris <[email protected]>
> > wrote:
> >
> > > As is often the case - it depends.
> > >
> > > When you define a field as Varchar you can specify both a "normal"
> length
> > > and a maximum length.  Only the "normal" part is held with the main
> > record
> > > and therefore if most of your records are within that length then the
> > file
> > > size will reduce.
> > >
> > > There is however an overhead for linking to the extended space - can't
> > > recall how long it is 20 bytes is ringing a faint bell.  This topic has
> > > been discussed in the past on the Midrange list - I'd check it for you
> > but
> > > have to run out.
> > >
> > >
> > > Jon Paris
> > >
> > > www.partner400.com
> > > www.SystemiDeveloper.com
> > >
> > > > On Apr 4, 2018, at 10:05 AM, Jevgeni Astanovski <
> [email protected]>
> > > wrote:
> > > >
> > > > Hi,
> > > > Does anyone here know if switching from CHAR to VARCHAR gives any
> > > positive
> > > > effect in terms of table size?
> > > > Explain the situation briefly.
> > > > I've got an application written on ILE/C that works with rather big
> > table
> > > > (historical data since 1996). Currently the table size is 260M
> records
> > > and
> > > > PF size 170GB.
> > > > The record size is app. 650 bytes and it has some pretty large char
> > > fields,
> > > > that can be either empty or almost empty :-)
> > > >
> > > > Technically I can make a new table with VARCHARs and rewrite my
> program
> > > to
> > > > use VARCHAR instead of CHAR, but shall it reduce the table size?
> > > >
> > > > Somehow I suspect that it will only increase the table...
> > > >
> > > > TIA and regards,
> > > > Jevgeni.
> > > > --
> > > > This is the Bare Metal Programming IBM i (AS/400 and iSeries)
> (C400-L)
> > > mailing list
> > > > To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
> > > > To subscribe, unsubscribe, or change list options,
> > > > visit: https://lists.midrange.com/mailman/listinfo/c400-l
> > > > or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
> > > > Before posting, please take a moment to review the archives
> > > > at https://archive.midrange.com/c400-l.
> > > >
> > >
> > > --
> > > This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L)
> > > mailing list
> > > To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
> > > To subscribe, unsubscribe, or change list options,
> > > visit: https://lists.midrange.com/mailman/listinfo/c400-l
> > > or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
> > > Before posting, please take a moment to review the archives
> > > at https://archive.midrange.com/c400-l.
> > >
> > >
> > --
> > This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L)
> > mailing list
> > To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
> > To subscribe, unsubscribe, or change list options,
> > visit: https://lists.midrange.com/mailman/listinfo/c400-l
> > or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
> > Before posting, please take a moment to review the archives
> > at https://archive.midrange.com/c400-l.
> >
> >
> --
> This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L)
> mailing list
> To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
> To subscribe, unsubscribe, or change list options,
> visit: https://lists.midrange.com/mailman/listinfo/c400-l
> or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
> Before posting, please take a moment to review the archives
> at https://archive.midrange.com/c400-l.
>
>
-- 
This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L) mailing list
To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/c400-l
or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
Before posting, please take a moment to review the archives
at https://archive.midrange.com/c400-l.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.