使用C#& SQL Server Express数据库
我的表格有4列File
,Herd
,Dir
,DateTime
。主键是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
以便数据显示在我需要的位置?
答案 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;使用索引表明某些东西 - 充其量 - 在您的设置中不是最理想的。
修复根本原因 - 不要仅仅修补一下症状......