2017-03-17 78 views
0

我正在阅读Ben Itzik的“Tsql Fundamental”。为什么操纵过滤列会影响索引效率?

作者简单地提到,如果我们想要高效地使用索引,我们不应该操纵已过滤的列。但他并没有详细说明为什么会出现这种情况。

那么,有人可以请解释它背后的原因吗?

回答

2

笔者简要地提到,我们不应该操纵过滤柱,如果我们要使用索引有效

什么作者提到被称为SARGABILITY

假设这种说法

select * from t1 where name='abc' 

假设,你有上述过滤柱

索引,则查询优化搜索

但不低于一个

select * from t1 where len(name)=3 

当SQL是用上面的查询来提供的,唯一的办法就是可以将数据过滤掉扫描表格,然后将谓词应用到每一行

2

想象索引就像电话簿一样(希望这仍然是一个足够熟悉的概念),其中每个人都按姓氏排列,然后是他们的地址。

如果您想查找某人的电话号码并知道他们的姓氏(也可能是他们的地址),此索引非常有用。

但是,如果你想找到谁(盗取TheGameiswar's example)有3个字母姓氏的人 - 是否对你有用?这可能比必须去参观镇上的每个房子稍微有用,但它不能像跳到适当的姓氏那样有效。你必须搜索整本书。

同样,如果你想找到住在特定街道上的每个人,索引是不是很有用 - 你必须搜索整本书,以确保你找到了每个人。或查找,大家谁姓结束Son


这是当一个数据库可以选择执行索引扫描来满足查询,只是因为索引更小的类比所以比全表扫描更容易。

这是一个查询的类比,它不会尝试过滤索引中最左边的列。

1

SQL查询中的WHERE子句使用谓词来过滤行。谓词是一个表达式,用于确定应用于数据库对象的参数是true还是false。例如:“薪水> 5000”。

关系模型使用谓词作为过滤数据的核心元素。这些谓词应该以称为“搜索参数”的某种形式编写,以便查询优化器有效地使用WHERE子句中用于过滤数据的属性的索引。 谓词形式 - “列 - 运算符 - 值”或“值 - 运算符 - 列”被视为合适的搜索参数。示例 - 工资= 1000或工资> 5000。如您所见,列名应在表达式的一侧出现ALONE,常数或计算值应在另一侧以形成有效的搜索参数。在列名称上使用MAX,MIN,DATEADD或DATEDIFF等内置函数时,表达式不再被视为搜索参数,查询优化器不会使用这些列名称上的索引。

我希望这很清楚。