新聞中心
隨著信息化時(shí)代的到來,數(shù)字化數(shù)據(jù)的處理與管理成為了各個(gè)領(lǐng)域不可或缺的環(huán)節(jié),數(shù)據(jù)讀取的速度也成為了考驗(yàn)數(shù)據(jù)庫性能的主要指標(biāo)之一。特別是在大數(shù)據(jù)時(shí)代,對(duì)于實(shí)時(shí)性要求較高的企業(yè),如何快速高效地處理海量數(shù)據(jù)成為了關(guān)鍵問題。

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,先為鐵力等服務(wù)建站,鐵力等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為鐵力企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
在C語言中,我們可以使用一些技巧來提高數(shù)據(jù)庫的讀取速度,以下是幾種常用的方法。
1. 批量讀取
在進(jìn)行數(shù)據(jù)庫的讀取操作時(shí),為了提高效率,可以使用批量讀取的方式。例如在Oracle數(shù)據(jù)庫中,使用SELECT語句進(jìn)行查詢時(shí),可以設(shè)置一個(gè)合理的FetchSize參數(shù),指定一次讀取的數(shù)據(jù)行數(shù),從而實(shí)現(xiàn)數(shù)據(jù)批量讀取。
批量讀取可以減少網(wǎng)絡(luò)io次數(shù),是提高數(shù)據(jù)庫讀取速度的有效方式。
2. 使用索引
建立索引是提高數(shù)據(jù)庫讀取速度的常用方法。通過索引,可以將數(shù)據(jù)按照主鍵或者其他字段歸類,實(shí)現(xiàn)快速查詢;同時(shí),索引可以有效減少數(shù)據(jù)庫的掃描次數(shù),縮小數(shù)據(jù)范圍,從而提高查詢效率。
在創(chuàng)建索引時(shí),需要結(jié)合具體的查詢需求和數(shù)據(jù)量大小,合理選擇字段建立索引。如果索引過多,會(huì)增加數(shù)據(jù)庫的空間占用和維護(hù)成本,甚至?xí)绊憯?shù)據(jù)庫的性能。
3. 數(shù)據(jù)表分裂
在數(shù)據(jù)量較大時(shí),為了提高讀取速度,可以將一張大數(shù)據(jù)表拆分成多個(gè)小數(shù)據(jù)表。這樣做的好處是可以減少單個(gè)數(shù)據(jù)表的數(shù)據(jù)量,從而減少數(shù)據(jù)掃描的時(shí)間,提高查詢的速度和效率。
例如,在電商網(wǎng)站中,可以將訂單數(shù)據(jù)表分裂成基于不同訂單日期的多個(gè)小數(shù)據(jù)表,每個(gè)小數(shù)據(jù)表對(duì)應(yīng)一天的訂單數(shù)據(jù),從而提高數(shù)據(jù)庫讀取速度。
但需要注意的是,分表也需要考慮數(shù)據(jù)的關(guān)聯(lián)性,不同的數(shù)據(jù)表之間的數(shù)據(jù)存儲(chǔ)需要保持一定的關(guān)聯(lián)。
提高數(shù)據(jù)庫讀取速度需要綜合考慮多種因素,包括數(shù)據(jù)量大小、數(shù)據(jù)庫結(jié)構(gòu)、索引配置、數(shù)據(jù)讀取方式等等。以上提到的方法僅僅是其中的一部分,更詳細(xì)的方法可以根據(jù)具體業(yè)務(wù)需求進(jìn)行深入探討。
在實(shí)際應(yīng)用中,我們需要更加精細(xì)地調(diào)整數(shù)據(jù)庫的讀取方案,結(jié)合硬件和軟件的協(xié)同配合,才能夠更大程度地,實(shí)現(xiàn)高效可靠的數(shù)據(jù)處理和管理。
相關(guān)問題拓展閱讀:
- 數(shù)據(jù)庫變慢的情況及處理方法
數(shù)據(jù)庫變慢的情況及處理方法
數(shù)據(jù)庫慢一般有三種情況
逐漸變慢
突然變慢
不定時(shí)變慢
之一種情況 逐漸變慢 要建立一個(gè)長期的監(jiān)控機(jī)制 比如 寫個(gè)shell腳本每天的忙時(shí)(通常 ~ etc )定時(shí)收集os neork db的信息 每個(gè)星期出report對(duì)收集到的信息進(jìn)行分析 這些數(shù)據(jù)的積累 可以決定后期的優(yōu)化決策 并且可以是DBA說服manager采用自己決策的重要數(shù)據(jù) DBA的價(jià)值 就在每個(gè)星期的report中體現(xiàn)
第二種情況 突然變慢 也是最容易解決的 先從業(yè)務(wù)的角度看是DB的使用跟以前有何不同 然后做進(jìn)一步判斷 硬件/網(wǎng)絡(luò)故障蘆納衫通常也會(huì)引起DB性能的突然下降
之一步: 察看DB/OS/NEORK的系統(tǒng)log 排除硬件/網(wǎng)絡(luò)問題
第二步 察看數(shù)據(jù)庫的等待事件 根據(jù)等待事件來判斷可能出問題的環(huán)節(jié) 如果 沒有等待事件 可以排除數(shù)據(jù)庫的問題 如果有等待時(shí)間 根據(jù)不同的等待事件 來找引起這些事件的根源
比如latch free等跟SQL parse有關(guān)系的等待事件 OS的表現(xiàn)是CPU 的占用率高
db file scattered read等跟SQL disk read有關(guān)系的等待時(shí)間 OS的表現(xiàn)是iostat可以看到磁盤讀寫量增加
第三步: 察看os的信息 CPU/IO/MEMORY等
a Cpu 的占用率
CPU占用率與數(shù)據(jù)庫性能不成反比 CPU占用率高 不能說明數(shù)據(jù)庫性能慢 通常情況 一個(gè)優(yōu)化很好 而且業(yè)務(wù)量確實(shí)很大的數(shù)據(jù)庫 CPU的占用率都會(huì)高 而且會(huì)平均分布在每個(gè)進(jìn)程上 反過來 CPU的占用率都會(huì)高也不代表數(shù)據(jù)庫性能就好 要結(jié)合數(shù)據(jù)庫的等待事件來判斷CPU占用率高是否合理
如果某個(gè)進(jìn)程的cpu占用高 肯定是這個(gè)進(jìn)程有問題 如果 不是oracle的進(jìn)程 可以讓application察看是否程序有死循環(huán)等漏洞 如果 是oracle的進(jìn)程 可以根據(jù)pid查找oracle數(shù)據(jù)字典看看這個(gè)進(jìn)程的發(fā)起程序 正在執(zhí)行的sql語句 以及等待事件 然后 不同情況使用不同的方法來解決
b IO
排除硬件的IO問題 數(shù)據(jù)庫突然變慢 一般來說 都是一個(gè)或幾個(gè)SQL語句引起的
如果IO很頻繁 可以通過優(yōu)化disk reads高的TOP SQL來解決 當(dāng)然這也是解決IO問題的最笨也是最有效的辦法
OS以及存儲(chǔ)的配置也是影響IO的一個(gè)重要的原因
比如 最常見的HP unix下異步IO的問題 如果DBA GROUP沒有MLOCK的權(quán)限 ORACLE是不使用AIO的 偏偏OS與DB的兩方的admin如果配合不夠好地話 這個(gè)配置就很容易給漏掉了
c Memory
第二種情況與memory的關(guān)系比較小 只要SGA區(qū)配置合理沒有變化 一般來說 只要不是Application Memory leak 不會(huì)引起突然變慢的現(xiàn)象
第三種情況 不定時(shí)變慢 是最難解決的 現(xiàn)場出現(xiàn)的問題原因也是五花八門千奇百怪 最重要的是 出現(xiàn)慢的現(xiàn)象時(shí) 以最快的速度抓取到最多的信息以供分析 先寫好抓取數(shù)據(jù)的shell 腳本 并在現(xiàn)象發(fā)生時(shí)及時(shí)按下回車鍵
一個(gè)例子
數(shù)據(jù)庫突然變慢
背景: 一個(gè)新應(yīng)用上線后 數(shù)陪腔據(jù)庫突然變慢
之一步 調(diào)查新應(yīng)用
據(jù)開發(fā)人員講新應(yīng)用訪問的都是新建立的表 表的數(shù)據(jù)量很小 沒有復(fù)雜的SQL查詢
查詢 v$sqlarea 分別按照disk_reads / buffer_gets / executions 排序 TOP SQL 中沒有新應(yīng)用的SQL 排除新應(yīng)用數(shù)據(jù)庫訪問照成的性能問題
第二步 察看數(shù)據(jù)庫log/ OS log
數(shù)據(jù)庫log中可以看到大量的ORA 錯(cuò)誤 以及大量的dump文件 分析dump文件(時(shí)間久了 沒有dump文件可參考 具體細(xì)節(jié)沒法描述下來 ) 發(fā)現(xiàn)是新應(yīng)用通過dblink訪問remote DB時(shí)生成的dump文件 應(yīng)用開發(fā)人說沒法修改 Oracle也沒有相應(yīng)茄彎的patch解決
OS log中沒有錯(cuò)誤信息
第三步 察看statspack report
從wait events中看到 Top event是 buffer busy waits db file parallel write 等于IO相關(guān)的等待事件
從buffer busy waits 的統(tǒng)計(jì)信息來看 是等待data block
還有些physical reads等信息與從前比沒有太多的異常
Tablespace 的IO reads/writes也沒有異常 但是wait明顯增加
初步確定是IO問題
第四步 察看OS的信息
top 命令(輸出為實(shí)驗(yàn)室數(shù)據(jù) 僅作格式參考)
load averages: : :
processes: sleeping zombie stopped on cpu
CPU states: % idle % user % kernel % iowait % swap
Memory: M real M free M swap in use M swap free
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU MAND
a K K cpu/ : % top
mpgj M K sleep : % view_server
當(dāng)時(shí)現(xiàn)場數(shù)據(jù)顯示 iowait 值與以前相比大很多 沒有異常進(jìn)程
sar –d (輸出為實(shí)驗(yàn)室數(shù)據(jù) 僅作格式參考)
SunOS sc Generic_ sun u / /
: : device %busy avque r+w/s blks/s avwait avserv
sd
sd a
sd b
sd c
sd g
當(dāng)時(shí)現(xiàn)場數(shù)據(jù)顯示 放數(shù)據(jù)文件的設(shè)備 avwait avque blks/s值偏大
第五步 察看數(shù)據(jù)庫的等待事件
一個(gè)大業(yè)務(wù)量的數(shù)據(jù)庫如果性能不好的話 一般來說都會(huì)有大量的等待事件 上百個(gè)等待事件很常見 我通常會(huì)按照EVENT進(jìn)行g(shù)roup
Select count(*) event from v$session_wait where event not in (on timer pmon timer rdbms ipc message SQL*Net message from client ) group by event order by desc;
輸出結(jié)果顯示最多的等待事件是buffer busy waits
進(jìn)一步分析 找出等待的原因
Select count(*) p p p from v$session_wait where event = buffer busy waits group by p p p ;
在buffer busy waits等待事件中
P = file#
P = block#
P = id ( 此id對(duì)應(yīng)為等待的原因)
按照p p p group是為了明確buffer busy waits的等待集中在哪些對(duì)象上
Metalink對(duì)buffer busy waits等待事件的描述有如下一段話
If P shows that the buffer busy wait is waiting for a block read to plete then the blocking session is likely to be waiting on an IO wait (eg: db file sequential read or db file scattered read for the same file# and block#
輸出結(jié)果顯示 等待分布在多個(gè)不同的對(duì)象上 等待原因?yàn)?waiting for a block read to plete 進(jìn)一步分析為IO的問題
如果 buffer busy waits等待集中在某個(gè)對(duì)象上 說明有hot block 通過重新rebuild這個(gè)對(duì)象增加freelist來解決 RAC環(huán)境增加freelist group
通過以下SQL可以找到具體的object
Select owner segment_name segment_type from dba_extents where file_id=P and P beeen block_id and block_id+blocks;
P P 是上面v$session_wait查出的具體的值
第六步 明確原因 找出解決步驟
分析
磁盤的IO流量增加
磁盤的IO等待增加
DB的IO流量沒有增加
DB的IO等待增加
由 可以推出 有數(shù)據(jù)庫以外的IO訪問磁盤
察看磁盤配置 該VG只存放了數(shù)據(jù)庫數(shù)據(jù)文件和數(shù)據(jù)庫系統(tǒng)文件 排除數(shù)據(jù)文件 產(chǎn)生IO的是數(shù)據(jù)庫系統(tǒng)文件
數(shù)據(jù)庫系統(tǒng)文件一般來說不會(huì)產(chǎn)生IO 有IO讀寫的地方只有l(wèi)og和dump文件
結(jié)論 ora 產(chǎn)生的大量core dump文件堵塞IO
解決辦法
消除ora (應(yīng)用不改的情況下 無法解決)
把dump目錄指向別的VG
讓oracle盡量少的去寫core dump文件
background_core_dump = partial
lishixinzhi/Article/program/Oracle/202311/18969
關(guān)于c 數(shù)據(jù)庫之一次讀取很慢的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站標(biāo)題:提高C語言數(shù)據(jù)庫的讀取速度(c數(shù)據(jù)庫之一次讀取很慢)
本文來源:http://www.fisionsoft.com.cn/article/djjeipj.html


咨詢
建站咨詢
