通过带有范围的多个参数搜索对象的高效设计

时间:2016-01-31 21:28:15

标签: c# algorithm search indexing in-memory-database

我在内存中有一组相同类型的对象,每个对象都有多个不可变int属性(但不仅仅是它们)。

我需要在那里(或多个)找到一个对象,其属性在指定值附近的小范围内。例如。 a == 5+-1 && b == 21+-2 && c == 9 && any d

存储对象的最佳方法是什么,以便我可以像这样有效地检索它们?

我考虑为每个属性制作SortedList并使用BinarySearch,但我有很多属性,所以我希望采用更通用的方式而不是SortedLists。< / p>

重要的是集合本身不是不可变的:我需要能够添加/删除项目。

对象(而不仅仅是数据)是否有类似内存数据库的东西?

2 个答案:

答案 0 :(得分:0)

首先,拥有大量SortedList s的设计并不错。它基本上是所有现代RDBMS解决同一问题的方式。

除此之外:如果有一种简单,通用,接近最佳效率的方式来回答此类查询,RDBMS不会为查询计划优化的相对复杂和缓慢的黑客而烦恼:即生成大量候选查询计划,然后启发式地估计哪一个将花费最少的时间来执行。

不可否认,表之间有很多连接的查询往往会使RDBMS实际上可能的计划空间变得很大,而且你似乎没有这些。但即使只有一个表(一组对象),如果有k个字段可用于选择行(对象),那么理论上你可以有k!不同的索引({key,value}对的SortedList s,其中密钥是k字段值的某个有序序列,并且该值是例如到对象的存储器指针)以供选择。如果查询的结果是单个对象(或者,如果查询包含所有k个字段的非范围子句),则使用的索引无关紧要 - 但在所有其他情况下,每个索引都将在一般执行方式不同,因此查询计划程序需要准确估计每个子句的选择性,以便选择要使用的最佳索引。

答案 1 :(得分:0)

只是为了扩展@ j_random_hacker的回答:通常的方法来估计选择性&#39;是为索引建立直方图。但是,您可能已经直观地知道哪个标准将产生最小的初始结果集&#34; a == 5 + -1&amp;&amp; b == 21 + -2&amp;&amp; c == 9&#34;。最有可能的是&#34; c == 9&#34;除非有非常多的重复值以及&#39; c&#39;的潜在价值的小范围。

因此,对谓词的简单分析将是一个简单的起点。平等条件很可能是最具选择性的(表现出最高的选择性)。

从那时起,RDBMS&#39;将对结果集中的记录进行顺序扫描,以过滤剩余的谓词。这也可能是你最好的方法。

或者,有任何数量的内存,小占用SQL的DBMS将为您做繁重的工作(eXtremeDB,SQLite,RDM,...谷歌是你的朋友)和/或那个拥有较低级别的界面,不会为你做所有的工作(仍然是,大多数),但也不会给你施加SQL。