如何最大化性能?

时间:2012-02-06 11:36:10

标签: c# database performance linq dynamic-linq

无论我怎么努力,我都有一个似乎无法解决的问题。

该公司从事市场分析工作,并拥有相当大的表格(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毫秒。

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

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

1 个答案:

答案 0 :(得分:5)

您没有解释您想要做什么,或者为什么过滤很多行很重要。如果您的数据库可以为您预先计算该聚合,为什么过滤1M行以获取聚合的速度有多重要?在任何情况下,您似乎都在使用错误的工具来完成工作。

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

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

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

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

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

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

根据您的需要,您可以尝试各种各样的事情:

  • 如果您正在寻找快速切片和切块数据的方法,请使用现有产品,例如Excel 2010的PowerPivot功能.PowerPivot以内存中的列式格式加载和压缩数百万行,并允许您查询数据就像使用数据透视表一样,甚至可以定义与其他内存源的连接。
  • 如果您想要更可重复的过程,可以在关系数据库中创建相应的星型模式,也可以使用柱状数据库。在任何一种情况下,您都必须编写脚本以便以适当的结构加载数据。

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