我可以重新排列下面的查詢以任何其他形式嗎?where子句中的子串函數吃CPU時間
SELECT
ELIG_TYP
FROM TABLE1
WHERE COMPANY_CD IN
(SELECT SUBSTR(CMPNYID, 1, 4) FROM TABLE2 WHERE USR = 'Badshah')
我可以重新排列下面的查詢以任何其他形式嗎?where子句中的子串函數吃CPU時間
SELECT
ELIG_TYP
FROM TABLE1
WHERE COMPANY_CD IN
(SELECT SUBSTR(CMPNYID, 1, 4) FROM TABLE2 WHERE USR = 'Badshah')
你可以用做加盟:
SELECT ELIG_TYP
FROM TABLE1
INNER JOIN TABLE2 ON TABLE1.COMPANY_CD = LEFT(TABLE2.CMPNYID, 4)
AND USR = 'Badshah'
但是這也不能使用我認爲的索引,並且可能不會比OP更快。 –
嘗試使用** LEFT(TABLE2.CMPNYID,4)**,因爲我編輯了上面的查詢。 –
取決於Db2平臺和版本... IBM i的Db2允許您在LEFT(CMPNYID,4)上創建派生索引。 – Charles
嘗試用一個存在:
SELECT f1.ELIG_TYP
FROM TABLE1 f1
WHERE exists
(
SELECT * FROM TABLE2 f2
WHERE f2.USR = 'Badshah' and substr(f2.CMPNYID, 1, 4)=f1.COMPANY_CD
)
,或者如果你有仍然PERF的問題的嘗試可能是這樣的:
SELECT f1.ELIG_TYP
FROM TABLE1 f1
WHERE exists
(
SELECT * FROM TABLE2 f2
WHERE f2.USR = 'Badshah' and f2.CMPNYID like f1.COMPANY_CD || '%'
)
理想的情況是加入兩個表格的公司領域可以,而不需要求助於子串操作。就目前來看,我認爲你不能使用索引來進行這樣的連接。您可能需要考慮更改「TABLE2」的設計,以使直接連接成爲可能。 –
@TimBiegeleisen謝謝蒂姆 – user6583386
我的代碼不工作? – Esperento57