1、精減變數,排除重復
2、優化SQL語句,將效率低的語句找出,盡量不用查詢全部、嵌套等SQL
3、將重復語句盡量用動態語句實現
4、盡量少用SQL直接計算,能用函數就用函數
等等
具體還是需要根據業務需求調整
㈡ db2如何優化存儲過程
進入騰訊手機管家首頁--即可看到健康優化功能,其中包括手機加速、流量監控、垃圾清理、電池健康和空間管理功能
進程管理的作用是可以通過進程管理針對手機進行對程序,實現最大化的優化和管理,達到運行更為迅速的效果。當下智能手機的很多軟體是在關閉後,不能徹底結束手機相應進程,我們需要通過手機進入後台關閉掉相應的進程。而如果不關閉的話,很多時候會對我們的手機造成卡機,反應緩慢等一些症狀。
㈢ SQL存儲過程優化
如何獲取執行計劃
1 把存儲過程放在查詢分析器中,先採用執行計劃自動優化一下,看看是否缺少索引
2 減少存儲過程中的循環操作
㈣ 如何優化mysql存儲過
mysql裡面存儲過程能不用游標就不要用游標。 mysql裡面的游標性能是最慢的,oracle或者sqlserver或者db2,游標遍歷數一次超過10000,性能都會很差的。
而mysql的游標性能比oracle他們來說性能更差了。
存儲過程裡面如果很多insert,可以設置一下set autocommit=0; 然後自己控制何時commit。
如果數據量大,注意索引。比如select 裡面有5W條數據,又沒有orderdetailid 索引,就會很慢,加了索引之後,整個存儲過程就很快了。
㈤ mysql 存儲過程執行太慢怎麼優化
1.當我們請求mysql伺服器的時候,MySQL前端會有一個監聽,請求到了之後,伺服器得到相關的SQL語句,執行之前(虛線部分為執行),還會做許可權的判斷
2.通過許可權之後,SQL就到MySQL內部,他會在查詢緩存中,看該SQL有沒有執行過,如果有查詢過,則把緩存結果返回,說明在MySQL內部,也有一個查詢緩存.但是這個查詢緩存,默認是不開啟的,這個查詢緩存,和我們的Hibernate,Mybatis的查詢緩存是一樣的,因為查詢緩存要求SQL和參數都要一樣,所以這個命中率是非常低的(沒什麼卵用的意思)。
3.如果我們沒有開啟查詢緩存,或者緩存中沒有找到對應的結果,那麼就到了解析器,解析器主要對SQL語法進行解析
4.解析結束後就變成一顆解析樹,這個解析樹其實在Hibernate裡面也是有的,大家回憶一下,在以前做過Hibernate項目的時候,是不是有個一個antlr.jar。這個就是專門做語法解析的工具.因為在Hibernate裡面有HQL,它就是通過這個工具轉換成SQL的,我們編程語言之所以有很多規范、語法,其實就是為了便於這個解析器解析,這個學過編譯原理的應該知道.
5.得到解析樹之後,不能馬上執行,這還需要對這棵樹進行預處理,也就是說,這棵樹,我沒有經過任何優化的樹,預處理器會這這棵樹進行一些預處理,比如常量放在什麼地方,如果有計算的東西,把計算的結果算出來等等...
6.預處理完畢之後,此時得到一棵比較規范的樹,這棵樹就是要拿去馬上做執行的樹,比起之前的那棵樹,這棵得到了一些優化
7.查詢優化器,是MySQL裡面最關鍵的東西,我們寫任何一條SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它會怎麼去執行?它是先執行username = toby還是password = 1?每一條SQL的執行順序查詢優化器就是根據MySQL對數據統計表的一些信息,比如索引,比如表一共有多少數據,MySQL都是有緩存起來的,在真正執行SQL之前,他會根據自己的這些數據,進行一個綜合的判定,判斷這一次在多種執行方式裡面,到底選哪一種執行方式,可能運行的最快.這一步是MySQL性能中,最關鍵的核心點,也是我們的優化原則.我們平時所講的優化SQL,其實說白了,就是想讓查詢優化器,按照我們的想法,幫我們選擇最優的執行方案,因為我們比MySQL更懂我們的數據.MySQL看數據,僅僅只是自己收集到的信息,這些信息可能是不準確的,MySQL根據這些信息選了一個它自認為最優的方案,但是這個方案可能和我們想像的不一樣.
8.這里的查詢執行計劃,也就是MySQL查詢中的執行計劃,比如要先執行username = toby還是password = 1
9.這個執行計劃會傳給查詢執行引擎,執行引擎選擇存儲引擎來執行這一份傳過來的計劃,到磁碟中的文件中去查詢,這個時候重點來了,影響這個查詢性能最根本的原因是什麼?就是硬碟的機械運動,也就是我們平時熟悉的IO,所以一條查詢語句是快還是慢,就是根據這個時間的IO來確定的.那怎麼執行IO又是什麼來確定的?就是傳過來的這一份執行計劃.(優化就是制定一個我們認為最快的執行方案,最節省IO,和執行最快)
10.如果開了查詢緩存,則返回結果給客戶端,並且查詢緩存也放一份。
㈥ 怎樣優化這個存儲過程
表關聯太多了,有多慢呢?like '%%『這里應該是用不到索引,能直接確定嗎,
直接相等或是like @name+'%'
中間那個D表,可以嘗試先into到臨時表中,然後用臨時表與下面的語句進行查詢
也可以嘗試給臨時表的欄位加索引
㈦ mysql 存儲過程怎麼進行性能優化
在資料庫的開發過程中,經常會遇到復雜的業務邏輯和對資料庫的操作,這個時候就會用存儲過程來封裝資料庫操作。如果項目的存儲過程較多,書寫又沒有一定的規范,將會影響以後的系統維護困難和大存儲過程邏輯的難以理解,另外如果資料庫的數據量大或者項目對存儲過程的性能要求很,就會遇到優化的問題,否則速度有可能很慢,經過親身經驗,一個經過優化過的存儲過程要比一個性能差的存儲過程的效率甚至高幾百倍。下面介紹某一個MySQL存儲過程優化的整個過程。
在本文中,需要被優化的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //
create procere pr_dealtestnum
(
in p_boxnumber varchar(30)
)
pr_dealtestnum_label:begin
insert into tb_testnum select boxnumber,usertype from tb_testnum_tmp where boxnumber= p_boxnumber;
leave pr_dealtestnum_label;
end;
//
delimiter ;
select 'create procere pr_dealtestnumok';
在存儲過程中使用到的表tb_testnum結構如下:
drop table if exists tb_testnum;
create table tb_testnum
(
boxnumber varchar(30) not null,
usertype int not null
);
create unique index idx1_tb_testnum ontb_testnum(boxnumber);
在存儲過程中使用到的另外一張表tb_testnum_tmp結構如下:
drop table if exists tb_testnum_tmp;
create table tb_testnum_tmp
(
boxnumber varchar(30) not null,
usertype int not null
);
create unique index idx1_tb_testnum_tmp ontb_testnum_tmp(boxnumber);
從兩個表的結構可以看出,tb_testnum和tb_testnum_tmp所包含的欄位完全相同,存儲過程pr_dealtestnum的作用是根據輸入參數將tb_testnum_tmp表的數據插入到tb_testnum表中。
很明顯,雖然能夠實現預期的功能,但存儲過程pr_dealtestnum的代碼還有改進的地方。
下面,我們一步一步來對其進行優化。
優化一
存儲過程pr_dealtestnum的主體是一條insert語句,但這條insert語句裡面又包含了select語句,這樣的編寫是不規范的。因此,我們要把這條insert語句拆分成兩條語句,即先把數據從tb_testnum_tmp表中查找出來,再插入到tb_testnum表中。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //
create procere pr_dealtestnum
(
in p_boxnumber varchar(30)
)
pr_dealtestnum_label:begin
declare p_usertype int;
select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;
insert into tb_testnum values(p_boxnumber,p_usertype);
leave pr_dealtestnum_label;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
優化二
在向tb_testnum表插入數據之前,要判斷該條數據在表中是否已經存在了,如果存在,則不再插入數據。同理,在從tb_testnum_tmp表中查詢數據之前,要先判斷該條數據在表中是否存在,如果存在,才能從表中查找數據。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //
create procere pr_dealtestnum
(
in p_boxnumber varchar(30)
)
pr_dealtestnum_label:begin
declare p_usertype int;
declare p_datacount int;
select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;
if p_datacount > 0 then
begin
select usertype into p_usertype fromtb_testnum_tmp where boxnumber=p_boxnumber;
end;
else
begin
leave pr_dealtestnum_label;
end;
end if;
select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;
if p_datacount = 0 then
begin
insert into tb_testnum values(p_boxnumber,p_usertype);
leave pr_dealtestnum_label;
end;
else
begin
leave pr_dealtestnum_label;
end;
end if;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
優化三
不管向tb_testnum表插入數據的操作執行成功與否,都應該有一個標識值來表示執行的結果,這樣也方便開發人員對程序流程的追蹤和調試。也就是說,在每條leave語句之前,都應該有一個返回值,我們為此定義一個輸出參數。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //
create procere pr_dealtestnum
(
in p_boxnumber varchar(30),
out p_result int -- 0-succ, other-fail
)
pr_dealtestnum_label:begin
declare p_usertype int;
declare p_datacount int;
select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;
if p_datacount > 0 then
begin
select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;
end;
else
begin
set p_result = 1;
leave pr_dealtestnum_label;
end;
end if;
select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;
if p_datacount = 0 then
begin
insert into tb_testnum values(p_boxnumber,p_usertype);
set p_result = 0;
leave pr_dealtestnum_label;
end;
else
begin
set p_result = 2;
leave pr_dealtestnum_label;
end;
end if;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
優化四
我們注意到「insert into tb_testnum values(p_boxnumber,p_usertype);」語句中,tb_testnum表之後沒有列出具體的欄位名,這個也是不規范的。如果在以後的軟體版本中,tb_testnum表中新增了欄位,那麼這條insert語句極有可能會報錯。因此,規范的寫法是無論tb_testnum表中有多少欄位,在執行insert操作時,都要列出具體的欄位名。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //
create procere pr_dealtestnum
(
in p_boxnumber varchar(30),
out p_result int -- 0-succ, other-fail
)
pr_dealtestnum_label:begin
declare p_usertype int;
declare p_datacount int;
select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;
if p_datacount > 0 then
begin
select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;
end;
else
begin
set p_result = 1;
leave pr_dealtestnum_label;
end;
end if;
select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;
if p_datacount = 0 then
begin
insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype);
set p_result = 0;
leave pr_dealtestnum_label;
end;
else
begin
set p_result = 2;
leave pr_dealtestnum_label;
end;
end if;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
優化五
在執行insert語句之後,要用MySQL中自帶的@error_count參數來判斷插入數據是否成功,方便開發人員跟蹤執行結果。如果該參數的值不為0,表示插入失敗,那麼我們就用一個返回參數值來表示操作失敗。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //
create procere pr_dealtestnum
(
in p_boxnumber varchar(30),
out p_result int -- 0-succ, other-fail
)
pr_dealtestnum_label:begin
declare p_usertype int;
declare p_datacount int;
select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;
if p_datacount> 0 then
begin
select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;
end;
else
begin
set p_result = 1;
leave pr_dealtestnum_label;
end;
end if;
select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;
if p_datacount = 0then
begin
insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype);
if @error_count<>0 then
begin
set p_result= 3;
end;
else
begin
set p_result= 0;
end;
end if;
end;
else
begin
set p_result = 2;
end;
end if;
leave pr_dealtestnum_label;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
㈧ 優化存儲過程
在使用 Microsoft® SQL Server™ 2000 創建應用程序時,Transact-SQL 編程語言是應用程序和 SQL Server 資料庫之間的主要編程介面。使用 Transact-SQL 程序時,可用兩種方法存儲和執行程序。可以在本地存儲程序,並創建向 SQL Server 發送命令並處理結果的應用程序;也可以將程序在 SQL Server 中存儲為存儲過程,並創建執行存儲過程並處理結果的應用程序。
SQL Server 中的存儲過程與其它編程語言中的過程類似,原因是存儲過程可以:
接受輸入參數並以輸出參數的形式將多個值返回至調用過程或批處理。
包含執行資料庫操作(包括調用其它過程)的編程語句。
向調用過程或批處理返回狀態值,以表明成功或失敗(以及失敗原因)。
可使用 Transact-SQL EXECUTE 語句運行存儲過程。存儲過程與函數不同,因為存儲過程不返回取代其名稱的值,也不能直接用在表達式中。
使用 SQL Server 中的存儲過程而不使用存儲在客戶計算機本地的 Transact-SQL 程序的優勢有:
允許模塊化程序設計。
只需創建過程一次並將其存儲在資料庫中,以後即可在程序中調用該過程任意次。存儲過程可由在資料庫編程方面有專長的人員創建,並可獨立於程序源代碼而單獨修改。
允許更快執行。
如果某操作需要大量 Transact-SQL 代碼或需重復執行,存儲過程將比 Transact-SQL 批代碼的執行要快。將在創建存儲過程時對其進行分析和優化,並可在首次執行該過程後使用該過程的內存中版本。每次運行 Transact-SQL 語句時,都要從客戶端重復發送,並且在 SQL Server 每次執行這些語句時,都要對其進行編譯和優化。
減少網路流量。
一個需要數百行 Transact-SQL 代碼的操作由一條執行過程代碼的單獨語句就可實現,而不需要在網路中發送數百行代碼。
可作為安全機制使用。
即使對於沒有直接執行存儲過程中語句的許可權的用戶,也可授予他們執行該存儲過程的許可權。
SQL Server 存儲過程是用 Transact-SQL 語句 CREATE PROCEDURE 創建的,並可用 ALTER PROCEDURE 語句進行修改。存儲過程定義包含兩個主要組成部分:過程名稱及其參數的說明,以及過程的主體(其中包含執行過程操作的 Transact-SQL 語句)。
㈨ 請教一pl/sql存儲過程如何優化
1、精減變數,排除重復 2、優化SQL語句,將效率低的語句找出,盡量不用查詢全部、嵌套等SQL 3、將重復語句盡量用動態語句實現 4、盡量少用SQL直接計算,能用函數就用函數 等等 具體還是需要根據業務需求調整