无论我怎么努力,我都有一个似乎无法解决的问题。
该公司从事市场分析工作,并拥有相当大的表格(300K - 1M行)和MANY列(想想250-300),我们会对其进行一些计算。
我会尝试直接解决问题:
问题是过滤数据。到目前为止,我尝试过的所有数据库都太慢,无法选择数据并将其返回。
目前我将整个表存储在内存中并使用动态LINQ进行过滤。
然而,虽然这很快(过滤250 000行约100毫秒),但我需要比这更好的结果...
有什么方法可以改变我的代码(不是数据模型)中可以加快过滤速度的东西吗?
我尝试过使用:
DataTable.Select哪个很慢。动态LINQ哪个更好,但是 还是太慢了。正常LINQ(仅用于测试目的)几乎 够好了。从MySQL获取并稍后进行处理 这是坏事。
在这个项目开始时,我们认为某些高性能数据库能够处理这个问题,但我尝试过:
H2(IKVM) HSQLDB(编译的ODBC驱动程序) CubeSQL MySQL的 SQL SQLite的 ...
并且它们与.NET接口并从中获得结果都非常慢。
我还尝试将数据拆分成块,然后在运行时将它们组合起来,使需要过滤的数据总量变小。
在这个宇宙中有什么办法可以让它更快吗?
提前致谢!
更新
我只是想补充说我还没有创建这个数据库。
要添加一些数字,如果我在数据库查询窗口(SQLyog)中这样简单地选择2个字段(visit_munic_name被编入索引):
SELECT key1, key2 FROM table1 WHERE filter1 = filterValue1
225639行需要125毫秒。
为什么这么慢?我测试了两个不同的盒子。
当然,他们必须改变一些,显然?
答案 0 :(得分:5)
您没有解释您想要做什么,或者为什么过滤很多行很重要。如果您的数据库可以为您预先计算该聚合,为什么过滤1M行以获取聚合的速度有多重要?在任何情况下,您似乎都在使用错误的工具来完成工作。
一方面,对于大多数数据库来说,1M行是少量行。只要你有适当的索引,查询应该不是一个大问题。我怀疑您在查询列上没有索引,或者您想在非索引列上执行即席查询。
此外,如果您的数据模式对于作业是错误的,则使用哪个数据库并不重要。分析应用程序通常使用星型模式来更快地查询比您描述的更多数据。
用于分析目的的所有数据库都使用特殊的数据结构,这些结构要求您将数据转换为他们喜欢的形式。 对于典型的关系数据库,您必须创建与多维数据集组合的星型模式以预先计算聚合。 列数据库以列式格式存储数据,通常与压缩相结合以实现快速分析查询,但它们要求您学习用自己的语言查询它们,这可能与大多数人习惯的SQL语言非常不同。
另一方面,您查询的方式(LINQ或DataTable.Select或其他)对性能的影响最小。选择正确的数据结构更为重要。
例如,使用Dictionary<>比使用你提到的任何技术要快得多。字典本质上检查内存中的单个值。使用LINQ to Datasets或Objects执行不带索引的DataTable.Select与扫描数组的所有条目或List<>基本相同。对于特定值,因为这就是所有这些方法的作用 - 按顺序扫描整个列表。
各种LINQ提供程序不能完成数据库的工作。它们不会优化您的查询。他们只是执行你告诉他们执行的内容。即使在排序列表上进行二进制搜索也比使用通用LINQ提供程序更快。
根据您的需要,您可以尝试各种各样的事情:
如果您想要更可重复的过程,可以在关系数据库中创建相应的星型模式,也可以使用柱状数据库。在任何一种情况下,您都必须编写脚本以便以适当的结构加载数据。
如果您正在创建自己的应用程序,则确实需要调查其他类似工具在内存中使用的各种算法和结构。