SqlDataReader是这两个相同哪一个更快

时间:2011-10-20 05:34:42

标签: c# sql ado.net sqldatareader sqlxml

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

  1. sqlDataReaderInstance.GetString(0);

  2. sqlDataReaderInstance[0];

3 个答案:

答案 0 :(得分:6)

  

并且听说通过序数从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,将列名称映射到序列,这可以提高性能。

答案 1 :(得分:4)

与从磁盘获取数据的速度相比,两者的速度都会相同。

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

因此虽然DBNull可能会稍微慢一点,但是当你使用它时,你仍然会转换为字符串。

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

答案 2 :(得分:1)

Indexer方法更快,因为它返回native format中的数据并使用序数。

看看这些主题:

  1. Maximize Performance with SqlDataReader
  2. .NET SqlDataReader Item[] vs. GetString(GetOrdinal())?