Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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 强制使用索引可以提高性能吗?_Sql_Tsql - Fatal编程技术网

Sql 强制使用索引可以提高性能吗?

Sql 强制使用索引可以提高性能吗?,sql,tsql,Sql,Tsql,假设我们有这样一个查询: select a.col1, b.col2 from t1 a inner join t2 b on a.col1 = b.col2 where a.col1 = 'abc' col1和col2都没有任何索引 如果我在where子句上添加另一个限制,该限制总是正确的,但是带有索引的列: select a.col1, b.col2 from t1 a inner join t2 b on a.col1 = b.col2 where a.col1 = 'abc' and

假设我们有这样一个查询:

select a.col1, b.col2
from t1 a
inner join t2 b on a.col1 = b.col2
where a.col1 = 'abc'
col1
col2
都没有任何索引


如果我在where子句上添加另一个限制,该限制总是正确的,但是带有索引的列:

select a.col1, b.col2
from t1 a
inner join t2 b on a.col1 = b.col2
where a.col1 = 'abc'
and a.id >= 0  -- column always true and with index

查询可能会执行得更快,因为它可能会使用
id
列上的索引?

可能(但不太可能)。这完全取决于查询优化程序对您的查询进行评估的方式。更好的选择是使用提示。

可能(但不太可能)。这完全取决于查询优化程序对您的查询进行评估的方式。更好的选择是使用提示。

使用
id
上的索引做什么

这里最昂贵的部分是连接列上的连接,而
id
与此无关

最有可能的情况是,这没有什么区别

可能的结果是:它会花费更多的时间,因为它无法计算出
id
总是大于零,因此它会进行索引扫描以找到正确的行,然后从中获得与表扫描相同的行(如果有一个
INCLUDE
覆盖相关列,可能会有所不同)

奇怪的结果:嗯,在数据库优化的世界里发生了一些奇怪的事情,所以如果它有帮助的话,我不会吃我的帽子,但我仍然会感到非常惊讶

实际上,用不相关的索引强制进行不相关的工作对你的事业没有帮助


编辑:事实上,我想到了一种可能会有所帮助的情况。SQLServer通常会使用一些索引进行搜索,而没有直接相关的索引,因为即使在这种情况下,搜索通常也比扫描好。如果出于某种原因,搜索更好,并且出于某些原因,强制在不同的索引上进行搜索可能会改善情况在它上面选择了一个不同的搜索。不过我还是会很惊讶。

使用
id
上的索引做什么

这里最昂贵的部分是连接列上的连接,而
id
与此无关

最有可能的情况是,这没有什么区别

可能的结果是:它会花费更多的时间,因为它无法计算出
id
总是大于零,因此它会进行索引扫描以找到正确的行,然后从中获得与表扫描相同的行(如果有一个
INCLUDE
覆盖相关列,可能会有所不同)

奇怪的结果:嗯,在数据库优化的世界里发生了一些奇怪的事情,所以如果它有帮助的话,我不会吃我的帽子,但我仍然会感到非常惊讶

实际上,用不相关的索引强制进行不相关的工作对你的事业没有帮助


编辑:事实上,我想到了一种可能会有所帮助的情况。SQLServer通常会使用一些索引进行搜索,而没有直接相关的索引,因为即使在这种情况下,搜索通常也比扫描好。如果出于某种原因,搜索更好,并且出于某些原因,强制在不同的索引上进行搜索可能会改善情况它选择了另一个来搜索。不过我还是很惊讶。

我认为它实际上会更糟。因为如果它在这里使用索引来检索所有行,那么与简单地检索所有行相比,这是额外的工作。

我认为它实际上会更糟。因为如果它在这里使用索引来检索所有行,那么这就是extra比简单地检索所有行更有效。

问题的答案是肯定的,如果它过滤掉表a中足够多的行,它可以提高性能。

问题的答案是肯定的,如果它过滤掉表a中足够多的行,它可以提高性能。

除非
和a.id>=0减少行数,可能没有。可能在第二种情况下使用的索引是优化器不会为第一种情况选择的。例如,列
id
col1
上的表
t1
的复合索引可能不会在第一个查询中显示帮助,但允许第二个查询减少I/O(假定)与每页的表行数相比,每页索引项的密度更大。@HABO很好地发现,可能是这样的!除非
和a.id>=0
减少行数,否则可能不存在第二种情况下使用的索引,而优化器不会选择第一种情况。例如,复合表
t1
id
col1
列上的索引在第一次查询时可能不会显示帮助信息,但允许第二次查询由于以下原因减少I/O(假定)与每页表行相比,每页索引项的密度更大。@HABO发现得很好,可能是这样的!好的,谢谢Walter White:P我提出这个问题是因为有些人在银行的DB2中使用它,出于某种原因,它要快得多。@aF.Walter White?啊,我想它比Anton Lavy好。你能得到一个分析它为什么有用?我记得
where id=id
曾出于类似的原因帮助过一次查询,但我认为这已经是过去的事了。(此外,只需添加真正有用的索引即可)。关于DB2,我不知道如何做:(关于Anton Lavey(撒旦主义者等)和Walter White(毒枭等)我不知道哪一个更好:POk,谢谢Walter White:P我提出这个问题是因为有些人在银行的DB2中使用它,而且出于某种原因它要快得多。@aF.Walter White?啊,我想它比Anton LaVey好。你能分析一下为什么它有帮助吗?我记得
where id=id
曾经帮助si查询过一次我有足够的理由,但我认为这已经是过去的事了。(此外,只需添加真正有帮助的索引即可)。关于DB2,我不知道如何做:(关于Anton Lavey(撒旦主义者)