鍍金池/ 問(wèn)答/Java  Linux  數(shù)據(jù)庫(kù)/ javaweb應(yīng)用中出現(xiàn)了一個(gè)耗時(shí)異常長(zhǎng)的數(shù)據(jù)查詢(xún),尋求幫助

javaweb應(yīng)用中出現(xiàn)了一個(gè)耗時(shí)異常長(zhǎng)的數(shù)據(jù)查詢(xún),尋求幫助

項(xiàng)目使用SSM,oracle 11g,linux服務(wù)器,生產(chǎn)環(huán)境與測(cè)試環(huán)境代碼相同,數(shù)據(jù)庫(kù)不同,相關(guān)細(xì)節(jié)配置可能不同。
業(yè)務(wù)需要根據(jù)關(guān)鍵字查詢(xún)系統(tǒng)中人員的相關(guān)信息,用戶(hù)輸入一個(gè)關(guān)鍵字,能夠模糊查詢(xún)一張視圖中4個(gè)字段的數(shù)據(jù)。

SELECT
    A .userId,
    A .account,
    A .name,
    A .mobile,
    A .code,
    A .phone,
    A .email,
    A .sort
FROM
    USER A
INNER JOIN USER_ORG b ON A .userId = b.userId
INNER JOIN ORG c ON b.orgId = c.orgId
WHERE
    (a.name LIKE '%18888888888%' OR a.mobile LIKE '%18888888888%' OR a.phone LIKE '%18888888888%' OR a.email LIKE '%18888888888%')
AND A .userId != 100000000000000 
AND c.isAvalible = 1
ORDER BY
    A .sort ASC

查詢(xún)語(yǔ)句如上,應(yīng)該并不復(fù)雜,USER數(shù)據(jù)量15000左右,ORG數(shù)據(jù)量1000左右。通過(guò)plsql直接查庫(kù),耗時(shí)0.5s左右。項(xiàng)目上線運(yùn)行初期,這個(gè)查詢(xún)響應(yīng)正常。幾天后上線另一個(gè)頁(yè)面,同樣使用了這個(gè)查詢(xún)接口(代碼邏輯基本一致,調(diào)用Service中同一個(gè)方法,指向map中同一個(gè)sql,只有拼接語(yǔ)句時(shí)的一個(gè)if判斷條件不同,最終呈現(xiàn)的查詢(xún)語(yǔ)句是相同的),響應(yīng)耗時(shí)正常。但前一個(gè)頁(yè)面在執(zhí)行這個(gè)查詢(xún)時(shí)出現(xiàn)了問(wèn)題,后臺(tái)拋出如下異常:
圖片描述

登錄數(shù)據(jù)庫(kù)服務(wù)器排查,發(fā)現(xiàn)500多G的臨時(shí)表空間使用達(dá)到100%,只剩余十幾M。加大臨時(shí)表空間后,不再報(bào)錯(cuò),但是這個(gè)查詢(xún)變得異常耗時(shí)。
但項(xiàng)目中其他查詢(xún)都還能正常執(zhí)行,好像沒(méi)有出現(xiàn)同樣的狀況,包括前面提到的使用同一個(gè)查詢(xún)方法的頁(yè)面。

在測(cè)試環(huán)境和生產(chǎn)環(huán)境上對(duì)出現(xiàn)問(wèn)題的查詢(xún)打印代碼執(zhí)行的耗時(shí),如下圖:
測(cè)試環(huán)境:
圖片描述
正式環(huán)境:
圖片描述

生產(chǎn)環(huán)境與測(cè)試環(huán)境代碼相同,數(shù)據(jù)庫(kù)不同,相關(guān)細(xì)節(jié)配置可能不同?,F(xiàn)在沒(méi)有頭緒是哪里出了問(wèn)題……求助>_<!

回答
編輯回答
雨萌萌

這幾個(gè)字段都很小, 如果查詢(xún)條件相對(duì)固定的話(huà),可以把這幾個(gè)字自段連一塊,形成一個(gè)字個(gè)段, 或物化視圖,并對(duì)此字段建索引. 然后只需查一個(gè)字段即可.

還有就是userid!=xxx, 最好改成(userid>xxx and userid<xxx), 也許我的經(jīng)驗(yàn)過(guò)時(shí)了, 但至少值得一試.

2018年8月31日 11:14