C#:强制查询使用特定索引

时间:2016-02-10 18:44:47

标签: c# .net sql-server-express

使用C#& SQL Server Express数据库

我的表格有4列FileHerdDirDateTime。主键是File

我在(Herd asc, Dir desc, DateTime desc)上创建了一个索引。

CREATE NONCLUSTERED INDEX[IX_HerdHist_tb_Herd]
N[HerdHist_tb] ([hh_HerdNumber] ASC, [hh_Dir] DESC,hh_DateTime] DESC);

当我查询表格时,我希望通过索引看到结果,而不是主键,这就是正在发生的事情。

如果表格包含以下内容:

File                  Herd     Dir      DateTime
------------------------------------------------------------
20160209\05010000.123 05010000 20160209 10:10:10 05:05:05pm
20160210\05010000.123 05010000 20160210 10:10:10 05:05:05pm
20160210\05010000.124 05010000 20160210 10:10:10 06:06:06pm
20160210\04011111.123 04011111 20160210 10:10:10 05:05:05pm

我选择了一只牛群并获得了。

20160209\05010000.123 05010000 20160209 10:10:10 05:05:05pm
20160210\05010000.123 05010000 20160210 10:10:10 05:05:05pm
20160210\05010000.124 05010000 20160210 10:10:10 06:06:06pm

我希望按照索引的顺序(降序Dir / DateTime)查看该Herd的所有数据 - 最新的,即...所有特定的Herd按降序排列

20160210\05010000.124 05010000 20160210 10:10:10 06:06:06pm
20160210\05010000.123 05010000 20160210 10:10:10 05:05:05pm
20160209\05010000.123 05010000 20160209 10:10:10 05:05:05pm

代码:

SqlCommand myCommand = new SqlCommand("select * from HerdHist_tb where (hh_HerdNumber = @hh_HerdNumber)", myconnection);

myCommand.Parameters.AddWithValue("@hh_HerdNumber", v_herdNumber);

那么如何强制查询使用索引IX_herdHist_tb_Herd以便数据显示在我需要的位置?

2 个答案:

答案 0 :(得分:2)

这实际上是一种代码气味,强制使用特定索引通常是一种非常糟糕的做法(出于很多原因,你可以使用谷歌),但你做的方式是:

select *
from HerdHist_tb
    WITH (INDEX(IX_herdHist_tb_Herd))
where (hh_HerdNumber = @hh_HerdNumber)

此外,无法保证索引不会在查询中使用。您可能只想在查询中订购结果:

select *
from HerdHist_tb
where (hh_HerdNumber = @hh_HerdNumber)
order by hh_HerdNumber ASC

检查您的查询/执行计划,以便更深入地了解索引是否实际被使用。

答案 1 :(得分:1)

首先 - 强制查询使用索引表示设计错误或编程错误 - 或两者兼而有之。你永远不需要这样做。

另外:强制使用索引保证任何订单!如果您的输出中需要特定订单,则必须明确为您的ORDER BY声明定义SELECT条款 - 没有其他方法可以执行此操作。< / p>

最后:由于您的表有四列,因此索引位于其中三列,但您的SELECT使用*从表中请求所有列,最有可能的是,SQL Server查询优化器得出的结论是,扫描表格效率更高(因为您无论如何都需要所有列)而不是使用索引 - 再次:SQL Server isn& #39;使用索引表明某些东西 - 充其量 - 在您的设置中不是最理想的。

修复根本原因 - 不要仅仅修补一下症状......