新聞中心
在數(shù)據(jù)庫設(shè)計和開發(fā)中,函數(shù)是經(jīng)常被使用的工具,它可以完成多種復(fù)雜的操作,在增加了數(shù)據(jù)庫功能的同時也可能對其性能產(chǎn)生影響。在這篇文章中,我們將探討。

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站設(shè)計、稱多網(wǎng)絡(luò)推廣、成都小程序開發(fā)、稱多網(wǎng)絡(luò)營銷、稱多企業(yè)策劃、稱多品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供稱多建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
一、函數(shù)的類型
數(shù)據(jù)庫中的函數(shù)可以分為標(biāo)量函數(shù)、聚合函數(shù)和窗口函數(shù)。
1.標(biāo)量函數(shù):標(biāo)量函數(shù)接受一個或多個參數(shù)并返回單個值,這個值可以是數(shù)字、字符串、日期時間或者任何其他數(shù)據(jù)類型。
2.聚合函數(shù):聚合函數(shù)接受多個值并返回單個值,這個值通常是數(shù)值的總和、平均值、更大值、最小值等。
3.窗口函數(shù):窗口函數(shù)是一種特殊的函數(shù),它在查詢結(jié)果集上進行計算,而不是在單個行上計算,同時它還允許開發(fā)者使用“OVER”子句指定窗口的大小和位置。
二、
1.查詢優(yōu)化
查詢語句中調(diào)用函數(shù)通常會增加查詢的開銷,尤其是當(dāng)函數(shù)的參數(shù)需要引用其他表或者子查詢時,查詢引擎需要執(zhí)行額外的操作來計算結(jié)果。因此,應(yīng)盡可能避免在查詢語句中使用函數(shù)。
2.索引使用
函數(shù)處理數(shù)據(jù)時通常會破壞索引的使用,因為函數(shù)對數(shù)據(jù)進行轉(zhuǎn)換后,原始索引中的數(shù)據(jù)無法直接匹配查詢條件。一種解決方案是使用索引的函數(shù),比如lower()和upper()函數(shù),在查詢過程中轉(zhuǎn)換查詢條件,使得它們與索引中的數(shù)據(jù)匹配。
3.存儲過程和觸發(fā)器
在存儲過程和觸發(fā)器中使用函數(shù)會增加它們的執(zhí)行時間,因為每調(diào)用一次函數(shù)都需要從數(shù)據(jù)庫中讀取一次數(shù)據(jù)。如果存儲過程或觸發(fā)器中使用了多個函數(shù),其影響將更加顯著。
4.數(shù)據(jù)類型的影響
函數(shù)的返回值類型可能影響查詢執(zhí)行時間,因為它可能需要數(shù)據(jù)類型轉(zhuǎn)換才能與表中的字段類型匹配,從而影響查詢性能。
三、如何優(yōu)化
1.減少函數(shù)的使用
盡量避免在查詢語句、存儲過程和觸發(fā)器中使用函數(shù),盡可能使用簡單的SQL語句代替函數(shù)。
2.使用索引函數(shù)
在查詢語句中使用索引函數(shù),如lower()和upper()函數(shù),可以避免函數(shù)處理數(shù)據(jù)時破壞索引的使用,提高查詢性能。
3.選擇合適的數(shù)據(jù)類型
在定義函數(shù)時,應(yīng)選擇合適的數(shù)據(jù)類型,這樣可以避免數(shù)據(jù)類型轉(zhuǎn)換,提高查詢性能。
4.優(yōu)化代碼邏輯
對于那些必須使用函數(shù)的查詢語句、存儲過程和觸發(fā)器,可以通過優(yōu)化代碼邏輯來減少函數(shù)執(zhí)行的次數(shù),從而提高性能。
函數(shù)在數(shù)據(jù)庫設(shè)計和開發(fā)中發(fā)揮著重要的作用,但是在使用它們的時候,我們也要考慮它們對數(shù)據(jù)庫性能的影響。因此,我們應(yīng)該盡可能減少函數(shù)的使用,選擇合適的數(shù)據(jù)類型,優(yōu)化代碼邏輯,并使用索引函數(shù)來提高查詢性能。這些方法的使用將有助于提高數(shù)據(jù)庫的性能和響應(yīng)速度。
相關(guān)問題拓展閱讀:
- 存儲過程中使用系統(tǒng)函數(shù)會影響效率嗎
- Oracle數(shù)據(jù)庫系統(tǒng)性能優(yōu)化策略
存儲過程中使用系統(tǒng)函數(shù)會影響效率嗎
多少都會影響,看使用的函數(shù)的復(fù)雜程度而定,比如len()這種簡單的功能影響不是很大,
Oracle數(shù)據(jù)庫系統(tǒng)性能優(yōu)化策略
一個數(shù)據(jù)庫系統(tǒng)的生命周期可以分成設(shè)計 開發(fā)和成品三個階段 在設(shè)計階段進行數(shù)據(jù)庫性能優(yōu)化的成本更低 收益更大 在成品階段進行數(shù)據(jù)庫性能優(yōu)化的成本更高 收益最小 數(shù)據(jù)庫的優(yōu)化可以通過對網(wǎng)絡(luò) 硬件 操作系統(tǒng) 數(shù)據(jù)庫參數(shù)和應(yīng)用程序的優(yōu)化來進行 最常見的優(yōu)化手段就是對硬件的升級 據(jù)統(tǒng)計 對網(wǎng)絡(luò)辯敬 硬件 操作系統(tǒng) 數(shù)據(jù)庫參數(shù)進行優(yōu)化所獲得的性能提升 全部加起來只占數(shù)據(jù)庫系統(tǒng)性能提升的 %左右 其余的 %系統(tǒng)性能提升來自對應(yīng)用程序的優(yōu)化 許多優(yōu)化專家認為 對應(yīng)用程序的優(yōu)化可以得到 %的系統(tǒng)性能的提升
一 數(shù)據(jù)庫性能的優(yōu)化
數(shù)據(jù)庫設(shè)計是應(yīng)用程序設(shè)計的基礎(chǔ) 其性能直接影響應(yīng)用程序的性能 數(shù)據(jù)庫性能包括存儲空間需求量的大小和查詢響應(yīng)時間的長短兩個方面 為了優(yōu)化數(shù)據(jù)庫性能 需要對數(shù)據(jù)庫中的表進行規(guī)范化 規(guī)范化的范式可分為之一范式 第二范式 第三范式 BCNF范式 第四范式和第五范式 一般來說 邏輯數(shù)據(jù)庫設(shè)計會滿足規(guī)范化的前 級標(biāo)準(zhǔn) 但由于滿足第三范式的表結(jié)構(gòu)容易維護且基本滿足實際應(yīng)用的要求 因此 實際應(yīng)用中一般都按照第三范式的標(biāo)準(zhǔn)進行規(guī)范化 但是 規(guī)范化也有缺點 由于將一個表拆分成為多個表 在查詢時需要多表連接 降低了查詢速度
由于規(guī)范化有可能導(dǎo)致查詢速度慢的缺點 考慮到一些應(yīng)用需要較快的響應(yīng)速度 在設(shè)計表時應(yīng)同時考慮對某些表進行反規(guī)范化 反規(guī)范化可以采用以下幾種方法
分割表
分割表包括水平分割和垂直分割
水平分割是按照行將一個表分割為多個表 這可以提高每個表的查詢速度 但查詢 更新時要選擇不同的表 統(tǒng)計時要匯總多個表 因此應(yīng)用程序會更復(fù)雜
垂直分割是對于一個列很多的表 若某些列的訪問頻率遠遠高于其它列 就可以將主鍵和這些列作為一個表 將主鍵和其它列作為另外一個表 通過減少列的寬度 增加了絕山每個數(shù)據(jù)頁的行數(shù) 一次I/O就可以掃描更多的行 從而提高了訪問每一個表的速度 但是由于造成了多表連接 所以應(yīng)該在同時查詢或更新不同分割表中的列的情況比較少的情況下使用
保留冗余列
當(dāng)兩個或多個表在查詢中經(jīng)常需要連接時 可以在其中一個表上增加若干冗余的列 以避免表之間的連接過于頻繁 由于對冗余列的更新操作必須對多個表同步進行 所以一般在冗余列的數(shù)據(jù)不經(jīng)常變動的情況下使用
增加派生列
派生列是由表中的其它多個列計算所得 增加派生列可以減少統(tǒng)計運算 在數(shù)據(jù)匯總時可以大大縮短運算時間
二 應(yīng)用程序性能的優(yōu)化
應(yīng)用程序的優(yōu)化通??煞譃閮蓚€方面 源代碼和SQL語句 由于涉及到對程序邏輯的改變 源代碼的優(yōu)化在時間成本和風(fēng)險上代價很高 而對數(shù)據(jù)庫系統(tǒng)性能的提升收效有限 因此應(yīng)用程序的優(yōu)化應(yīng)著重在SQL語句的優(yōu)化 對于海量數(shù)據(jù) 劣質(zhì)SQL語句和優(yōu)質(zhì)SQL語句之間的速度差別可以達到上百倍 可見對于一個系統(tǒng)不是簡單地能實現(xiàn)其功能就行 而是要寫出高質(zhì)量的SQL語句 提高系統(tǒng)的可用性
下面就某些SQL語句的where子句編寫中需要注意的問題作詳細介紹 在這些where子句中 即使某些列存在索引 但是由于編寫了劣質(zhì)的SQL 系統(tǒng)在運行該SQL語句時也不能使用該索引 而同樣使用全表掃描 這就造成了響應(yīng)速度的極大降低
IS NULL 與 IS NOT NULL
攜宏慎 不能用null作索引 任何包含null值的列都將不會被包含在索引中 即使索引有多列的情況下 只要這些列中有一列含有null 該列就會從索引中排除 也就是說如果某列存在空值 即使對該列建索引也不會提高性能
任何在where子句中使用is null或is not null的語句優(yōu)化器是不允許使用索引的
聯(lián)接列
對于有聯(lián)接的列 即使最后的聯(lián)接值為一個靜態(tài)值 優(yōu)化器不會使用索引的 例如 假定有一個職工表(employee) 對于一個職工的姓和名分成兩列存放(FIRST_NAME和LAST_NAME) 現(xiàn)在要查詢一個叫喬治?布什(Gee Bush)的職工 下面是一個采用聯(lián)接查詢的SQL語句
select * from employee where first_name|| ||last_name = Gee Bush
上面這條語句完全可以查詢出是否有Gee Bush這個員工 但是這里需要注意 系統(tǒng)優(yōu)化器對基于last_name創(chuàng)建的索引沒有使用
當(dāng)采用下面這種SQL語句的編寫 Oracle系統(tǒng)就可以采用基于last_name創(chuàng)建的索引
Select * From employee where first_name = Gee and last_name = Bush
遇到下面這種情況又如何處理呢?如果一個變量(name)中存放著Gee Bush這個員工的姓名 對于這種情況我們又如何避免全程遍歷使用索引呢?可以使用一個函數(shù) 將變量name中的姓和名分開就可以了 但是有一點需要注意 這個函數(shù)是不能作用在索引列上 下面是SQL查詢腳本
select * from employee where first_name = SUBSTR( &&name INSTR( &&name ) )
and last_name = SUBSTR( &&name INSTR( &&name )+ )
帶通配符(%)的like語句
同樣以上面的例子來看這種情況 目前的需求是這樣的 要求在職工表中查詢名字中包含Bush的人 可以采用如下的查詢SQL語句
select * from employee where last_name like %Bush%
這里由于通配符(%)在搜尋詞首出現(xiàn) 所以O(shè)racle系統(tǒng)不使用last_name的索引 在很多情況下可能無法避免這種情況 但是一定要心中有底 通配符如此使用會降低查詢速度 然而當(dāng)通配符出現(xiàn)在字符串其他位置時 優(yōu)化器就能利用索引 例如 在下面的查詢中索引得到了使用
select * from employee where last_name like c%
Order by語句
Order by語句決定了Oracle如何將返回的查詢結(jié)果排序 Order by語句對要排序的列沒有什么特別的限制 也可以將函數(shù)加入列中(象聯(lián)接或者附加等) 任何在Order by語句的非索引項或者有計算表達式都將降低查詢速度
仔細檢查order by語句以找出非索引項或者表達式 它們會降低性能 解決這個問題的辦法就是重寫order by語句以使用索引 也可以為所使用的列建立另外一個索引 同時應(yīng)絕對避免在order by子句中使用表達式
NOT
我們在查詢時經(jīng)常在where子句使用一些邏輯表達式 如大于 小于 等于以及不等于等等 也可以使用and(與) or(或)以及not(非) NOT可用來對任何邏輯運算符號取反 下面是一個NOT子句的例子
…… where not (status = VALID )
如果要使用NOT 則應(yīng)在取反的短語前面加上括號 并在短語前面加上NOT運算符 NOT運算符包含在另外一個邏輯運算符中 這就是不等于()運算符 換句話說 即使不在查詢where子句中顯式地加入NOT詞 NOT仍在運算符中 見下例
…… where status INVALID
再看下面這個例子
select * from employee where salary
對這個查詢 可以改寫為不使用NOT的語句
select * from employee where salary
雖然這兩種查詢的結(jié)果一樣 但是第二種查詢方案會比之一種查詢方案更快些 第二種查詢允許Oracle對salary列使用索引 而之一種查詢則不能使用索引
IN和EXISTS
有時候會將一列和一系列值相比較 最簡單的辦法就是在where子句中使用子查詢 在where子句中可以使用兩種格式的子查詢
之一種格式是使用IN操作符 …… where column in(select * from …… where ……)
第二種格式是使用EXIST操作符 …… where exists (select X from ……where ……)
絕大多數(shù)人會使用之一種格式 因為它比較容易編寫 而實際上第二種格式要遠比之一種格式的效率高 在Oracle中可以將幾乎所有的IN操作符子查詢改寫為使用EXISTS的子查詢
第二種格式中 子查詢以 select X 開始 運用EXISTS子句不管子查詢從表中抽取什么數(shù)據(jù)它只查看where子句 這樣優(yōu)化器就不必遍歷整個表而僅根據(jù)索引就可完成工作(這里假定在where語句中使用的列存在索引) 相對于IN子句來說 EXISTS使用相連子查詢 構(gòu)造起來要比IN子查詢困難一些
通過使用EXISTS Oracle系統(tǒng)會首先檢查主查詢 然后運行子查詢直到找到之一個匹配項 這就節(jié)省了時間 Oracle系統(tǒng)在執(zhí)行IN子查詢時 首先執(zhí)行子查詢 并將獲得的結(jié)果列表存放在一個加了索引的臨時表中 在執(zhí)行子查詢之前 系統(tǒng)先將主查詢掛起 待子查詢執(zhí)行完畢 存放在臨時表中以后再執(zhí)行主查詢 這也就是使用EXISTS比使用IN通常查詢速度快的原因
同時應(yīng)盡可能使用NOT EXISTS來代替NOT IN 盡管二者都使用了NOT(不能使用索引而降低速度) 但NOT EXISTS要比NOT IN查詢效率更高
lishixinzhi/Article/program/Oracle/202311/17060
數(shù)據(jù)庫影響系統(tǒng)效率的函數(shù)的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫影響系統(tǒng)效率的函數(shù),函數(shù)對數(shù)據(jù)庫性能的影響,存儲過程中使用系統(tǒng)函數(shù)會影響效率嗎,Oracle數(shù)據(jù)庫系統(tǒng)性能優(yōu)化策略的信息別忘了在本站進行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)頁標(biāo)題:函數(shù)對數(shù)據(jù)庫性能的影響(數(shù)據(jù)庫影響系統(tǒng)效率的函數(shù))
當(dāng)前網(wǎng)址:http://m.fisionsoft.com.cn/article/djcccdp.html


咨詢
建站咨詢
