在.NET中有没有比SqlDataReader更快的东西?
我需要从SqlServer的表中将一列string加载到内存中使用C#的数组中。 有没有比打开SqlDataReader更快的方式,并通过它循环。 表格很大,时间很关键。
编辑我想构build.dll,并在服务器上使用它在数据库上的一些操作。 但现在是放缓了。 如果这是最快的,我必须重新devise数据库。 我强硬可能有一些解决scheme如何加快事情。
数据读取器
关于最快的访问你会得到SQL是与SqlDataReader 。
configuration文件
真正值得分析你的性能问题在哪里。 通常情况下,你认为性能问题是在你分析完成后certificate是完全错误的。
例如,它可能是:
- 时间…查询需要运行
- 时间…数据需要通过networking/进程边界进行复制
- 时间… .Net需要将数据加载到内存中
- 时间…你的代码需要做些什么
对每一个单独进行分析将会让你更好地了解你的瓶颈。 为了分析你的代码, 微软有一篇很棒的文章
caching它
要提高性能,需要考虑是否需要每次加载所有数据。 列表(或其中的一部分)可以被caching吗? 看看新的System.Runtime.Caching命名空间。
重写为T-SQL
如果你正在做纯粹的数据操作(正如你的问题所build议的那样),你可以重写你正在使用数据的代码作为T-SQL,并在SQL上本地运行。 这有可能会更快,因为您将直接处理数据,而不是将其转移。
如果你的代码有很多必要的程序逻辑,你可以尝试混合使用T-SQL和CLR Integration来给你两个世界的好处。
这很大程度上取决于你的逻辑的复杂性(或更多的程序性)。
如果一切都失败了
如果所有区域都是最佳(或接近),并且您的devise没有错误。 我甚至没有进入微型优化,我只是把硬件放在它 。
什么硬件? 尝试可靠性和性能监视器来找出瓶颈在哪里。 描述HDD或RAM的问题的可能性最大。
如果SqlDataReader
速度不够快,也许你应该把你的东西存储在其他地方,比如(内存中)caching。
不是。它实际上不仅是最快的方式 – 而且是唯一的(!)方式。 所有其他机制INTERNALLY无论如何使用DataReader。
我怀疑SqlDataReader
是一样好,你会得到。
SqlDataReader是最快的方法。 确保使用序号方法获取,而不是通过列名得到。 例如GetString(1);
另外值得一提的是在连接string中尝试MinPoolSize,以便池中总是有一些连接。
SqlDataReader将是最快的方法。 通过使用适当的Getxxx方法(以序号作为参数)来优化它的使用。
如果速度不够快,看看你是否可以调整你的查询。 在要检索的列上放置覆盖索引。 通过这样做,Sql Server只需要读取索引,而不必直接去表中检索所有需要的信息。
将一列的行转换为一列的行,而只有一行可以读? SqlDataReader
有一个读取单行的优化( ExecuteReader
System.Data.CommandBehavior.SingleRow
参数),所以也许它可以提高一点速度。
我看到几个优点:
- 单行改进,
- 每次迭代都不需要访问数组(
reader[0]
), - 将数组(
reader
)克隆到另一个数组可能比循环遍历元素并将每个元素添加到新数组要快。
另一方面,强制SQL数据库做更多的工作是不利的。
“提供从SQL Server数据库读取只向前stream的行的方法”这是使用MSDN中的SqlDataReader。 SqlDataReder后面的数据结构只允许向前读取,它是为单向读取数据而优化的。 在我看来,我想使用SqlDataReader比DataSet进行简单的数据读取。
您有4套开销 – 磁盘访问 – .net代码(cpu) – SQL服务器代码(cpu) – 在托pipe和非托pipe代码(cpu)之间切换的时间
首先是
select * where column = “junk”
对于你来说足够快,如果不是唯一的解决办法就是让磁盘更快。 (您可以从SQL Server获取数据比读取数据更快)
您可以在C#中定义一个Sql Server函数,然后在该列上运行该函数; 抱歉,我不知道该怎么做。 这可能比数据读取器更快。
如果你有多个CPU,并且你知道一个值在表的中间,你可以尝试使用多个线程。
你可能可以写一些TSQL,把所有的string组合成一个string,使用一个你知道是安全的分隔符。 然后在C#中再次分割string。 这将减less托pipe代码和非托pipe代码之间的往返次数。
一些表面层面的事情可能会影响速度(除了数据读取器):
- 数据库查询优化
- OrderBy是昂贵的
- 不同的是昂贵的
- RowCount是昂贵的
- GroupBy是昂贵的
- 等等。有时你不能没有这些东西,但是如果你可以在你的C#代码中处理这些东西,那可能会更快。
- 数据库表索引(对于初学者来说,你的WHERE子句中的字段是否被索引?)
- 数据库表数据types(你使用尽可能最小,给定的数据?)
- 为什么要将数据读取器转换为数组?
- 例如,它是否也可以创build一个适配器/数据表,然后您不需要转换为数组?
- 你看过entity framework? (可能会比较慢……但如果你没有select,可能值得查看只是为了确保)
只是随意的想法。 不知道什么可能有助于你的情况。
如果响应性是加载大量数据的问题,请查看使用asynchronous方法 – BeginReader。
我一直使用这个在应用程序继续响应的时候在后台填充大的GUI元素。
你还没有说明这个数据到底有多大,或者你为什么要把它们全部加载到一个数组中。
通常情况下,对于大量数据,您可能希望将其保留在数据库中,或让数据库执行繁重的工作。 但是我们需要知道你正在做什么样的处理,一次只需要一个数组。