为什么操纵过滤列会影响索引效率?

时间:2017-03-17 06:13:39

标签: sql sql-server tsql

我正在阅读" Tsql Fundamental"作者Ben Itzik。

作者简要提到,如果我们想要有效地使用索引,我们就不应该操纵过滤的列。但他并没有真正详细说明为什么会这样。

有人可以请他解释背后的原因吗?

3 个答案:

答案 0 :(得分:2)

  

作者简要提到,如果我们想要有效地使用索引,我们就不应该操纵过滤的列

作者提到的内容称为SARGABILITY

假设此声明

select * from t1 where name='abc'

假设您在上面过滤的列上有索引

,然后查询是Sargable

但不低于一个

select * from t1 where len(name)=3

当SQL出现上面的查询时,唯一的方法是,它可以过滤掉数据是扫描表然后将谓词应用到每一行

答案 1 :(得分:2)

将索引视为电话目录(希望这仍然是一个熟悉的概念),其中每个人都按姓氏列出,然后是他们的地址。

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

但是,如果你想找到每个人(窃取TheGameiswar's example)有一个3个字母的姓氏,那么该指数对您有用吗?它可能比去参观镇上的每个房子稍微有用一点 1 ,但它并不像能够跳到适当的姓氏那么高效。你必须搜索整本书。

同样,如果你想找到住在特定街道上的每个人,索引就不那么有用了 2 - 你必须搜索整本书,以确保你找到了所有人。或者找到姓氏结束的所有人Son

1 这就是数据库可能选择执行索引扫描以满足查询的类比,因为索引较小,因此比全表扫描更容易。

2 这是对未尝试过滤索引中最左侧列的查询的类比。

答案 2 :(得分:1)

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

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

我希望这很清楚。