2017-08-11 113 views
0

我当前的子查询正在执行:26秒。我将以下查询用作子查询作为另一个代码的一部分,这些代码在一个月内需要2分钟和25秒才能返回数据。SQL子字符串子查询花费太长时间

是否有更快的查询?当前的procedureID包含字母和数字字符。我只想要以数字字符开头的ProcedureID。

SELECT DISTINCT 
ProcedureID 
FROM Transactions 
WHERE Substring(ProcedureID,1,1) NOT LIKE '[A-z]%' 
+2

它看起来并不像你需要在这里使用字符串。你可以做'WHERE ProcedureID NOT LIKE'[A-Z]%''。它会检查第一个字符是否是字母,并忽略其余字符。另外,确保将ProcedureID编入索引! – RToyo

+0

使用正面检查。消极条件需要更多时间。 – Amit

+0

我添加了基于'LIKE'模式语法的SQL Server标记。 –

回答

2

在启用执行计划的情况下运行查询。这应该确定可能有帮助的任何索引。另外,如果添加一个长为1个字符的新列,并填充了ProcedureID的第一个字符并向该列添加索引,那么在查询基于该列而不是substring()查询时应该会获得更好的性能你已经使用过。

0

试试这个: WHERE则IsNumeric(子串(ProcedureID,1,1))= 1

如果你这样做往往不够,它可能是值得创建一个仅包含ProcedureID的第一个字符计算列。

2

首先,问题不大可能是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)

+0

这会更简单:'WHERE ProcedureID不在'A'和'z''之间 – RToyo

+0

@RobbieToyota。 。 。不,''za''会符合这个条件。 –

0

看来你使用的是REGEXP不是像

SELECT DISTINCT 
    ProcedureID 
    FROM Transactions 
    WHERE Substring(ProcedureID,1,1) NOT REGEXP '^[A-z]'