日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SqlServer高级特性--存储过程

發(fā)布時(shí)間:2025/7/25 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SqlServer高级特性--存储过程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

需求:

用戶需要提交加密數(shù)據(jù),提交之后需要解密還原,還原有兩種結(jié)果:成功和失敗!

100個(gè)用戶,之前7天,判斷是否有提交數(shù)據(jù),如果有提交有數(shù)據(jù),判斷是否解密成功(分別存在兩個(gè)表中)。如果沒(méi)有提交,顯示黃色;提交,未解密成功,紅色;提交并解密成功,綠色,并顯示對(duì)應(yīng)時(shí)間。

分析:

測(cè)試過(guò)遍歷所有單位,之后遍歷每一天,去查詢提交數(shù)據(jù),然后在去查詢解密數(shù)據(jù)。結(jié)果一個(gè)100家單位,竟然需要大概2-3分鐘的時(shí)間來(lái)查詢。(接收記錄里面數(shù)據(jù)大約50w條,后期可能會(huì)更多),明顯不合適,雖然加過(guò)緩存,但是不符合要求。

優(yōu)化思路:

  1. 我想用100家單位和7天同時(shí)去關(guān)聯(lián)接收記錄表,進(jìn)行查詢。也就是多條件左外連接查詢。

  2. 我要獲取100家單位和7天的這樣的表,需要100家單位和7個(gè)日期的笛卡爾積

  3. 我需要一個(gè)7天日期的表,可以在存儲(chǔ)過(guò)程中進(jìn)行創(chuàng)建臨時(shí)表。

整體思路就是這樣的。

代碼:

整體存儲(chǔ)過(guò)程代碼如下:

ALTER PROCEDURE [dbo].[AUTOTRANS]@xz VARCHAR(10)='410000' ,@day INT =7,@industryCode varchar(10)='6001' AS BEGINSET NOCOUNT ON;--定義一個(gè)變量:臨時(shí)表,用戶存儲(chǔ)7天數(shù)據(jù)。DECLARE @days table (date date) DECLARE @today date = GETDATE()--定義一個(gè)循環(huán),用于插入之前7天的數(shù)據(jù),從當(dāng)天開(kāi)始WHILE @day >= 0BEGINinsert into @daysselect DATEadd(dd,-@day, @today );set @day =@day-1 END--業(yè)務(wù)區(qū)域SELECT D.XZ_CODE,D.UNIT_CODE,D.UNIT_NAME, CONVERT(varchar,D.RECEIVE_TIME,108) RECEIVE_TIME,CONVERT(varchar,MAX (E.RESTORE_TIME),108) RESTORE_TIME,D.date SELECT_DATEFROM (SELECT A.XZ_CODE,A.UNIT_CODE,A.UNIT_NAME,MAX(C.RECEIVE_TIME) RECEIVE_TIME,B.date FROM (SELECT XZ_CODE,UNIT_CODE,UNIT_NAMEFROM T_UNIT_AUDIT WHERE XZ_CODE = @xz AND INDUSTRY_CODE = @industryCode) A CROSS JOIN @days BLEFT JOIN T_FILE_RECEIVE_RECORD C ON A.UNIT_CODE = C.UNIT_CODE AND A.XZ_CODE = C.XZ_CODE AND CONVERT(VARCHAR,B.date,23) = CONVERT(VARCHAR,C.RECEIVE_TIME,23)GROUP BY A.XZ_CODE,A.UNIT_CODE,A.UNIT_NAME,B.date) D LEFT JOIN T_FILE_RESTORE_RECORD E ON D.XZ_CODE = E.XZ_CODE AND D.UNIT_CODE = E.UNIT_CODE AND CONVERT(VARCHAR,D.RECEIVE_TIME,23) = CONVERT(VARCHAR,E.RESTORE_TIME,23)GROUP BY D.RECEIVE_TIME,D.XZ_CODE,D.UNIT_CODE,D.UNIT_NAME,D.date END

?結(jié)果測(cè)試:

目前,針對(duì)100家單位7天的數(shù)據(jù),可以保證大約2秒內(nèi)完成查詢,當(dāng)然這還包含了我在后期進(jìn)行數(shù)據(jù)處理的時(shí)間。

寫在最后:

由于項(xiàng)目是使用的jdbcTemplate進(jìn)行的持久層操作,所以持久層操作代碼附上:

public List<Map<String, Object>> autoTrans(Map<String, Object> param) {String sql = "{call AUTOTRANS(?,?,?)} "; //調(diào)用存儲(chǔ)過(guò)程List<Map<String, Object>> resultList = jdbcTemplate.execute(//定義傳入?yún)?shù),返回statement(connection)->{CallableStatement statement = connection.prepareCall(sql);statement.setString(1,param.get("xzCode").toString());statement.setString(2,param.get("days").toString());statement.setString(3,param.get("industryCode").toString());return statement;},//執(zhí)行存儲(chǔ)過(guò)程,拿到結(jié)果集,處理結(jié)果集。因?yàn)檫@里lambda表達(dá)式如果不設(shè)置參數(shù)類型會(huì)導(dǎo)致重復(fù),就設(shè)置了參數(shù)類型(CallableStatement callableStatement) -> {List<Map<String,Object>> resultListParam =new ArrayList<>();callableStatement.execute();ResultSet resultSet = callableStatement.getResultSet();while (resultSet.next()){Map<String,Object> result = new HashMap<>();
                result.put("xzCode",resultSet.getString("XZ_CODE"));
                result.put("unitCode",resultSet.getString("UNIT_CODE"));
                result.put("unitName",resultSet.getString("UNIT_NAME"));
                result.put("receiveTime",resultSet.getString("RECEIVE_TIME"));
                result.put("restoreTime",resultSet.getString("RESTORE_TIME"));
                result.put("selectDate",resultSet.getDate("SELECT_DATE"));resultListParam.add(result);}return resultListParam;});return resultList;}

到此結(jié)束,本次查詢優(yōu)化完成,基本達(dá)到目標(biāo)要求。

轉(zhuǎn)載于:https://www.cnblogs.com/chenmc/p/9449712.html

總結(jié)

以上是生活随笔為你收集整理的SqlServer高级特性--存储过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。