15002協議處理優化

2021-06-19 08:13:42 字數 4566 閱讀 7650

從日誌中發現通用協議15002處理經常比較耗時,其中資料庫查詢明顯耗時過高.

以下是一例:

select max(tb_10068_1050.object_id) as maxno,count(*) as sumno from  tb_10068_1050

left join (select max(f003v_1045) as f003v_1045,max(f002v_1045) as f002v_1045,f004v_1045,max(f005v_1045) as f005v_1045 from tb_10068_1045 group by f004v_1045) tb_10068_1045

on tb_10068_1050.f011v_1050 = tb_10068_1045.f004v_1045

left join (select ref_objectid,status from tb_1049 where sheet_type = 100681050 ) tb_1049

on tb_10068_1050.object_id = tb_1049.ref_objectid

left join vv_1061

on ((tb_10068_1050.src_orgid = vv_1061.orgid and tb_10068_1050.dest_orgid = vv_1061.co_orgid and vv_1061.userserial = 100681145) or (tb_10068_1050.src_orgid = vv_1061.co_orgid and tb_10068_1050.dest_orgid = vv_1061.orgid and vv_1061.userserial = 100681145))

where (tb_10068_1050.f028v_1050 = 1 or tb_10068_1050.f005d_1050 >= '2013-11-21')

and ( dest_orgid = '' or dest_orgid is null or co_orgid is not null )

此查詢在jjy環境下耗時12秒.用資料庫引擎優化顧問優化後效能幾乎沒有任何提公升.

如果去掉最後面的:

and ( dest_orgid = '' or dest_orgid is null or co_orgid is not null )

則查詢幾乎沒有耗時.

以下從sql角度進行粗略分析,目的是縮短請求的處理時間.

資料量:

相關表的資料記錄數:

select count(*) from tb_1049; --1220

select count(*) from tb_10068_1045; --628

select count(*) from tb_10068_1050; --242089

select count(*) from vv_1061; --116010

select count(*) from vv_1061 where co_orgid is  null; ---0

把上述條件替換為以下條件的測試結果如下:

(1)and (co_orgid is not null or dest_orgid=0); ---耗時12秒

(2)and (vv_1061.co_orgid is not null); ---耗時:0

(3)and (tb_10068_1050.dest_orgid=''); ---耗時:0

(1)是(2)和(3)組合起來的條件.

2個條件單獨使用很快,用or組合後就很慢,如何解釋?

select max(tb_10068_1050.object_id) as maxno,count(*) as sumno from  tb_10068_1050

left join (select max(f003v_1045) as f003v_1045,max(f002v_1045) as f002v_1045,f004v_1045,max(f005v_1045) as f005v_1045 from tb_10068_1045 group by f004v_1045) tb_10068_1045

on tb_10068_1050.f011v_1050 = tb_10068_1045.f004v_1045

-- left join (select ref_objectid,status from tb_1049 where sheet_type = 100681050 ) tb_1049

-- on tb_10068_1050.object_id = tb_1049.ref_objectid

left join vv_1061

on ((tb_10068_1050.src_orgid = vv_1061.orgid and tb_10068_1050.dest_orgid = vv_1061.co_orgid and vv_1061.userserial = 100681145) or (tb_10068_1050.src_orgid = vv_1061.co_orgid and tb_10068_1050.dest_orgid = vv_1061.orgid and vv_1061.userserial = 100681145))

where (tb_10068_1050.f028v_1050 = 1 or tb_10068_1050.f005d_1050 >= '2013-11-21')

and (co_orgid is not null or dest_orgid=0)

執行上面注釋部分語句(tb_1049)的命令,則上述命令沒有什麼耗時.

tb_1049只有1220條記錄,tb_10068_1050.object_id = tb_1049.ref_objectid都有索引關聯. 這個現象如何解釋?

也許只有分析資料庫的查詢執行計畫才知其所以.----這裡不細究了.

條件 "( dest_orgid = '' or dest_orgid is null or co_orgid is not null ) "的含義?

(1)可以查詢沒有目標機構的單據(dest_orgid = '' or dest_orgid is null):即有的單據可以沒有目標機構,不需要建立合作關係.

(2)如果有目標機構資訊,需要有管理許可權(co_orgid is not null)。

如何描述可以沒有目標機構資訊呢?

利用單據資訊表的單據屬性字段,目前的定義為:

f019n_0044    單據屬性    int(1)            0    單據屬性bit-0:是否在手機上顯示bit1-是否支援彙總

對其進行擴充套件: bit2-是否允許沒有目標機構,預設:0,表示不允許,1-表示允許

注意:不能使用是否自動傳送字段(f012n_0044),該欄位用於有目標機構但不需要傳送的情況.

isheettype介面中有關於單據屬性的訪問方法

virtual long get_prop() const = 0;

virtual void set_prop(long flag) = 0;

virtual void clr_prop(long flag) = 0;

15002協議實現調整。

.優化sql命令:

如下:

select max(tb_10068_1050.object_id) as maxno,count(*) as sumno from  tb_10068_1050

left join vv_1061

on ((tb_10068_1050.src_orgid = vv_1061.orgid and tb_10068_1050.dest_orgid = vv_1061.co_orgid and vv_1061.userserial = 100681145) or (tb_10068_1050.src_orgid = vv_1061.co_orgid and tb_10068_1050.dest_orgid = vv_1061.orgid and vv_1061.userserial = 100681145))

where (tb_10068_1050.f028v_1050 = 1 or tb_10068_1050.f005d_1050 >= '2013-11-21')

and (附加條件)

.附加條件的生成,利用單據屬性控制查詢條件

isheetinfo *sti = ibiz_->getsheettype(sheet_type);

string strwhere; ///< 附加條件

if (get_prop()&0x4)

else

該查詢是為後續查詢準備,提供分頁查詢資訊。實際查詢時再帶上tb_10068_1045和tb_1049的資訊。

公升級時需要更新tb_0044:

對於允許沒有目標機構的單據設定屬性.

例如, 設定邀約單單據屬性為可以沒有合作機構

update tb_0044 set f019n_0044=f019n_0044+4 where sheet_type=邀約單

cisco snmp協議處理漏洞

snmp network management protocol 即簡單網路管理協議,它為網路管理 系統提供了底層網路管理的框架,使得網路和系統管理員能夠遠端監測和配置管理他們的 網路裝置 如路由器和交換機 乙個支援snmp協議的網路裝置或者是主機就是乙個snmp 實體。乙個snmp實體包含兩部分 ...

簡化服務端協議處理的CDbHelper類

1.類定義 表字段與umx項 包括引數和行集列 對映項定義 struct cfield2umxitem 表操作helper,適用於基於umx協議時服務端資料庫處理 查詢,新增,修改 可簡化 class cdbhelper cdbhelper cfield2umxitem vmi,unsigned i...

網路通訊協議處理使用者傳送資料的過程

網路協議的幾種不同畫分方法 一張 傳送端 資料的分裝過程 傳送使用者資料 你好 http協議封裝為http資料報 tcp在http封裝的基礎上封裝成tcp資料報 ip在tcp的基礎上封裝成ip資料報 鏈路層在上一層的基礎上封裝成自己的包 物理層 雙絞線 網絡卡 無線裝置等 通過無線或有線傳輸二進位制...