2017-08-11 154 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]'