Thank you two for your patient and helpful replies.
I will experiment the salt partition numbers and the other options.
Some new problems happened, so I have to write a new letter to the dear
email list.
Many many thanks.
Qiao

Qifan Chen <qifan.c...@esgyn.com>于2016年9月20日周二 下午9:30写道:

> Hi Qiao,
>
> Glad to know that the DDL change helped.
>
> I think you can also play with the following for better performance.
>
>    1. CQD parallel_num_esps.  This CQD sets the degree of parallelism to
>    a fixed value for all parallel layers (like the layer composed of operator
>    1,2 and 3 in the query plan).  It is OK to use the CQD during query
>    optimization. In production however, you may consider use a different way
>    which is my second point below (item 2). The benefit of *not* using
>    CQD parallel_num_esps is that this will allow the compiler to choose the
>    parallelism based on data size per layer. Your system resource could be
>    better controlled this way.
>    2. CQD MAX_ESPS_PER_CPU_PER_OP controls the # of ESPs per node. We
>     normally allocate 2 ESPs per node (that is the reason there are 6 = 3 * 2
>    in the plan). You can alter the CQD MAX_ESPS_PER_CPU_PER_OP to a value so
>    that you want maximally X number of ESPs per node (say 4).  The formula for
>    the CQD is X / #coresPerNode = X/8. So to boost the degree of parallelism
>    from 6 to 12 (or from 2 to 4 ESPs per node), you need to set the CQD to
>    4/8=0.5.
>    3. From the stats, UID (with total # of distinct value of 8319955) is
>    more 'unique' than VID (578912). It will be a good idea to switch the
>    position of UID and VID in primary key to favor queries with the search
>    condition SID=<u> and V_DATE =<v> and VID=<w>.
>    4. The SALT clause (SID, V_DATE, UID, VID) could be reduced to (SID,
>    V_DATE, VID) if the above search condition (in item 3) is issued often and
>    the expected number of matching rows is small (say less than 200). In this
>    case, the compiler may choose a serial plan fragment which is perfect to
>    use one ESP to read from one partition where all the matching rows reside.
>
>
> Thanks --Qifan
>
>
> LC   RC   OP   OPERATOR              OPT       DESCRIPTION           CARD
>
> ---- ---- ---- --------------------  --------  --------------------
>  ---------
>
> 4    .    5    root
>  1.00E+000
> 3    .    4    sort_partial_aggr_ro
>  1.00E+000
> 2    .    3    esp_exchange                    1:6(hash2)
>  1.00E+000
> 1    .    2    sort_partial_aggr_le
>  1.00E+000
> .    .    1    trafodion_scan                  VISIT_FROM_HIVE
> 8.03E+006
>
> --- SQL operation complete.
>
>
>
> On Tue, Sep 20, 2016 at 12:28 AM, Eric Owhadi <eric.owh...@esgyn.com>
> wrote:
>
>> I also see that you should not be using DIVISION BY, since your V_DATE
>> are already on day boundary. Using DIVISION_BY is counter-productive here.
>>
>>
>>
>> And sorry I opened wrong file, I had old and new opened at the same time
>> and looked wrong window J, you did change the charset and char length,
>> my bad,
>>
>> Eric
>>
>> *From:* Eric Owhadi [mailto:eric.owh...@esgyn.com]
>> *Sent:* Tuesday, September 20, 2016 12:10 AM
>> *To:* '乔彦克' <qya...@gmail.com>; 'user@trafodion.incubator.apache.org' <
>> user@trafodion.incubator.apache.org>
>> *Cc:* 'dev' <d...@trafodion.incubator.apache.org>; Qifan Chen <
>> qifan.c...@esgyn.com>
>> *Subject:* RE: trafodion query optimization
>>
>>
>>
>> Hi Qiao
>>
>>
>>
>> Optimizer picked 6 as DOP. You can force it higher:
>>
>>
>>
>> Use
>>
>> CQD parallel_num_esps ‘12’;
>>
>> Then prepare and run the query.
>>
>>
>>
>> You may experiment with re-generating you table with SALT 15 and CQD
>> parallel_num_esps ‘15’.
>>
>>
>>
>> you can even draw a curve
>>
>> SALT 18, parallel_num_esp ‘18’
>>
>> SALT  21, parallel_num_esps ‘21’
>>
>> Etc 3 by 3 until you see that performance stop getting better, and
>> actually drops.
>>
>>
>>
>> I see you did not change VARCHAR to CHAR and did not use Charset
>> ISO88591: this is important to optimize row size. UTF8 is very greedy
>> specially for PK columns. When I see your sample sid, I wonder if you
>> really need UTF8.
>>
>>
>>
>> Same principle apply for the other columns, but less important than for
>> key.
>>
>>
>>
>> Ultimately you can change the default value of HBASE_OPTIONS BLOCKSIZE
>>
>> Default is 65565, you can try doubling or quadrupling it. This will
>> improve scan rate but crease any query that does random access.
>>
>>
>>
>> Also I checked in an experimental feature to allow scanning in parallel
>> without using ESP (using multithreading instead), in case memory resource
>> consumed by ESP becomes a bottleneck, but I would not recommend it yet as
>> it is “experimental” still…
>>
>> Except if you start seeing memory pressure…
>>
>> Hope this helps,
>> Eric
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> *From:* 乔彦克 [mailto:qya...@gmail.com <qya...@gmail.com>]
>> *Sent:* Monday, September 19, 2016 11:38 PM
>> *To:* user@trafodion.incubator.apache.org
>> *Cc:* dev <d...@trafodion.incubator.apache.org>; Eric Owhadi <
>> eric.owh...@esgyn.com>; Qifan Chen <qifan.c...@esgyn.com>
>> *Subject:* Re: trafodion query optimization
>>
>>
>>
>> Many thanks  to Eric and Qifan again.
>>
>> I upload a new log about the new ddl and the query plan.
>>
>> @Eric, Following your advice I modified the ddl, the sum query now takes
>> 25seconds while the old ddl will take 90seconds.(there are 3 nodes in my
>> cluster, 8cores(16 v-cores) and 16GRAM), Is there any other optimize
>> options to make the sum query more fast (better less than 10seconds)?
>>
>> @Qifan, I log the output of showstats command in the attachment, looking
>> forward more suggestions.
>>
>>
>>
>> Thanks again.
>>
>> Qiao
>>
>>
>>
>> Qifan Chen <qifan.c...@esgyn.com>于2016年9月19日周一 下午9:23写道:
>>
>> Hi Qiao,
>>
>>
>>
>> Thank you for the data. It is very helpful.
>>
>>
>>
>> There are several things noticed.
>>
>>    - The key columns are: _SALT_, _DIVISION_1_, SID, V_DATE, UID, VID
>>    - The salt column is built from column SID only, which means all rows
>>    with identical SID values V will be stored in the same partition.
>>    - From the query plan, the compiler assigns 6 executor processes (we
>>    call ESP) to read the salted table of 12 partitions: 1 ESP reads 2 salt
>>    partitions.
>>    - The frequency of V is high when sid='6b2a0957' (~8million rows),
>>    all these relevant rows are handled by one execution process out of 6. 
>> That
>>    probably is the reason of not much parallelism observed.
>>    - You can use SQL command *showstats with detail* option to check the
>>    frequency on column SID.
>>
>>
>>    - showstats for table TRAFODION.SEABASE.VISIT_FROM_HIVE2 on SID
>>       detail;
>>
>>
>>    - If high frequency per unique value on column SID is confirmed, we
>>    probably should consider our next step of action. For example, we could 
>> add
>>    some columns from the primary key to the SALT clause to help spread V of
>>    SID to all 12 partitions.
>>
>> Could you please send us the output of the showstats command above, and
>> the showstats command below for all columns in the table?
>>
>>
>>
>> showstats for table TRAFODION.SEABASE.VISIT_FROM_HIVE2 on every column;
>>
>>
>>
>> Thanks --Qifan
>>
>>
>>
>> On Mon, Sep 19, 2016 at 3:15 AM, 乔彦克 <qya...@gmail.com> wrote:
>>
>> Thanks Eric and Qifan. I am sorry to reply after so long a time because
>> I'm on the Chinese mid-autumn festival holiday.
>>
>> According to Qifan's advice, I upload a log which contains the DDL and
>> the query plan hope to get more advice.
>>
>>
>>
>> and to Eric, I summit a jira about the block-encoding and the
>> compression, https://issues.apache.org/jira/browse/TRAFODION-2195, so I
>> only use the hbase compression.
>>
>> Qifan Chen <qifan.c...@esgyn.com>于2016年9月12日周一 下午10:43写道:
>>
>> Hi Qiao,
>>
>>
>>
>> You can also send us the DDL and the query plan to help with the tuning.
>>
>>
>>
>> To generate a query plan, do the following from sqlci, and the plan is in
>> text file mylog.
>>
>>
>>
>>    1. log mylog clear;
>>    2. prepare xx from <your query>;
>>    3. explain xx;
>>    4. explain options 'f' xx;
>>    5. exit;
>>
>>
>>
>> Thanks --Qifan
>>
>>
>>
>> On Mon, Sep 12, 2016 at 8:21 AM, Eric Owhadi <eric.owh...@esgyn.com>
>> wrote:
>>
>> Hello Qiao,
>> When you say whatever the table ddl it limits things a lot, as table ddl
>> will help define several things that will drastically improve the degree
>> of
>> parallelism and the table size.
>>
>> The DOP (degree of parallelism) of the scan operator is constrained by the
>> number of regions your table uses. So if you want to increase DOP, you
>> need
>> to partition your table using the syntax like:
>> create table customer_demographics_salt
>> (
>>  cd_demo_sk int not null
>>  , cd_gender char(1)
>>  , cd_marital_status char(1)
>>  , cd_education_status char(20)
>>  , cd_purchase_estimate int
>>  , cd_credit_rating char(10)
>>  , cd_dep_count int
>>  , cd_dep_employed_count int
>>  , cd_dep_college_count int
>>  , primary key (cd_demo_sk)
>> )
>> salt using 12 partitions
>> ATTRIBUTES ALIGNED FORMAT
>> HBASE_OPTIONS
>>   (
>>     DATA_BLOCK_ENCODING = 'FAST_DIFF',
>>     COMPRESSION = 'SNAPPY'
>>   );
>>
>> you can experiment with different values of number of partitions (but
>> pick a
>> multiple of 3 since you have 3 nodes).
>>
>> Then the optimizer will pick the DOP with a compromise of resource usage
>> vs
>> gain in speed.
>> If you want to force higher DOP than what optimizer selected, you can use
>> :
>> CQD parallel_num_esps '12';
>> To force it to one ESP per partition (assuming you picked 12 partitions).
>> You can verify what optimizer picked as DOP by doing an explain on the
>> query.
>>
>> Other important factors plays in performance:
>> - use of aligned format (see above example)
>> - careful choice of the primary key (bad idea to use a varchar with big
>> max
>> size)
>> - It is good idea to use compression and encoding (see the most common
>> options we use above)
>> - you can also increase the HBASE_OPTIONS BLOCKSIZE parameter, but there
>> is
>> a drawback: increasing it will increase performance of SCAN but decrease
>> performance of keyed access. That is why I did not include it in the
>> example
>> above.
>>
>> Hope this helps,
>> Regards,
>> Eric
>>
>>
>> -----Original Message-----
>> From: 乔彦克 [mailto:qya...@gmail.com]
>> Sent: Monday, September 12, 2016 1:22 AM
>> To: user@trafodion.incubator.apache.org;
>> d...@trafodion.incubator.apache.org
>> Subject: trafodion query optimization
>>
>> Hi all,
>>      I executed the sum and count query on my table where the cluster has
>> three nodes. I found that the sum query is not well parallel executed(not
>> all the three nodes get high load when executing the sum query) and the
>> cpu
>> load is very high while the memory load is very low(the machines have 16
>> cores and 16GB memory). My sum query on the 12 million data sets takes
>> about
>> 2 minutes and a half time.
>>     So my question is that is there any optimization advice that I can use
>> to improve the query performance and maximize the usage of my machines,
>> what
>> ever the configuration or the table ddl.
>>     Any replies is appreciated.
>>
>> Thanks,
>> Qiao
>>
>>
>>
>>
>>
>> --
>>
>> Regards, --Qifan
>>
>>
>>
>>
>>
>>
>>
>> --
>>
>> Regards, --Qifan
>>
>>
>>
>>
>
>
> --
> Regards, --Qifan
>
>

Reply via email to