where子句中的substring函数减慢查询速度

时间:2015-09-26 05:37:02

标签: sql-server

我有一个查询,其中包含where子句中的以下条件。这个条件会使查询输出减慢差不多1分钟。

{{1}}

请建议任何其他可以提供更快输出的替代方案。

提前致谢。

2 个答案:

答案 0 :(得分:3)

我认为Thilo试图说的是你应该在你的表中添加一个持久的计算列并将其编入索引,然后在搜索条件中使用它。

通过这样的状态代码执行:

alter table YourTable 
add NewColumnName as 
  substring(StatusCode,1,CHARINDEX('-',StatusCode)-1) persisted

或比较:

alter table YourTable
add NewColumnName as 
  case when SysStatus = substring(StatusCode,1,CHARINDEX('-',StatusCode)-1)
  then 1 else 0 end persisted

哪个更好取决于其他用法,如果你也需要在其他条款中包含该列的第一部分,那么这更有用但是如果你总是只需要比较相等到SysStatus,然后我会创建后者。如果匹配很少,您也可以考虑过滤索引。

答案 1 :(得分:0)

该计算可能会阻止有效的索引访问路径。

您可以在计算列值或整个相等条件上构建“功能索引”。如果数据库不提供那种索引,则对一个位进行非规范化并将子字符串/标志存储在第二列中。

在SQL-Server中,您应该be able to do something like

ALTER TABLE b ADD COLUMN match_status_code 
  AS CASE WHEN 
    sys_status = substring(StatusCode,1,CHARINDEX('-',StatusCode)-1)
  THEN 1 ELSE 0 END

然后索引。