優化項目中sql語句執行效率的方法是什麽?
1。SQL優化的原則是盡量減少壹次操作需要讀取的塊數,即在最短的時間內達到最大的數據吞吐量。\r\nIll-adjustedSQL通常可以從以下幾點切入:\r\n?檢查錯誤的SQL,並考慮在其編寫中是否有可以優化的內容\r\n?請檢查子查詢,考慮是否可以通過簡單連接重寫SQL子查詢\r\n?檢查優化索引的使用情況\r\n?考慮數據庫的優化器。避免SELECT*FROMtable語句,並標識字段。\r\n\r\n3.在SQL語句中,如果由where條件篩選的數據庫記錄更準確,那麽where條件應該向前移動。\r\n\r\n4。查詢時盡可能使用索引覆蓋。也就是為SELECT字段建立復合索引,這樣查詢時只進行索引掃描,不讀取數據塊。\r\n\r\n5。在判斷是否有符合條件的記錄時,建議不要使用SELECTCOUNT(*)和selecttop1語句。\r\n\r\n6。在拼寫SQL語句時,應利用內層約束原理對查詢條件進行分解和分類,盡可能在SQL語句的最內層進行約束,以減少數據處理量。\r\n\r\n7。應該絕對避免在orderby子句中使用表達式。\r\n\r\n8。如果需要從關聯表中讀取數據,關聯表壹般不超過7個。\r\n\r\n9。小心使用In和OR,並註意IN集中的數據量。建議集合中的數據不超過200個。\r\n\r\n10。使用代替,>使用>=代替,100。\r\n\r\n15。在where子句中,避免對列進行四次操作,尤其是在WHERE條件的左側。禁止使用操作和函數處理列。比如有些地方可以用like代替substring。\r\n\r\n16。如果語句中沒有notin(in)操作,應該考慮用notexists(exists)重寫,最好的方法是用外連接實現。\r\n\r\n17。在處理壹個業務流程的時候,事情開始和結束的時間間隔要盡可能的短。原則上,數據庫的讀操作應在前完成,數據庫的寫操作應在後完成,避免交叉。\r\n\r\n18。請註意不要使用列函數和orderby、groupby等。對於太多的列,謹慎使用disti軟件開發t。用unionall代替union,數據庫執行union操作。首先分別執行union兩端的查詢,放在壹個臨時表中,然後進行排序,過濾重復記錄。\r\當已知的業務邏輯決定查詢A和查詢B中不會有重復記錄時,應使用unionall而不是union來提高查詢效率。sql執行太長怎麽處理,能縮短?
超過長度?直接拼接sql來的?那妳定義的變量的長度是多少?如果不夠就直接給nvarchar(max)。
多條件?那肯定有變量來接受傳入的參數:@Option1varchar(300),
if(len(Option1)>0)
begin
--執行妳的語句
end
else
begin
--提示參數未傳入值
end
oracle數據庫執行sql很慢怎麽回事?
壹條sql突然執行變慢,耗時9秒,應用是不能改的,只能從數據庫方面下手解決步驟思路:
1:查看sql是否走索引
2:查看索引是否失效
3:hint強制走索引(只是用來查看hint狀態下,查詢是否更改,應用是不能改的)
4:收集該表所有信息(包括索引)
5:分析該表所有信息(包括索引)
6:再次執行並查看註意:哪個用戶執行較慢,就用哪個用戶進行操作,這樣才準確
SQL語句執行很慢,怎麽回事?
到這個數量級的全部更新,肯定會很慢。
第壹。妳的記錄不壹定在同壹個partition,第二。不明白為什麽那麽多人建議妳建索引,妳建的索引越多,妳的更新速度越慢,因為妳更新記錄的同時,還有更新索引。
第三。妳必須知道更新速度慢的瓶頸在哪裏。是讀寫太多,還是內存不夠,還是CUP不夠快,然後對癥下藥。下面介紹兩個簡單的辦法,也許有效:
第壹:把這個100W行的表縱向劈成兩個,用外鍵關系連接,壹個裝小的,經常改變的數據比如ID,外鍵,狀態值,時間等,另壹個裝大的,不經常改變的數據,比如很長的字符串,xml,text等。
這樣更新時操作小的這個表,可以大大節約內存和CPU開銷,降低磁盤操作。
壞處就是查詢時會慢些。
第二:把這100W行橫向切成很多個表,比如每個月的記錄裝在壹個表裏,這樣每個表的記錄數可能只有幾萬,查詢,更新都會快很多。
壞處是查詢,更新都不如原來好寫。
怎麽執行sql命令?
1、首先我們打開電腦裏的Access2010軟件,軟件會默認開啟壹個表名為表1的空白表單。
2、將空白表單表名修改為測試表,添加字段和幾行測試數據。
3、默認軟件工具欄是開始工具欄,我們點擊創建進入創建工具欄,在工具欄中點擊查詢設計。
4、彈出顯示表窗口,點擊關閉將該窗口關掉。
5、這時軟件會進入設計工具欄,我們點擊工具欄左側的SQL視圖。
6、SQL視圖默認選擇的是設計視圖,我們在下拉菜單中選擇SQL視圖。
7、在工具欄下方會自動打開壹個查詢窗口,在這裏就可以輸入查詢用的SQL語句了。
8、我們輸入壹行標準的SQL查詢語句,查詢在測試表中性別為‘女’的數據,點擊運行。
9、SQL語句執行完成後,查詢窗口會自動轉換為表視圖,以表格方式顯示查詢到的數據。
怎麽提高oracle數據庫的運行效率?
1、1、調整數據結構的設計。這壹部分在開發信息系統之前完成,程序員需要考慮是否使用oracle數據庫的分區功能,對於經常訪問的數據庫表是否需要建立索引等。
2、2、調整應用程序結構設計。這壹部分也是在開發信息系統之前完成,程序員在這壹步需要考慮應用程序使用什麽樣的體系結構,是使用傳統的client/server兩層體系結構,還是使用browser/web/database的三層體系結構。不同的應用程序體系結構要求的數據庫資源是不同的。
3、3、調整數據庫sql語句。應用程序的執行最終將歸結為數據庫中的sql語句執行,因此sql語句的執行效率最終決定了oracle數據庫的性能。oracle公司推薦使用oracle語句優化器(oracleoptimizer)和行鎖管理器(row-levelmanager)來調整優化sql語句。
4、4、調整服務器內存分配。內存分配是在信息系統運行過程中優化配置的,數據庫管理員可以根據數據庫運行狀況調整數據庫系統全局區(sga區)的數據緩沖區、日誌緩沖區和***享池的大小;還可以調整程序全局區(pga區)的大小。需要註意的是,sga區不是越大越好,sga區過大會占用操作系統使用的內存而引起虛擬內存的頁面交換,這樣反而會降低系統。
5、5、調整硬盤i/o,這壹步是在信息系統開發之前完成的。數據庫管理員可以將組成同壹個表空間的數據文件放在不同的硬盤上,做到硬盤之間i/o負載均衡。
6、6、調整操作系統參數,例如:運行在unix操作系統上的oracle數據庫,可以調整unix數據緩沖池的大小,每個進程所能使用的內存大小等參數。
實際上,上述數據庫優化措施之間是相互聯系的。oracle數據庫性能惡化表現基本上都是用戶響應時間比較長,需要用戶長時間的等待。但性能惡化的原因卻是多種多樣的,有時是多個因素***同造成了性能惡化的結果,這就需要數據庫管理員有比較全面的計算機知識,能夠敏感地察覺到影響數據庫性能的主要原因所在。另外,良好的數據庫管理工具對於優化數據庫性能也是很重要的。
oracle數據庫性能優化工具
常用的數據庫性能優化工具有:
1、1、oracle數據庫在線數據字典,oracle在線數據字典能夠反映出oracle動態運行情況,對於調整數據庫性能是很有幫助的。
2、2、操作系統工具,例如unix操作系統的vmstat,iostat等命令可以查看到系統系統級內存和硬盤i/o的使用情況,這些工具對於管理員弄清出系統瓶頸出現在什麽地方有時候很有用。
3、3、sql語言跟蹤工具(sqltracefacility),sql語言跟蹤工具可以記錄sql語句的執行情況,管理員可以使用虛擬表來調整實例,使用sql語句跟蹤文件調整應用程序性能。sql語言跟蹤工具將結果輸出成壹個操作系統的文件,管理員可以使用tkprof工具查看這些文件。
4、4、oracleenterprisemanager(oem),這是壹個圖形的用戶管理界面,用戶可以使用它方便地進行數據庫管理而不必記住復雜的oracle數據庫管理的命令。
5、5、explainplan——sql語言優化命令,使用這個命令可以幫助程序員寫出高效的sql語言。
oracle數據庫的系統性能評估
信息系統的類型不同,需要關註的數據庫參數也是不同的。數據庫管理員需要根據自己的信息系統的類型著重考慮不同的數據庫參數。
1、1、在線事務處理信息系統(oltp),這種類型的信息系統壹般需要有大量的insert、update操作,典型的系統包括民航機票發售系統、銀行儲蓄系統等。oltp系統需要保證數據庫的並發性、可靠性和最終用戶的速度,這類系統使用的oracle數據庫需要主要考慮下述參數:
ll數據庫回滾段是否足夠?
ll是否需要建立oracle數據庫索引、聚集、散列?
ll系統全局區(sga)大小是否足夠?
llsql語句是否高效?
2、2、數據倉庫系統(datawarehousing),這種信息系統的主要任務是從oracle的海量數據中進行查詢,得到數據之間的某些規律。數據庫管理員需要為這種類型的oracle數據庫著重考慮下述參數:
ll是否采用b*-索引或者bitmap索引?
ll是否采用並行sql查詢以提高查詢效率?
ll是否采用pl/sql函數編寫存儲過程?
ll有必要的話,需要建立並行數據庫提高數據庫的查詢效率
sql語句的調整原則
sql語言是壹種靈活的語言,相同的功能可以使用不同的語句來實現,但是語句的執行效率是很不相同的。程序員可以使用explainplan語句來比較各種實現方案,並選出最優的實現方案。總得來講,程序員寫sql語句需要滿足考慮如下規則:
1、1、盡量使用索引。試比較下面兩條sql語句:
語句a:selectdname,deptnofromdeptwheredeptnonotin
(selectdeptnofromemp);
語句b:selectdname,deptnofromdeptwherenotexists
(selectdeptnofromempwheredept.deptno=emp.deptno);
這兩條查詢語句實現的結果是相同的,但是執行語句a的時候,oracle會對整個emp表進行掃描,沒有使用建立在emp表上的deptno索引,執行語句b的時候,由於在子查詢中使用了聯合查詢,oracle只是對emp表進行的部分數據掃描,並利用了deptno列的索引,所以語句b的效率要比語句a的效率高壹些。
2、2、選擇聯合查詢的聯合次序。考慮下面的例子:
selectstufffromtabaa,tabbb,tabcc
wherea.acolbetween:alowand:ahigh
andb.bcolbetween:blowand:bhigh
andc.ccolbetween:clowand:chigh
anda.key1=b.key1
amda.key2=c.key2;
這個sql例子中,程序員首先需要選擇要查詢的主表,因為主表要進行整個表數據的掃描,所以主表應該數據量最小,所以例子中表a的acol列的範圍應該比表b和表c相應列的範圍小。
3、3、在子查詢中慎重使用in或者notin語句,使用where(not)exists的效果要好的多。
4、4、慎重使用視圖的聯合查詢,尤其是比較復雜的視圖之間的聯合查詢。壹般對視圖的查詢最好都分解為對數據表的直接查詢效果要好壹些。
5、5、可以在參數文件中設置shared_pool_reserved_size參數,這個參數在sga***享池中保留壹個連續的內存空間,連續的內存空間有益於存放大的sql程序包。
6、6、oracle公司提供的dbms_shared_pool程序可以幫助程序員將某些經常使用的存儲過程“釘”在sql區中而不被換出內存,程序員對於經常使用並且占用內存很多的存儲過程“釘”到內存中有利於提高最終用戶的響應時間。
cpu參數的調整
cpu是服務器的壹項重要資源,服務器良好的工作狀態是在工作高峰時cpu的使用率在90%以上。如果空閑時間cpu使用率就在90%以上,說明服務器缺乏cpu資源,如果工作高峰時cpu使用率仍然很低,說明服務器cpu資源還比較富余。
使用操作相同命令可以看到cpu的使用情況,壹般unix操作系統的服務器,可以使用sar_u命令查看cpu的使用率,nt操作系統的服務器,可以使用nt的性能管理器來查看cpu的使用率。
數據庫管理員可以通過查看v$sysstat數據字典中“cpuusedbythissession”統計項得知oracle數據庫使用的cpu時間,查看“osuserlevelcputime”統計項得知操作系統用戶態下的cpu時間,查看“ossystemcallcputime”統計項得知操作系統系統態下的cpu時間,操作系統總的cpu時間就是用戶態和系統態時間之和,如果oracle數據庫使用的cpu時間占操作系統總的cpu時間90%以上,說明服務器cpu基本上被oracle數據庫使用著,這是合理,反之,說明服務器cpu被其它程序占用過多,oracle數據庫無法得到更多的cpu時間。
數據庫管理員還可以通過查看v$sesstat數據字典來獲得當前連接oracle數據庫各個會話占用的cpu時間,從而得知什麽會話耗用服務器cpu比較多。
出現cpu資源不足的情況是很多的:sql語句的重解析、低效率的sql語句、鎖沖突都會引起cpu資源不足。
1、數據庫管理員可以執行下述語句來查看sql語句的解析情況:
select*fromv$sysstat
wherenamein
('parsetimecpu','parsetimeelapsed','parsecount(hard)');
這裏parsetimecpu是系統服務時間,parsetimeelapsed是響應時間,用戶等待時間
waitetime=parsetimeelapsed_parsetimecpu
由此可以得到用戶sql語句平均解析等待時間=waitetime/parsecount。這個平均等待時間應該接近於0,如果平均解析等待時間過長,數據庫管理員可以通過下述語句
selectsql_text,parse_calls,executionsfromv$sqlarea
orderbyparse_calls;
來發現是什麽sql語句解析效率比較低。程序員可以優化這些語句,或者增加oracle參數session_cached_cursors的值。
2、數據庫管理員還可以通過下述語句:
selectbuffer_gets,executions,sql_textfromv$sqlarea;
查看低效率的sql語句,優化這些語句也有助於提高cpu的利用率。
3、3、數據庫管理員可以通過v$system_event數據字典中的“latchfree”統計項查看oracle數據庫的沖突情況,如果沒有沖突的話,latchfree查詢出來沒有結果。如果沖突太大的話,數據庫管理員可以降低spin_count參數值,來消除高的cpu使用率。
內存參數的調整
內存參數的調整主要是指oracle數據庫的系統全局區(sga)的調整。sga主要由三部分構成:***享池、數據緩沖區、日誌緩沖區。
1、1、***享池由兩部分構成:***享sql區和數據字典緩沖區,***享sql區是存放用戶sql命令的區域,數據字典緩沖區存放數據庫運行的動態信息。數據庫管理員通過執行下述語句:
select(sum(pins-reloads))/sum(pins)"libcache"fromv$librarycache;
來查看***享sql區的使用率。這個使用率應該在90%以上,否則需要增加***享池的大小。數據庫管理員還可以執行下述語句:
select(sum(gets-getmisses-usage-fixed))/sum(gets)"rowcache"fromv$rowcache;
查看數據字典緩沖區的使用率,這個使用率也應該在90%以上,否則需要增加***享池的大小。
2、2、數據緩沖區。數據庫管理員可以通過下述語句:
selectname,valuefromv$sysstatwherenamein('dbblockgets','consistentgets','physicalreads');
來查看數據庫數據緩沖區的使用情況。查詢出來的結果可以計算出來數據緩沖區的使用命中率=1-(physicalreads/(dbblockgets+consistentgets))。
這個命中率應該在90%以上,否則需要增加數據緩沖區的大小。
3、3、日誌緩沖區。數據庫管理員可以通過執行下述語句:
selectname,valuefromv$sysstatwherenamein('redoentries','redologspacerequests');查看日誌緩沖區的使用情況。查詢出的結果可以計算出日誌緩沖區的申請失敗率:
申請失敗率=requests/entries,申請失敗率應該接近於0,否則說明日誌緩沖區開設太小,需要增加oracle數據庫的日誌緩沖區。