【发布时间】:2012-02-06 11:36:09
【问题描述】:
我有一个问题,无论我怎么努力,我似乎都无法解决。
这家公司从事市场分析工作,拥有非常大的表格(300K - 1M 行)和许多列(想想 250-300),我们对其进行了一些计算。
我会尝试直接解决问题:
问题在于数据的过滤。到目前为止,我尝试过的所有数据库都太慢了,无法选择数据并返回。
目前我将整个表存储在内存中并使用动态 LINQ 进行过滤。
但是,虽然这相当快(过滤 250 000 行大约需要 100 毫秒),但我需要比这更好的结果...
有什么方法可以更改我的代码(不是数据模型)中的某些内容,从而加快过滤速度?
我尝试过使用:
DataTable.Select 慢的。动态 LINQ 哪个更好,但是 还是太慢了。普通 LINQ(仅用于测试目的)几乎 已经足够好了。从 MySQL 中获取并稍后进行处理 这太慢了。
在这个项目的开始,我们认为一些高性能的数据库可以处理这个,但我尝试了:
H2 (IKVM) HSQLDB(编译的 ODBC 驱动程序) 多维数据集SQL MySQL SQL SQLite ...
而且它们在连接 .NET 和从中获取结果时都很慢。
我还尝试将数据拆分成块,然后在运行时将它们组合起来,以使需要过滤的数据总量更小。
在这个宇宙中有没有什么方法可以让我更快?
提前致谢!
更新
我只想补充一点,我没有创建有问题的数据库。
要添加一些数字,如果我像这样在数据库查询窗口 (SQLyog) 中简单地选择 2 个字段(visit_munic_name 已编入索引):
SELECT key1, key2 FROM table1 WHERE filter1 = filterValue1
225639 行需要 125 毫秒。
为什么这么慢?我已经测试了 2 个不同的盒子。
当然他们必须改变一些东西,很明显?
【问题讨论】:
-
说实话,这并不是很多行。在我看来,数据库结构需要认真对待。
-
您是否检查过使用 DB 时慢的原因 - 网络请求本身或 DB 端的 SQL 查询执行?如果网络请求/响应很慢 - 看看你是否可以将数据库托管在靠近应用程序的地方,否则调整 sql 查询性能、表索引等
-
您说使用您使用的所有数据库选择数据都很慢。这在我心中提出了几个危险信号。您是否在选择中进行任何复杂的连接?你有复杂的where子句吗?您的数据库是否正确编入索引?
-
那么索引呢?它是否覆盖过滤器列?过滤器列是索引中的第一个还是您创建了一个包含 XX 列的索引?查询第一列是过滤器并包含选择值的索引甚至不应该是可测量的 - 除非过滤器返回大量记录,在这种情况下你不能真正责怪数据库。查询返回多少条记录?您的查询应尽可能有选择性,否则使用数据库没有多大意义
-
您要过滤的列似乎没有建立索引,或者如果是,则可能是索引高度碎片化。您可以通过运行 DBCC SHOWCONTIG 命令来验证这一点。我会尝试 DBCC SHOWCONTIG('tablename') 作为起点。有关更多选项,请参阅bit.ly/AsNWRE。
标签: c# database performance linq dynamic-linq