【问题标题】:Does SqlDataReader take into account the NonClustered Index on database?SqlDataReader 是否考虑数据库上的非聚集索引?
【发布时间】:2016-06-03 17:35:34
【问题描述】:

c#“SqlDataReader”是否考虑了数据库中存在的NonClustered索引?

例如我在数据库上创建了索引:

Create nonClustered Index x1 on [MyDB].[dbo].[Customers] (CustomerID)

然后在 c# 代码中我执行以下操作:

String sqlQry="Select CustomerId from [MyDB].[dbo].[Customers] where CustomerID=123456";
SqlCommand cmdFindCustomer = new SqlCommand(sqlQry, SQLConnectionObj);
SqlDataReader r = cmdFindCustomer.ExecuteReader();

【问题讨论】:

  • 这与SqlDataReader 完全无关。一个查询就是一个查询,不管它来自哪里。优化器会使用您创建的索引吗?很可能,是的。但客户端代码如何执行查询无关紧要。
  • 如上所述。没有任何关系。
  • 非聚集索引是为了确保在多用户环境中创建唯一键(id)。非集群是当您有多个服务器用于数据库时。通常你会在聚簇索引上附加一个修正号,这样每个服务器的 id 都会不同。服务器一附加 100001 + 非聚集索引。服务器二追加 100002 + 非聚集索引。
  • 啊!查询确实使用索引。谢谢杰伦。
  • @jdweng 你绝对离正确答案还差得很远。聚集/非聚集索引与多台服务器完全无关。请阅读this page from the msdn 以了解它们的实际描述。你描述的是identity range management

标签: c# sql-server indexing sqldatareader


【解决方案1】:

c#“SqlDataReader”是否考虑了 NonClustered 索引 存在于数据库中?

不,对象不知道索引。

假设您的问题是,何时在 SQL Server 的查询计划中使用非聚集索引,这取决于。优化器通常比我们其他人聪明得多,但如果您愿意,您可以强制使用带有提示的索引。当然,如果您检查了查询计划并且它没有被使用,这是当然的。

要查看您的索引是否正在使用(GUI 路由),请单击 SQL Server Management Studio 中的显示实际执行计划并运行您的查询。它将位于一个单独的选项卡上,并以您应该从右到左、从下到上阅读的格式显示操作。在您的索引上寻找一个希望索引搜索的操作。如果你没有看到它,它就没有被使用。下一步是什么?

对索引架构进行研究。 MSDN 对如何设计和实现好的索引有很好的阅读。其他一些值得一试的资源是行业内的优秀顾问,例如 Paul Randal 和 Brent Ozar。

【讨论】:

  • 我移除了我不再虔诚的 cmets
【解决方案2】:

没有。 SQL Server 的查询引擎将确定他将用于获取数据的最佳索引是什么。

使用 SqlDataReader 对象不会影响键的使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 2010-11-17
    • 1970-01-01
    • 2012-08-26
    • 2019-02-13
    • 2013-08-07
    • 2010-11-18
    相关资源
    最近更新 更多