内存中有一组相同类型的对象,每个对象都具有多个不可变的int属性(但不仅仅是它们)。
我需要在那里找到一个对象(或多个),它的属性在接近指定值的小范围内。例如a == 5+-1 && b == 21+-2 && c == 9 && any d。
存储对象的最佳方法是什么,这样我就可以这样高效地检索它们了?
我考虑为每个属性创建SortedList并使用BinarySearch,但是我有很多属性,所以我希望有一种更通用的方法,而不是这么多的SortedLists。
重要的是,集合本身不是不变的:我需要一种添加/删除项的能力。
对象(不仅仅是数据)有类似于内存db的东西吗?
发布于 2016-02-01 20:13:18
只想扩展一下@j_random_hacker的回答:通常的‘估计选择性’的方法是为索引构建一个直方图。但是,您可能已经直觉地知道哪一个标准将产生"a == 5+-1 &b == 21+-2 &c == 9“中最小的初始结果。最有可能的是"c == 9“,除非'c‘有一个非常高的重复值和小范围的潜在值。
因此,简单地分析谓词将是一个简单的起点。平等条件极有可能是最有选择性的(表现出最高的选择性)。
从那时起,RDBMS‘将对结果集中的记录进行顺序扫描,以筛选其余谓词。这可能也是你最好的方法。
或者,有任何数量的内存中,小占用SQL能力的数据库管理系统将为您完成繁重的工作(eXtremeDB,SQLite,RDM,.谷歌是你的朋友)和/或拥有低级的界面,不会为你做所有的工作(仍然,大多数),但也不会把SQL强加给你。
发布于 2016-02-01 01:34:54
首先,拥有大量的SortedList是不错的设计。本质上,这是所有现代RDBMSes解决相同问题的方式。
此外,如果有一种简单、通用、接近最佳效率的方法来回答此类查询,RDBMSes将不会为查询计划优化的相对复杂和缓慢的黑客所困扰:即生成大量候选查询计划,然后启发式地估计执行哪个查询所需的时间最少。
诚然,在使用RDBMSes时,表间有许多连接的查询往往会使可能的计划空间变得很大,而且这里似乎没有。但是,即使只有一个表(一组对象),如果有k个字段可用于选择行(对象),那么理论上可以使用k!不同的索引(键,值)对,其中键是k字段值的一些有序序列,该值例如是指向对象的内存指针)可供选择。如果查询的结果是单个对象(或者,如果查询包含一个针对所有k字段的非范围子句),那么所使用的索引并不重要--但在其他情况下,每个索引的执行情况通常会不同,因此查询规划者需要准确估计每个子句的选择性,以便选择要使用的最佳索引。
https://stackoverflow.com/questions/35119697
复制相似问题