The query itself is quite simple; it normally should not take 60
seconds for planning. I guess most of the planning time is spent on
reading parquet metadata. The metadata caching that Steven worked
should help in this case.


On Thu, Sep 24, 2015 at 10:42 PM, Sudheesh Katkam <skat...@maprtech.com> wrote:
> For the table below, 33 seconds for execution (includes parquet reader 
> initialization) and 60 seconds for planning.
>
>> On Sep 24, 2015, at 10:01 PM, Jinfeng Ni <jinfengn...@gmail.com> wrote:
>>
>> "FragmentExecutor took 1,070,926 ms to create RecordBatch tree."
>>
>> 1,070,926 ms ~ 17.x  minutes. In other words, the majority of 18
>> minutes of execution in hive case is spent on the initialization of
>> Hive readers. If we want to improve "limit n", we probably should make
>> "lazy" initialization of Hive reader; only when Drill has to read rows
>> from reader, we do the initialization. Otherwise, to initialize all
>> the readers before reading any single row means long setup time for
>> limit "n" query, when n is relative small.
>>
>> For the second case, the 94 seconds query time seems to be too long as
>> well. I guess most of the time is spent on parquet reader
>> initialization (?)
>>
>>
>>
>> On Thu, Sep 24, 2015 at 9:32 PM, Sudheesh Katkam <skat...@maprtech.com> 
>> wrote:
>>> Hey y'all,
>>>
>>> ### Short Question:
>>>
>>> How do we improve performance of SELECT * FROM plugin.table LIMIT 0?
>>>
>>> ### Extended Question:
>>>
>>> While investigating DRILL-3623 
>>> <https://issues.apache.org/jira/browse/DRILL-3623>, I did an analysis to 
>>> see where we spend time for SELECT * FROM hive.table LIMIT 0 query.
>>>
>>> ## Setup:
>>> Copy the drill/sample-data/region.parquet (x 20000) into a DFS (MapR-FS in 
>>> my case) directory named region. Create a Hive external table pointing to 
>>> region. Run Drill with default configuration.
>>>
>>> ## Now there are two ways to query this table:
>>>
>>>> SELECT * FROM hive.region LIMIT 0;
>>> +--------------+---------+------------+
>>> | r_regionkey  | r_name  | r_comment  |
>>> +--------------+---------+------------+
>>> +--------------+---------+------------+
>>> No rows selected (1203.179 seconds)
>>> ...
>>>
>>>> SELECT * FROM dfs.test.region LIMIT 0;
>>> +--------------+---------+------------+
>>> | r_regionkey  | r_name  | r_comment  |
>>> +--------------+---------+------------+
>>> +--------------+---------+------------+
>>> No rows selected (94.396 seconds)
>>>
>>> Currently, we use HiveRecordReader for the first case and 
>>> ParquetRecordReader in the second case. With DRILL-3209 
>>> <https://issues.apache.org/jira/browse/DRILL-3209>, both queries will use 
>>> ParquetRecordReader. However, for formats that are non-native to Drill or 
>>> other storage plugins, we still face this problem. Summarizing the query 
>>> profile,
>>> +-------+-----------+---------------+----------------+
>>> | Query | Fragments | Planning time | Execution time |
>>> +-------+-----------+---------------+----------------+
>>> | hive  | 1         | ~2 min        | ~18 min        |
>>> | dfs   | 1         | ~1 min        | ~33 sec        |
>>> +-------+-----------+---------------+----------------+
>>>
>>> ## The time hogs:
>>>
>>> # Planning time in both cases needs to improve. How?
>>>
>>> # With respect to execution, in the first case ImplCreator.getExec(…) call 
>>> in the FragmentExecutor took 1,070,926 ms to create RecordBatch tree. There 
>>> are 20,000 readers being initialized in HiveScanBatchCreator. How do we 
>>> avoid this? What are the implications of chained impersonation (opening 
>>> readers in ctor() rather than in setup())?
>>>
>>> ### Extending further:
>>>
>>> This can be generalized to any "LIMIT n" query with n is a small number. 
>>> For n > 0, we parallelize scanning. So LIMIT 1 query runs faster than LIMIT 
>>> 0. However there is a sweet "n" after which parallelization hurts.
>>>
>>> ###
>>>
>>> Thank you,
>>> Sudheesh
>>>
>

Reply via email to