這幾天在項目上遇到一個問題,說是一個業務列表的查詢很慢。記得之前這個功能並沒有遇到這個情況,而且根據客戶的描述,是最近一段時間開始變慢的。於是從後臺拿出了不知道是誰寫的sal語句,檢查了一下,發現其中的一個子查詢語句是這樣的:
SELECT
BSNUM,
STATE AS FILE_STATE
FROM
file_record r
WHERE
EXISTS(
SELECT
BSNUM,
STATE
FROM
(
SELECT
BSNUM,
MAX(STATE) AS STATE
FROM
file_record
GROUP BY
BSNUM
) x
WHERE
r.BSNUM = x.BSNUM
AND r.STATE = x.STATE
)
簡單的看了一下這個語句,應該是想查出這個表中state值最大的業務對應的bsnum和state這兩個字段的值。但是用原有的方法未免太麻煩,而且效率低下,於是優化了一下sql語句,改成這樣的:
SELECT
bsnum,
STATE AS FILE_STATE
FROM
FILE_RECORD r
WHERE
STATE =(
SELECT
MAX(STATE)
FROM
FILE_RECORD
WHERE
bsnum = r.bsnum
);
將修改前後的兩個語句在數據量大的生產環境分別執行一下,發現查詢時間差距居然如此之大:
之前只是知道,用第一種這樣的蠢蠢的查詢方式,效率很低,但是沒有想到二者差距這麼大。爲什麼之前這裏沒有發現問題呢?因爲一開始的時候數據量不是很大,所以倒是也沒有太影響系統使用。不過隨着數據量慢慢的變多,到現在已經有幾十萬條數據了,所以查詢速度自然就變得慢下來了。