2012-02-06 69 views
2

我有一个问题,无论我多么努力地尝试,我都无法解决问题。如何最大限度地提高性能?

这家公司从事市场分析工作,并有相当大的表格(300K-1M行)和许多专栏(想想250-300),我们做一些计算。

I'll试图让直行的问题:

的问题是数据的过滤。到目前为止,我尝试过的所有数据库都太慢,无法选择数据并将其返回。

目前我将整个表存储在内存中,并使用动态LINQ进行过滤。

然而,尽管这是相当快的(大约100毫秒来筛选250000行),我需要比这更好的结果...

有什么办法,我可以在我的代码改变的东西(没有数据模型)可以加速过滤吗?

我已经尝试使用:

DataTable.Select这是缓慢的。动态LINQ哪个更好,但是 还是太慢了。正常的LINQ(仅用于测试目的)几乎是 就足够了。从MySQL中获取并稍后处理 ,这很糟糕。

在这个项目中,我们认为,一些高性能的数据库将能够处理这个问题的开始,但我想:

H2(IKVM) HSQLDB(编译ODBC驱动程序) CubeSQL MySQL SQL SQLite ...

而且它们都非常缓慢地接口.NET并获得结果。

我也尝试将数据拆分成块,并在运行时将它们组合起来,以使需要过滤的数据总量更小。

这个宇宙中有什么办法可以让这个更快吗?

在此先感谢!

UPDATE

我只想补充一点,我还没有创建有关此数据库。

要添加一些数字,如果我做一个简单的选择2场的(visit_munic_name被索引)数据库查询窗口(SQLyog的)是这样的:

SELECT key1, key2 FROM table1 WHERE filter1 = filterValue1 

它发生在225639行125毫秒。

为什么这么慢?我测试了2个不同的盒子。

当然,他们必须改变某些,显然?

+4

说实话,这不是很多行。听起来像数据库结构需要一些严肃的关注。 – 2012-02-06 11:39:24

+0

当你使用DB-网络请求本身或DB侧的SQL查询执行时,你检查过什么慢吗?如果网络请求/响应缓慢 - 请参阅您是否可以将数据库托管到应用程序附近,否则调整sql查询eprformance,表索引等 – sll 2012-02-06 11:41:01

+1

您说选择数据对于您使用的所有数据库都很慢。这在我心中引起了一些红旗。你在选择中做任何复杂的连接吗?你有复杂的where子句吗?你的数据库是否正确编入索引? – CadentOrange 2012-02-06 11:42:19

回答

5

你没有解释你到底想要做什么,或者为什么过滤很多行很重要。如果数据库可以为您预先计算该聚合,那么为什么它应该多快才能过滤1M行以获取聚合?无论如何,你似乎在为这项工作使用错误的工具。

一方面,对于大多数数据库,1M行是少量行。只要你有适当的索引,查询应该不是一个大问题。我怀疑你的查询列没有索引,或者你想在非索引列上执行临时查询。

此外,如果数据模式对于作业是错误的,则使用哪个数据库并不重要。分析应用程序通常使用星型模式,以便比您描述的更快地查询更多的数据。

所有用于分析目的的数据库都使用特殊的数据结构,这些数据结构要求您将数据转换为他们喜欢的形式。 对于典型的关系数据库,您必须创建与多维数据集结合以预先计算聚合的星形模式。 列数据库通常将列数据格式与压缩数据相结合以实现快速分析查询,但它们要求您学习使用自己的语言来查询数据,这可能与大多数人习惯使用的SQL语言差别很大。

另一方面,,你查询的方式(LINQ或DataTable.Select或其他)对性能影响最小。选择合适的数据结构更重要。

例如,使用字典<>比使用您提到的任何技术要快得多。字典本质上检查内存中的单个值。执行DataTable.Select没有索引,使用LINQ to Datasets或使用LINQ to Objects与扫描数组或列表中的所有条目相同,因为这是所有这些方法的作用 - 按顺序扫描整个列表。

各种LINQ提供程序不执行数据库的工作。他们不会优化您的查询。他们只是执行你告诉他们执行的内容。即使在排序列表上进行二分搜索比使用通用LINQ提供程序更快。

有各种各样的事情,你可以尝试,这取决于你需要做什么:

  • 如果你正在寻找一个快速的方式来切割您的数据,使用现有产品类似的Excel的PowerPivot功能2010。PowerPivot以内存中的柱状格式加载和压缩成百万行的行,并允许您像查看数据透视表一样查询数据,甚至可以定义与其他内存源中的连接。
  • 如果您想要一个更可重复的流程,您可以在关系数据库中创建适当的星型模式或使用柱状数据库。无论哪种情况,您都必须编写脚本来将数据加载到适当的结构中。

  • 如果您正在创建自己的应用程序,您真的需要研究其他类似工具在内存中使用的各种算法和结构。

相关问题