我有一个查询,其中包含where子句中的以下条件。这个条件会使查询输出减慢差不多1分钟。
{{1}}
请建议任何其他可以提供更快输出的替代方案。
提前致谢。
答案 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
然后索引。