通常,如果您有一个经常查询表的列,则应该在其上粘贴索引。但是,如果事先知道所有可能的值,是否也值得按此列对表进行分区?假设您有一个表,AUDIT其中的TenantId列只能包含值:1, 2。
所有 SELECT语句都有一个WHERE带TenantId参数的子句。
那么,通过 TenantId 对该表进行分区是否有益?如果是这样,您还会在TenantId列上创建索引吗?
partition by list (TENANTID)
(
partition TENANT1 values (1),
partition TENANT2 values (2)
)
Run Code Online (Sandbox Code Playgroud)
我做了一个小实验:插入 1M 随机生成的 TenantId 记录,从而创建:
以下是语句的查询计划:
SELECT * FROM table1 WHERE TENANTID=2
Run Code Online (Sandbox Code Playgroud)
普通表(无索引,无分区)
位图索引:
分区:

顺便说一句,如果我同时拥有索引和分区,查询计划使用分区而不是索引,因此该计划看起来与上面显示的第二个完全相同。
显然分区获胜,但是呢? 显然,执行计划中的成本列并不是判断 SQL 语句响应时间的真实成本的可靠方法。
那么,什么是最好的方法呢?如何选择一个?