0

我们有一个内存网格平台,它从数据库引导数据,现在我们有 8 个节点,我们必须在 8 个节点之间平均分配数据。所以我们使用 % 运算符如下

select * from LargeTable where id % 8 = 1
select * from LargeTable where id % 8 = 2
select * from LargeTable where id % 8 = 3
select * from LargeTable where id % 8 = 4
select * from LargeTable where id % 8 = 5
select * from LargeTable where id % 8 = 6
select * from LargeTable where id % 8 = 7
select * from LargeTable where id % 8 = 8

但是我们观察到的是表扫描查询使用全表扫描而不是使用索引,并且我们有数百万条记录的数据,有什么办法可以强制它使用索引来提高性能或任何其他建议表示赞赏。

4

1 回答 1

0

它不会使用索引,因为您对其列进行了操作。

如果它是一个聚集索引,你可以使用范围测试来代替(但你知道它大致分为 8 种方式的点 - 似乎你认为模数给出了一个均匀的分割?)你也可以用于非聚集,但它可能不是阅读起来非常快,因为对于集群,数据在叶级别都是有序的。

您可以添加一个 id%8 的具体化列并为其编制索引,但是在插入数据时这是额外的工作,因为它是一个额外的索引。如果这不是太多的插入开销,您会发现这很有效,您可以并行读取 8 次,每一次都直接访问其数据。

您也许也可以使用表分区,但这不是我所知道的。目的是在范围内对其进行分区,如果您使用 bcp,则可以从分区中取出 bcp。

于 2018-02-12T17:37:43.553 回答