基于SQL Server函数的无计算列索引

时间:2017-11-28 14:04:25

标签: sql sql-server indexing sql-server-2016

由于WHERE子句

,我的SQL Server查询运行缓慢
WHERE LEFT(CustomerId,3) = 'ABC'

我需要LEFT功能,因为有其他客户ID以'BCD','CDE'或'DEF'开头,我只想在结果中使用ABC。但是,我需要快速查询,但函数正在查杀它,导致索引扫描。

我知道在Oracle中有一种方法可以创建一个基于函数的索引,所以我可以做到

CREATE INDEX IX_Customer_ID ON Customer (LEFT(CustomerId,3))

我想在SQL Server中创建类似的功能。我知道我可以使用计算列并在该列上创建索引来完成此操作。但是,我想知道是否有办法在没有计算列的情况下执行此操作?

1 个答案:

答案 0 :(得分:4)

您无法基于SQL Server中的函数创建索引。但是,您可以在计算列上创建索引(具有限制,例如计算必须仅使用确定性函数)。

在您的特定情况下,您不必使用任何功能,只需稍微修改您的查询。

由于left(column, 3) = 'abc'等于column like 'abc%',您可以安全地使用它。当模式在开头包含常量时(在这种情况下为LIKE),SQL Server能够使用带有abc运算符的索引。