有没有比.NET中的SqlDataReader更快的东西?

时间:2010-09-16 11:12:57

标签: c# sql sql-server ado.net sqldatareader

我需要使用C#将SqlServer上的表中的一列字符串加载到内存中的Array中。 有没有比打开SqlDataReader更快的方法并循环它。 表很大,时间很关键。

EDIT 我正在尝试构建.dll并在服务器上使用它来进行数据库上的某些操作。但现在要放慢速度。如果这比我重新设计数据库要快。我很难说可能会有一些解决方案如何加快速度。

11 个答案:

答案 0 :(得分:51)

数据读取器

关于最快的访问权限,您将使用SqlDataReader访问SQL。

个人资料

值得实际分析您的性能问题。通常,在您认为性能问题出现之后,在您对其进行分析后证明是完全错误的。

例如,它可能是:

  1. 时间...查询需要运行
  2. 时间......数据需要通过网络/进程边界进行复制
  3. 时间...... .Net将数据加载到内存中
  4. 时间......你的代码需要用它做点什么
  5. 单独分析这些内容可以让您更好地了解瓶颈的位置。对于分析代码,有一个great article from Microsoft

    缓存

    要提高性能的目的是找出如果你需要每次加载所有数据。可以缓存列表(或其中的一部分)吗?看一下新的System.Runtime.Caching命名空间。

    重写为T-SQL

    如果您正在进行纯粹的数据操作(正如您的问题所示),您可以重写使用数据为T-SQL并在SQL上本机运行的代码。这有可能更快,因为您将直接处理数据而不是转移它。

    如果你的代码有很多必要的程序逻辑,你可以尝试将T-SQL与CLR Integration混合使用,为你提供两个世界的好处。

    这很大程度上归结为逻辑的复杂性(或更多程序性)。

    如果其他所有方法都失败

    如果所有区域都是最佳的(或接近),并且您的设计没有错误。我甚至不会进入微观优化,我只是throw hardware at it

    什么硬件?试试reliability and performance monitor找出瓶颈的位置。最有可能解决您描述HDD或RAM的问题。

答案 1 :(得分:19)

如果SqlDataReader不够快,也许你应该把你的东西存放在其他地方,比如(内存中)缓存。

答案 2 :(得分:17)

没有。它实际上不仅是最快的方式 - 它是唯一的(!)方式。所有其他机制无论如何都在内部使用DataReader。

答案 3 :(得分:9)

我怀疑SqlDataReader与您将获得的一样好。

答案 4 :(得分:5)

SqlDataReader是最快的方法。确保使用get by序数方法而不是按列名称获取。例如GetString的(1);

同样值得的是在连接字符串中试验MinPoolSize,以便池中总有一些连接。

答案 5 :(得分:3)

SqlDataReader将是最快的方式。 通过使用适当的Getxxx方法优化其使用,该方法将序数作为参数。

如果速度不够快,请查看是否可以调整查询。在要检索的列上放置覆盖索引。通过这样做,Sql Server只需读取索引,而不必直接转到表中以检索所需的所有信息。

答案 6 :(得分:2)

如何将一列行转换为一行列,并且只读取一行? SqlDataReader优先读取单行(System.Data.CommandBehavior.SingleRow的{​​{1}}参数),因此可能会稍微提高速度。

我看到了几个优点:

  • 单行改进,
  • 无需在每次迭代(ExecuteReader),
  • 上访问数组
  • 将数组(reader[0])克隆到另一个数组可能比循环遍历元素并将每个数组添加到新数组更快。

另一方面,强制SQL数据库做更多的工作是不利的。

答案 7 :(得分:1)

“提供了一种从SQL Server数据库中读取仅向前行的方法”这是使用MSDN中的SqlDataReader。 SqlDataReder背后的数据结构只允许读取,它被优化用于在一个方向上读取数据。在我看来,我想使用SqlDataReader而不是DataSet来进行简单的数据读取。

答案 8 :(得分:1)

您有4组开销 - 磁盘访问 - .net代码(cpu) - SQL服务器代码(cpu) - 在托管代码和非托管代码(cpu)之间切换的时间

首先是

select * where column = “junk” 

对你来说足够快,如果不是唯一的解决方案是让磁盘更快。 (您可以更快地从SQL Server获取数据)

您可以在C#中定义Sql Server函数,然后在列上运行该函数;对不起,我不知道怎么做。这可能比数据阅读器更快。

如果您有多个CPU,并且您知道表中间的值,则可以尝试使用多个线程。

您可以使用您知道安全的分隔符编写一些将所有字符串组合成单个字符串的TSQL。然后在C#中再次拆分字符串。这将减少托管代码和非托管代码之间的往返次数。

答案 9 :(得分:1)

要考虑的一些表面级别的事情可能会影响速度(除了数据阅读器):

  1. 数据库查询优化
    • OrderBy很贵
    • 区别很贵
    • RowCount很贵
    • GroupBy很贵
    • 等。有时你不能没有这些东西,但如果你能用C#代码处理其中的一些东西,它可能会更快。
  2. 数据库表索引(对于初学者,您的WHERE子句中的字段是否已编入索引?)
  3. 数据库表数据类型(在给定数据的情况下,您使用的是最小的吗?)
  4. 为什么要将datareader转换为数组?
    • 例如,它是否也可以创建一个您不需要转换为数组的适配器/数据表?
  5. 您是否查看了实体框架? (可能会更慢......但如果你没有选择,可能值得研究一下以确保)
  6. 只是随机的想法。不确定在你的情况下可能会有什么帮助。

答案 10 :(得分:0)

如果响应是加载大量数据的问题,请查看使用异步方法 - BeginReader。

我一直使用这个来在后台填充大型GUI元素,同时应用程序继续响应。

您还没有确切地说明这些数据的大小,或者为什么要将它们全部加载到数组中。

通常,对于大量数据,您可能希望将其保留在数据库中,或者让数据库完成繁重的工作。但是我们需要知道你正在做什么样的处理,一次需要一个阵列。