SQL子字符串子查询花费太长时间
我当前的子查询正在执行:26秒。我将以下查询用作子查询作为另一个代码的一部分,这些代码在一个月内需要2分钟和25秒才能返回数据。SQL子字符串子查询花费太长时间
是否有更快的查询?当前的procedureID包含字母和数字字符。我只想要以数字字符开头的ProcedureID。
SELECT DISTINCT
ProcedureID
FROM Transactions
WHERE Substring(ProcedureID,1,1) NOT LIKE '[A-z]%'
在启用执行计划的情况下运行查询。这应该确定可能有帮助的任何索引。另外,如果添加一个长为1个字符的新列,并填充了ProcedureID的第一个字符并向该列添加索引,那么在查询基于该列而不是substring()查询时应该会获得更好的性能你已经使用过。
试试这个: WHERE则IsNumeric(子串(ProcedureID,1,1))= 1
如果你这样做往往不够,它可能是值得创建一个仅包含ProcedureID的第一个字符计算列。
首先,问题不大可能是substring()
。表演猪是select distinct
。
你可以简化逻辑。喜欢的东西:
SELECT DISTINCT ProcedureID
FROM Transactions
WHERE ProcedureID < 'A' or ProcedureID >= '{' -- 'z' + 1
或:
WHERE ProcedureId >= '0' AND ProcedureId < ':' -- '9' + 1
魔术characacters '{'
和':'
只是遵循 “Z” 和 “9” 的字符的ASCII值。如果您愿意,可以用CHR(ASCII('9') + 1)
等表达式替换它们。
但是,这可能对性能影响最小。 Transactions(ProcedureID)
上的索引会有帮助,因为它涵盖了查询/子查询。
如果你真的想要更大的查询帮助,你应该问另一个的问题,并提供你真正想要优化(或者代表性更简单的版本)的查询。
编辑:
你实际上可能会发现这样的版本是正确的索引要快得多:
SELECT p.ProcedureId
FROM Procedures p
WHERE p.ProcedureId >= '0' AND p.ProcedureId < ':' AND -- '9' + 1
EXISTS (SELECT 1 FROM Transactions t WHERE t.ProcedureId = p.ProcedureId);
这是假设你有一个表,其中ProcedureId
是主键。
然后,对于性能,您需要一个索引Transactions(ProcedureId)
。
这会更简单:'WHERE ProcedureID不在'A'和'z''之间 – RToyo
@RobbieToyota。 。 。不,''za''会符合这个条件。 –
看来你使用的是REGEXP不是像
SELECT DISTINCT
ProcedureID
FROM Transactions
WHERE Substring(ProcedureID,1,1) NOT REGEXP '^[A-z]'
它看起来并不像你需要在这里使用字符串。你可以做'WHERE ProcedureID NOT LIKE'[A-Z]%''。它会检查第一个字符是否是字母,并忽略其余字符。另外,确保将ProcedureID编入索引! – RToyo
使用正面检查。消极条件需要更多时间。 – Amit
我添加了基于'LIKE'模式语法的SQL Server标记。 –