要使用 SQL 解决方案使这些查询快速运行,请使用这些经验法则。不过,这有很多警告,您使用的实际 SQL 引擎将与解决方案非常相关。
我假设您的数据是整数、日期或短定标器。长字符串等改变了游戏。我还假设您只使用固定比较(=、<、>、<> 等)
a) 如果时间间隔 Y 将出现在每个查询中,请确保它已被索引,除非 Y 谓词选择很大比例的行。确保行以“Y”顺序存储,以便它们彼此相邻地打包在磁盘上。对于新数据,随着时间的推移,这将自然而然地发生。如果 Y 谓词非常紧凑(即几百行),那么这可能就是您需要做的所有事情。
b) 你是在做“select ”还是“select count( )”?如果不是“select *”,那么垂直分区可能会有所帮助,具体取决于引擎和其他索引。
c) 为值分布广泛且没有太多重复项的每一列创建单列索引。索引 YEAR_OF_BIRTH 通常是可以的,但索引 FEMALE_OR_MALE 通常不好 - 尽管这是高度特定于数据库引擎的。
d) 如果您有 FEMALE_OR_MALE 之类的列并且“Y 谓词”很宽,那么您会遇到不同的问题 - 从大多数行中选择女性人数会很困难。您可以尝试索引,但取决于引擎。
e) 如果可能,尝试使列“NOT NULL”——通常每行节省 1 位,并且可以简化内部优化器操作。
f) 更新/插入。创建索引通常会损害插入性能,但如果您的速率足够低,则可能无关紧要。只有 100M 行,我假设您的插入率相当低。
g)多段键会有所帮助,但您已经说过它们不行。
h) 获取高速磁盘 (RPM) - 这些类型的查询的问题通常是 IO(TPC-H 基准测试是关于 IO,而您听起来像是“H”问题)
还有更多选择,但这取决于您要花费多少精力“使查询尽可能快”。有很多 No-SQL 和其他选项可以解决这个问题,但我会将这部分问题留给其他人。