如何选择sql索引

Fra*_*sis 6 sql sql-server sql-server-2005

如何选择sql索引

我有一个表格TabEmp与字段c_ID (primary key),和c_Emp_ID.

idx_TabEmp (non-clustered)用字段c_ID (primary key)和字符创建了一个索引c_Emp_ID

我正在使用select语句

select * from index = idx_TabEmp 
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误

Incorrect syntax near 'index'. If this is intended as a part of a table hint, A WITH keyword and parenthesis are now required. See SQL Server Books Online for proper syntax
Run Code Online (Sandbox Code Playgroud)

我在用

select * from TabEmp (index = idx_TabEmp)
Run Code Online (Sandbox Code Playgroud)

它有效,但我不确定这是否是选择索引的正确方法

你能告诉我查询索引的正确方法吗?

Sat*_*hat 8

索引是优化器"自动获取"的东西 - 理想情况下,您不需要强制选择索引.

如果您确实想强制选择索引,请使用索引提示

SELECT *
FROM TabEmp
WITH (INDEX(idx_TabEmp))
Run Code Online (Sandbox Code Playgroud)

此外,请注意,没有过滤条件(即没有WHERE条款),索引不会出现在图片中,因为您没有搜索特定数据 - 您正在选择所有内容.

提供书籍类比 - 当您阅读完整的书籍封面时 - 您无需查看索引.只有在您搜索特定页面时,才能查看索引并找到所需内容.


Raj*_*thi 8

这是表提示的语法.

SELECT column_list FROM table_name WITH (INDEX (index_name) [, ...]);
Run Code Online (Sandbox Code Playgroud)

在sql server中,根据你的错误我认为是你的情况.

至于索引是否被拾取(在oracle和sql server中)将取决于许多其他原因.如名称所示,它只是优化器的提示.使用提示和没有提示的查询的成本最终将成为优化器的决定因素.

在大多数情况下,您不会看到需要指定提示.如果使用索引是检索数据的最佳方式,并且所有元数据(统计信息)指示相同,则优化程序使用此访问路径.

  • 即使AFAIK导致一个荒谬的计划,它也会始终尊重暗示.例如在AdventureWorks中尝试`SELECT BirthDate FROM HumanResources.Employee WITH(INDEX(IX_Employee_OrganizationLevel_OrganizationNode))WHERE SickLeaveHours = 1` NCI不包含`BirthDate`或`SickLeaveHours`但仍然被使用. (2认同)