Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server don';不要使用特定的索引_Sql Server_Indexing - Fatal编程技术网

Sql server SQL Server don';不要使用特定的索引

Sql server SQL Server don';不要使用特定的索引,sql-server,indexing,Sql Server,Indexing,我有两种类型的查询。第一种需要按groupId获取一组行和一些附加条件(需要几个索引),第二种需要按id获取一行。然而,第一种查询类型使用一个索引,该索引中没有groupId,需要一段时间 目前我禁用了(id,…)索引,但我需要在某个时候重新启用它 我的索引: ix1_groupId_id2_id3_ival_iid ix2_groupId_id3_id2_ival_iid pk_id 我想写这样的东西: SELECT id2, COUNT(*) FROM table (WITHOUT(IND

我有两种类型的查询。第一种需要按groupId获取一组行和一些附加条件(需要几个索引),第二种需要按id获取一行。然而,第一种查询类型使用一个索引,该索引中没有groupId,需要一段时间

目前我禁用了(id,…)索引,但我需要在某个时候重新启用它

我的索引:

ix1_groupId_id2_id3_ival_iid
ix2_groupId_id3_id2_ival_iid
pk_id
我想写这样的东西:

SELECT id2, COUNT(*)
FROM table (WITHOUT(INDEX(pk_id))
WHERE groupId=x
GROUP BY id2

如何告诉SQL Server他不会使用pk_id index?

SQL Server无法排除索引以供查询优化器考虑。但是,您可以使用
WITH
关键字指定所需的索引。例如,要强制查询使用索引
ix1\u groupId\u id2\u id3\u ival\u iid

SELECT id2, COUNT(*)
FROM table (WITH(INDEX(ix1_groupId_id2_id3_ival_iid))
WHERE groupId=x
GROUP BY id2
在使用索引提示之前,我建议尝试理解为什么数据库不想使用索引。可能是因为表很小,所以表扫描比索引查找快。或者,这些索引的统计信息可能已经过时,因此优化器使用主键的速度似乎更快


索引提示会在架构上引入意外的代码依赖项。如果有人希望在将来更改索引名称,他们可能没有意识到此查询按名称请求索引,因此在使用新名称之前,查询现在将失败。

SQL Server无法排除索引以供查询优化器考虑。但是,您可以使用
WITH
关键字指定所需的索引。例如,要强制查询使用索引
ix1\u groupId\u id2\u id3\u ival\u iid

SELECT id2, COUNT(*)
FROM table (WITH(INDEX(ix1_groupId_id2_id3_ival_iid))
WHERE groupId=x
GROUP BY id2
在使用索引提示之前,我建议尝试理解为什么数据库不想使用索引。可能是因为表很小,所以表扫描比索引查找快。或者,这些索引的统计信息可能已经过时,因此优化器使用主键的速度似乎更快


索引提示会在架构上引入意外的代码依赖项。如果将来有人想更改索引名称,他们可能没有意识到此查询按名称请求索引,因此,在使用新名称之前,查询现在将失败。

我看不到任何问题……至少您需要发布您正在优化的表DDL和示例查询。不幸的是,没有查询提示告诉优化器,在不禁用某个给定索引的情况下,应将其排除在考虑范围之外;你只能告诉它要考虑哪些指标。因此,从技术上讲,您可以通过列出除您不想要的索引之外的所有索引来实现这一点。当然,这只能用于中间故障排除/测试,这不是您希望嵌入到生产查询中的内容。我看不出有什么问题……至少您需要发布您正在优化的表DDL和示例查询。不幸的是,没有查询提示告诉优化器应该排除给定索引,而不必禁用它;你只能告诉它要考虑哪些指标。因此,从技术上讲,您可以通过列出除您不想要的索引之外的所有索引来实现这一点。这只能用于中间故障排除/测试,当然,这不是您希望嵌入到生产查询中的内容。