Robert Miller created HIVE-9630: ----------------------------------- Summary: partition filter using date_sub result produces non-optimal plans Key: HIVE-9630 URL: https://issues.apache.org/jira/browse/HIVE-9630 Project: Hive Issue Type: Bug Components: CLI Affects Versions: 0.14.0 Environment: CentOS 6.5, HDP 2.2 Reporter: Robert Miller
We queries which execute many times faster when comparing a date partition value to a date string than when comparing to the results of a date_sub (specifically: date_sub(to_date(from_unixtime(unix_timestamp())), 7) -- Looking for seven days earlier). For example: The following query requires a MR job to be spun-up and requires 1917 seconds to tell me there are roughly 428 MM rows: select count(*) from event_histories eh where eh.adjusted_activity_date_utc > date_sub(to_date(from_unixtime(unix_timestamp())), 7); Replacing the "date_sub(to_date(from_unixtime(unix_timestamp())), 7)" with the literal value '2015-02-02' (the value for today) results in no MR job and the result of 428 MM is returned in 0.075 seconds. There are queries which are using the same date_sub structure which appear to perform a full scan of the table I expect the results of the date_sub function are not classed equivalent to the literal even though there is nothing in the date_sub function which will change during the course of the query. Explaining the two queries: explain select count(*) from event_histories eh where eh.adjusted_activity_date_utc > date_sub(to_date(from_unixtime(unix_timestamp())), 7); OK Explain STAGE DEPENDENCIES: Stage-1 is a root stage Stage-0 depends on stages: Stage-1 STAGE PLANS: Stage: Stage-1 Map Reduce Map Operator Tree: TableScan alias: eh Statistics: Num rows: 1993093006 Data size: 901863505920 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (adjusted_activity_date_utc > date_sub(to_date(from_unixtime(unix_timestamp())), 7)) (type: boolean) Statistics: Num rows: 664364335 Data size: 300621168489 Basic stats: COMPLETE Column stats: NONE Select Operator Statistics: Num rows: 664364335 Data size: 300621168489 Basic stats: COMPLETE Column stats: NONE Group By Operator aggregations: count() mode: hash outputColumnNames: _col0 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE Reduce Output Operator sort order: Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE value expressions: _col0 (type: bigint) Reduce Operator Tree: Group By Operator aggregations: count(VALUE._col0) mode: mergepartial outputColumnNames: _col0 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: _col0 (type: bigint) outputColumnNames: _col0 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe Stage: Stage-0 Fetch Operator limit: -1 Processor Tree: ListSink Time taken: 1.853 seconds, Fetched: 49 row(s) explain select count(*) from event_histories eh where eh.adjusted_activity_date_utc > '2015-02-02'; OK Explain STAGE DEPENDENCIES: Stage-0 is a root stage STAGE PLANS: Stage: Stage-0 Fetch Operator limit: 1 Processor Tree: ListSink Time taken: 0.06 seconds, Fetched: 10 row(s) -- This message was sent by Atlassian JIRA (v6.3.4#6332)