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

本文关键字:索引 查询 | 更新日期: 2023-09-27 18:34:08

Using C# & a SQL Server Express database

我有一个有 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

我想按索引顺序(降序目录/日期时间(查看该牛群的所有数据 - 最新的第一个,即。 所有特定牛群按降序排列

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以便根据需要显示数据呢?

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

这实际上是一种代码异味,强制使用特定索引通常是一种非常糟糕的做法(出于许多原因,您可以Google使用(,但这样做的方式是:

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

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

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

另外:强制使用索引并不能保证任何顺序!如果需要输出中的特定顺序,则必须为 SELECT 语句显式定义 ORDER BY 子句 - 没有其他方法可以执行此操作。

最后:由于您的表有四列,索引位于其中三列上,但您的SELECT使用*从表请求所有列,最有可能的是,SQL Server 查询优化器得出结论,扫描表(因为无论如何您都需要所有列(而不是使用索引更有效 - 再次: SQL Server 未使用索引的事实表明,在您的设置中,某些内容充其量是次优的。

解决根本原因 - 不要修补仅仅是症状.....