使用分区表进行休眠

时间:2017-02-03 11:36:17

标签: postgresql hibernate partitioning database-partitioning

使用数据库postgresql 9.5。

我有一个表employee_shift,其行 110966498 ,所以为了改进插入,我已经将这个表分区了几个月20年(2000年1月到2020年12月,即240个分区表)到目前为止。。这是在表中的column日期。

既然我的插入更快(通过本机查询完成),但我现有的DAO层使用的是HQL,它命中employee_shift表而不是命中employee_shift_2010_10(year_month),因此我的select语句是相对的慢得多,因为它会检查所有分区。

如果我使用employee_shift_2010_10列使用select语句,hibernate是否可以直接命中date

在这种情况下,我的其他选择有哪些让我的选择更快?

1 个答案:

答案 0 :(得分:1)

您可能没有为继承表设置约束,或者您使用参数化查询。

CREATE TABLE a (id serial PRIMARY KEY, ts timestamp);
CREATE INDEX a_ts ON a (ts);

CREATE TABLE a_2010 ( CONSTRAINT data_2011_check CHECK (ts >= '2010-01-01 00:00:00'::timestamp AND ts < '2011-01-01 00:00:00'::timestamp))  INHERITS (a);
CREATE TABLE a_2011 ( CONSTRAINT data_2012_check CHECK (ts >= '2011-01-01 00:00:00'::timestamp AND ts < '2012-01-01 00:00:00'::timestamp))  INHERITS (a);
CREATE TABLE a_2012 ( CONSTRAINT data_2013_check CHECK (ts >= '2012-01-01 00:00:00'::timestamp AND ts < '2013-01-01 00:00:00'::timestamp))  INHERITS (a);
CREATE TABLE a_2013 ( CONSTRAINT data_2014_check CHECK (ts >= '2013-01-01 00:00:00'::timestamp AND ts < '2014-01-01 00:00:00'::timestamp))  INHERITS (a);
CREATE INDEX a_ts_2010 ON a_2010 (ts);
CREATE INDEX a_ts_2011 ON a_2011 (ts);
CREATE INDEX a_ts_2012 ON a_2012 (ts);
CREATE INDEX a_ts_2013 ON a_2013 (ts);

之后你可以通过约束看到postgresql检查继承表。约束必须不重叠。

EXPLAIN ANALYZE SELECT * FROM a WHERE ts = '2011-02-01 00:00:00';


                                                       QUERY PLAN                                                        
-------------------------------------------------------------------------------------------------------------------------
 Append  (cost=0.00..14.79 rows=11 width=12) (actual time=0.006..0.006 rows=0 loops=1)
   ->  Seq Scan on a  (cost=0.00..0.00 rows=1 width=12) (actual time=0.003..0.003 rows=0 loops=1)
         Filter: (ts = '2011-02-01 00:00:00'::timestamp without time zone)
   ->  Bitmap Heap Scan on a_2011  (cost=4.23..14.79 rows=10 width=12) (actual time=0.003..0.003 rows=0 loops=1)
         Recheck Cond: (ts = '2011-02-01 00:00:00'::timestamp without time zone)
         ->  Bitmap Index Scan on a_ts_2011  (cost=0.00..4.23 rows=10 width=0) (actual time=0.003..0.003 rows=0 loops=1)
               Index Cond: (ts = '2011-02-01 00:00:00'::timestamp without time zone)
 Planning time: 1.148 ms
 Execution time: 0.046 ms
(9 rows)