關於SQL最大值查詢語句的記錄

這幾天在項目上遇到一個問題,說是一個業務列表的查詢很慢。記得之前這個功能並沒有遇到這個情況,而且根據客戶的描述,是最近一段時間開始變慢的。於是從後臺拿出了不知道是誰寫的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
	);
將修改前後的兩個語句在數據量大的生產環境分別執行一下,發現查詢時間差距居然如此之大:

之前只是知道,用第一種這樣的蠢蠢的查詢方式,效率很低,但是沒有想到二者差距這麼大。爲什麼之前這裏沒有發現問題呢?因爲一開始的時候數據量不是很大,所以倒是也沒有太影響系統使用。不過隨着數據量慢慢的變多,到現在已經有幾十萬條數據了,所以查詢速度自然就變得慢下來了。



發佈了29 篇原創文章 · 獲贊 70 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章