我當前的子查詢正在執行:26秒。我將以下查詢用作子查詢作爲另一個代碼的一部分,這些代碼在一個月內需要2分鐘和25秒才能返回數據。SQL子字符串子查詢花費太長時間
是否有更快的查詢?當前的procedureID包含字母和數字字符。我只想要以數字字符開頭的ProcedureID。
SELECT DISTINCT
ProcedureID
FROM Transactions
WHERE Substring(ProcedureID,1,1) NOT LIKE '[A-z]%'
我當前的子查詢正在執行: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標記。 –