SqlDataReader这两个是相同的,哪个更快

本文关键字:两个 SqlDataReader | 更新日期: 2023-09-27 18:11:52

我正在处理SqlXml和返回xml而不是原始数据的存储过程。当返回的是xml且不知道列名时,如何实际读取数据呢?我使用了下面的版本,并且听说通过序号从SqlDataReader获取数据比通过列名更快。请给出最好的建议,并提供有效的理由或证据

  1. sqlDataReaderInstance.GetString(0);

  2. sqlDataReaderInstance[0];

SqlDataReader这两个是相同的,哪个更快

并且听说通过序号比通过列名

从SqlDataReader获取数据要快。

您的两个示例都是通过索引(序数)获取数据,而不是列名:

通过列名获取数据:

while(reader.Read())
{
    ...
    var value = reader["MyColumnName"];
    ...
}

可能比通过索引

获取数据要慢。
int myColumnIndex = reader.GetOrdinal("MyColumnName");
while(reader.Read())
{
    ...
    var value = reader[myColumnIndex];
    ...
}

,因为第一个示例必须重复查找与"MyColumnName"对应的索引。如果您有非常多的行,差异甚至可能是明显的。

在大多数情况下,这种差异不会很明显,所以要注意可读性。

如果您确实关心性能,使用序数的另一种选择是使用DbEnumerator类,如下所示:

foreach(IDataRecord record in new DbEnumerator(reader))
{
    ...
    var value = record["MyColumnName"];
    ...
}

DbEnumerator类读取一次模式,并维护一个内部HashTable,将列名映射到序数,这可以提高性能。

与从磁盘获取数据的速度相比,两者实际上是一样快的。

这两个调用是不相等的:带有索引器的版本返回一个对象,而GetString()将对象转换为字符串,如果这是不可能的(即列是DBNull),则抛出异常。

因此,尽管GetString()可能稍微慢一些,但当您使用它时,无论如何都将转换为字符串。

考虑到以上所有情况,我会使用GetString()

Indexer方法更快,因为它以本机格式返回数据并使用序数。

看看这些线程:

  1. SqlDataReader
  2. 性能最大化
  3. 。. NET SqlDataReader Item[] vs. GetString(GetOrdinal())?