【发布时间】:2014-05-21 01:26:36
【问题描述】:
假设我们有类似的数据(Oracle 语法但不重要):
create table EVENT (
UUID raw(16) default sys_guid(), -- no significant for question
TYPE number(2,0) not null,
DATEX date not null,
AMOUNT number(18,2) -- we use op: SUM, COUNT, AVG, STDDEV_POP, MEDIAN, etc
);
distinct TYPE 仅限于人类可管理的计数(例如 20),DATEX 是过去 10 年,AMOUNT 是用于统计分析的字段(例如获取给定 EVENT 的直方图 @ 987654327@选定DATEX 期间的月份)。
个数或行数约为 2e+6。
由于所有查询都使用TYPE = n 和DATEX between DATE 'yyyy-mm-dd' and DATE 'yyyy-mm-dd' 限制,我决定为该字段创建索引:
create index INDEX_EVENT_MAIN on EVENT (TYPE ASC, DATEX ASC);
使用全扫描查询性能比使用大约 x2-x5 倍。
另一种策略是按事件TYPE 将数据拆分到不同的单个表中,例如 EVENT1、EVENT2……我使用这些表时根本没有索引。在这种情况下,EVENTn 表中的查询性能比EVENT 大表中的 TYPE = n 好 x2-x10 倍(都是全扫描)。
我还对 EVENT 表进行分区:
alter table EVENT add partition event_default values (DEFAULT);
alter table DATA_XX split partition event_default values(2) into (
partition event2,
partition event_default);
EVENT = 2 上的查询性能与单独的EVENT2 表相同。
我不是 DBA 专家,也不是制作 Web 2.0 企业网站的专家。所以我可以做实验和猜测,但不懂黑盒,也无法解释强关系/算法理论的结果。
所以有相关问题:
- 索引不适用于统计查询(处理范围广泛的行),并且更好地进行全扫描?
- 索引是否仅用于点(非范围,按 ID 获取)查询(非范围)?
- 表拆分或分区是否是提高统计/聚合查询的查询性能的唯一方法?
【问题讨论】:
-
根据答案,我在stackoverflow.com/questions/23000476 提出了一个新问题,即是否有可能在一张桌子或更多桌子上同时使用所有建议。
标签: sql database oracle indexing