1. 程式人生 > >關於SQL最大值查詢語句的記錄

關於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
	);
將修改前後的兩個語句在資料量大的生產環境分別執行一下,發現查詢時間差距居然如此之大:
之前只是知道,用第一種這樣的蠢蠢的查詢方式,效率很低,但是沒有想到二者差距這麼大。為什麼之前這裡沒有發現問題呢?因為一開始的時候資料量不是很大,所以倒是也沒有太影響系統使用。不過隨著資料量慢慢的變多,到現在已經有幾十萬條資料了,所以查詢速度自然就變得慢下來了。

相關推薦

關於SQL查詢語句記錄

這幾天在專案上遇到一個問題,說是一個業務列表的查詢很慢。記得之前這個功能並沒有遇到這個情況,而且根據客戶的描述,是最近一段時間開始變慢的。於是從後臺拿出了不知道是誰寫的sal語句,檢查了一下,發現其中

HDU 6191 2017廣西邀請賽Query on A Tree:可持久化01字典樹(區間抑或查詢

題意:給出一棵n(<=1e5)個點的樹,每個點有一個權,詢問q(<=qe5)次,每次詢問(nod,val),計算出以nod為根的子樹上的所有點,權抑或val的最大值是多少。 題解:基本上是個板子題吧。直接講方法了。。直接上DFS序+可持久化01字典樹就行了。可持

SQL多列查詢

from val top 列數 ali group group by all 查詢 直接從某一列查詢出最大值或最小值很容易,通過group by字句對合適的列進行聚合操作,再使用max()/min()聚合函數就可以求出。 樣本數據如下: key_id x

ABAP 查詢數量記錄到內表

select matnr max( num ) from *** into corresponding fields of table i_mara group by matnr order by matnr.

SQL查詢按某欄位排序的

1.建表 -- Create table create table FRUIT ( id VARCHAR2(20), name VARCHAR2(20), class VARCHAR2(20), count VARCHAR2(20),

sql查詢表中某個欄位相同,其他欄位取記錄

SELECT a.* FROM user a WHERE not EXISTS( select 1 from user where name = a.name and age > a.age ) 對user表進行掃描,編號(或姓名)相同情況下,沒有比前邊年齡大

mybatis。插入語句如何插入資料庫中某一欄位(純sql實現)

<insert id="inserts"> <selectKey keyProperty="ID" ORDER="BEFORE" resultType="java.lang.I

Hibernate hql查詢語句 Count:統計函式 Min:求函式 Max:求函式 Sum:求和函式 Avg:求平均數函式

在HQL中可以呼叫 Count:統計函式 Min:求最小值函式 Max:求最大值函式 Sum:求和函式 Avg:求平均數函式  Count:統計函式 Session session = HibernateSessionFactory.getSession(); Transaction tx = sess

資料庫排名sql,group by 分組查詢按照時間

先給出類似的簡單表 DROP TABLE IF EXISTS `TouTiaoAnchor`; CREATE TABLE `TouTiaoAnchor` ( `HourId` int(10) unsigned NOT NULL, `BetinTime` varcha

SQL(oracle) 取得分組後記錄

select * from  (select t.*, row_number() over(partition by 分組欄位 order by 排序欄位 desc ) rn from tablename t ) where rn=1 row_number() OVER (PARTITION BY C

獲取數值型數組的,使用遍歷獲取每一個,然後記錄的方式。(數組遍歷嵌套if判斷語句

if判斷 增強 ++ pre sta 方法 最小值 test 記錄 package com.Summer_0420.cn; /** * @author Summer * .獲取數值型數組的最大值、最小值 * 方法:遍歷獲取每一個值,記錄最大值; *

MySql按字段分組取記錄 [此博文包含圖片]

from htm 技術 方法 sin gid 最大值 count not 要求:獲得按table1_id分組,並且age最大的記錄信息,即2、3、5條 方法一: select * from (select * from table2 order by age

ARC096D Static Sushi 記錄前綴

sum swap ont mes scan scanf amp 枚舉 ron 傳送門ARC096D 思路:枚舉 + 記錄前綴最大值 我們考慮先逆時針走。 枚舉逆時針的步數i,那麽我們先從0->n+1-i,然後回到起點n+1-i->0 然後順時針走,加上前綴最大值

lct樹上查詢和路徑長

key fine ins def sca In amp col AC 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define

如何使用sql函數平均值、總數、

first and sum count函數 round TP rom nvl 不包含 使用sql函數,您可以在一個select語句的查詢當中,直接計算數據庫資料的平均值、總數、最小值、最大值、總和、標準差、變異數等統計。使用recordset對象時,也可使用這些sql函數。

JavaScript內置對象Math查詢一組數中的

最大值 定義 func 內置對象 .get scrip new i++ 查找 //查找一組數據中的最大值var result = Math.max(10, 20, 39, 40);alert(result);//自定義一個對象,實現系統方法max的方法function My

(java)leetcode852 山脈陣列的封頂索引(二分查詢法找出陣列中的下標)(Peak Index in a Mountain Array)

題目描述: 我們把符合下列屬性的陣列 A 稱作山脈: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A

請使用迭代查詢一個list中小和,並返回一個tuple

自己寫個小程式玩,程式碼實現:   def findMinAndMax(L): if len(L) == 0: return (None, None) else: mi = L[0] ma = L[0] f

在mysql 中查詢時間的一條記錄

首先如下這樣寫是錯的: SELECT name,MAX(last_updated) FROM digital_asset GROUP BY name; 這樣子查到的資料last_updated確實是最大的,但是和name沒有關係; 用這個方法可以實現: SELECT A.* F