❶ 如何處理海量數據
在實際的工作環境下,許多人會遇到海量數據這個復雜而艱巨的問題,它的主要難點有以下幾個方面:
一、數據量過大,數據中什麼情況都可能存在。
如果說有10條數據,那麼大不了每條去逐一檢查,人為處理,如果有上百條數據,也可以考慮,如果數據上到千萬級別,甚至 過億,那不是手工能解決的了,必須通過工具或者程序進行處理,尤其海量的數據中,什麼情況都可能存在,例如,數據中某處格式出了問題,尤其在程序處理時, 前面還能正常處理,突然到了某個地方問題出現了,程序終止了。
二、軟硬體要求高,系統資源佔用率高。
對海量的數據進行處理,除了好的方法,最重要的就是合理使用工具,合理分配系統資源。一般情況,如果處理的數據過TB級,小型機是要考慮的,普通的機子如果有好的方法可以考慮,不過也必須加大CPU和內存,就象面對著千軍萬馬,光有勇氣沒有一兵一卒是很難取勝的。
三、要求很高的處理方法和技巧。
這也是本文的寫作目的所在,好的處理方法是一位工程師長期工作經驗的積累,也是個人的經驗的總結。沒有通用的處理方法,但有通用的原理和規則。
下面我們來詳細介紹一下處理海量數據的經驗和技巧:
一、選用優秀的資料庫工具
現在的資料庫工具廠家比較多,對海量數據的處理對所使用的資料庫工具要求比較高,一般使用Oracle或者DB2,微軟 公司最近發布的sql Server 2005性能也不錯。另外在BI領域:資料庫,數據倉庫,多維資料庫,數據挖掘等相關工具也要進行選擇,象好的ETL工具和好的OLAP工具都十分必要, 例如Informatic,Eassbase等。筆者在實際數據分析項目中,對每天6000萬條的日誌數據進行處理,使用SQL Server 2000需要花費6小時,而使用SQL Server 2005則只需要花費3小時。
二、編寫優良的程序代碼
處理數據離不開優秀的程序代碼,尤其在進行復雜數據處理時,必須使用程序。好的程序代碼對數據的處理至關重要,這不僅僅是數據處理准確度的問題,更是數據處理效率的問題。良好的程序代碼應該包含好的演算法,包含好的處理流程,包含好的效率,包含好的異常處理機制等。
三、對海量數據進行分區操作
對海量數據進行分區操作十分必要,例如針對按年份存取的數據,我們可以按年進行分區,不同的資料庫有不同的分區方式,不 過處理機制大體相同。例如SQL Server的資料庫分區是將不同的數據存於不同的文件組下,而不同的文件組存於不同的磁碟分區下,這樣將數據分散開,減小磁碟I/O,減小了系統負荷, 而且還可以將日誌,索引等放於不同的分區下。
四、建立廣泛的索引
對海量的數據處理,對大表建立索引是必行的,建立索引要考慮到具體情況,例如針對大表的分組、排序等欄位,都要建立相應 索引,一般還可以建立復合索引,對經常插入的表則建立索引時要小心,筆者在處理數據時,曾經在一個ETL流程中,當插入表時,首先刪除索引,然後插入完 畢,建立索引,並實施聚合操作,聚合完成後,再次插入前還是刪除索引,所以索引要用到好的時機,索引的填充因子和聚集、非聚集索引都要考慮。
五、建立緩存機制
當數據量增加時,一般的處理工具都要考慮到緩存問題。緩存大小設置的好差也關繫到數據處理的成敗,例如,筆者在處理2億條數據聚合操作時,緩存設置為100000條/Buffer,這對於這個級別的數據量是可行的。
六、加大虛擬內存
如果系統資源有限,內存提示不足,則可以靠增加虛擬內存來解決。筆者在實際項目中曾經遇到針對18億條的數據進行處理, 內存為1GB,1個P42.4G的CPU,對這么大的數據量進行聚合操作是有問題的,提示內存不足,那麼採用了加大虛擬內存的方法來解決,在6塊磁碟分區 上分別建立了6個4096M的磁碟分區,用於虛擬內存,這樣虛擬的內存則增加為 4096*6 + 1024 =25600 M,解決了數據處理中的內存不足問題。
七、分批處理
海量數據處理難因為數據量大,那麼解決海量數據處理難的問題其中一個技巧是減少數據量。可以對海量數據分批處理,然後處 理後的數據再進行合並操作,這樣逐個擊破,有利於小數據量的處理,不至於面對大數據量帶來的問題,不過這種方法也要因時因勢進行,如果不允許拆分數據,還 需要另想辦法。不過一般的數據按天、按月、按年等存儲的,都可以採用先分後合的方法,對數據進行分開處理。
八、使用臨時表和中間表
數據量增加時,處理中要考慮提前匯總。這樣做的目的是化整為零,大表變小表,分塊處理完成後,再利用一定的規則進行合 並,處理過程中的臨時表的使用和中間結果的保存都非常重要,如果對於超海量的數據,大表處理不了,只能拆分為多個小表。如果處理過程中需要多步匯總操作, 可按匯總步驟一步步來,不要一條語句完成,一口氣吃掉一個胖子。
九、優化查詢SQL語句
在對海量數據進行查詢處理過程中,查詢的SQL語句的性能對查詢效率的影響是非常大的,編寫高效優良的SQL腳本和存儲 過程是資料庫工作人員的職責,也是檢驗資料庫工作人員水平的一個標准,在對SQL語句的編寫過程中,例如減少關聯,少用或不用游標,設計好高效的資料庫表 結構等都十分必要。筆者在工作中試著對1億行的數據使用游標,運行3個小時沒有出結果,這是一定要改用程序處理了。
十、使用文本格式進行處理
對一般的數據處理可以使用資料庫,如果對復雜的數據處理,必須藉助程序,那麼在程序操作資料庫和程序操作文本之間選擇, 是一定要選擇程序操作文本的,原因為:程序操作文本速度快;對文本進行處理不容易出錯;文本的存儲不受限制等。例如一般的海量的網路日誌都是文本格式或者 csv格式(文本格式),對它進行處理牽扯到數據清洗,是要利用程序進行處理的,而不建議導入資料庫再做清洗。
十一、定製強大的清洗規則和出錯處理機制
海量數據中存在著不一致性,極有可能出現某處的瑕疵。例如,同樣的數據中的時間欄位,有的可能為非標準的時間,出現的原因可能為應用程序的錯誤,系統的錯誤等,這是在進行數據處理時,必須制定強大的數據清洗規則和出錯處理機制。
十二、建立視圖或者物化視圖
視圖中的數據來源於基表,對海量數據的處理,可以將數據按一定的規則分散到各個基表中,查詢或處理過程中可以基於視圖進行,這樣分散了磁碟I/O,正如10根繩子吊著一根柱子和一根吊著一根柱子的區別。
十三、避免使用32位機子(極端情況)
目前的計算機很多都是32位的,那麼編寫的程序對內存的需要便受限制,而很多的海量數據處理是必須大量消耗內存的,這便要求更好性能的機子,其中對位數的限制也十分重要。
十四、考慮操作系統問題
海量數據處理過程中,除了對資料庫,處理程序等要求比較高以外,對操作系統的要求也放到了重要的位置,一般是必須使用伺服器的,而且對系統的安全性和穩定性等要求也比較高。尤其對操作系統自身的緩存機制,臨時空間的處理等問題都需要綜合考慮。
十五、使用數據倉庫和多維資料庫存儲
數據量加大是一定要考慮OLAP的,傳統的報表可能5、6個小時出來結果,而基於Cube的查詢可能只需要幾分鍾,因此處理海量數據的利器是OLAP多維分析,即建立數據倉庫,建立多維數據集,基於多維數據集進行報表展現和數據挖掘等。
十六、使用采樣數據,進行數據挖掘
基於海量數據的數據挖掘正在逐步興起,面對著超海量的數據,一般的挖掘軟體或演算法往往採用數據抽樣的方式進行處理,這樣 的誤差不會很高,大大提高了處理效率和處理的成功率。一般采樣時要注意數據的完整性和,防止過大的偏差。筆者曾經對1億2千萬行的表數據進行采樣,抽取出 400萬行,經測試軟體測試處理的誤差為千分之五,客戶可以接受。
還有一些方法,需要在不同的情況和場合下運用,例如使用代理鍵等操作,這樣的好處是加快了聚合時間,因為對數值型的聚合比對字元型的聚合快得多。類似的情況需要針對不同的需求進行處理。
海量數據是發展趨勢,對數據分析和挖掘也越來越重要,從海量數據中提取有用信息重要而緊迫,這便要求處理要准確,精度要高,而且處理時間要短,得到有價值信息要快,所以,對海量數據的研究很有前途,也很值得進行廣泛深入的研究。
❷ 資料庫數據歸檔,有什麼好辦法
pt-archiver原理解析
作為MySQL DBA,可以說應該沒有不知道pt-archiver了,作為pt-toolkit套件中的重要成員,往往能夠輕松幫助DBA解決數據歸檔的問題。例如線上一個流水表,業務僅僅只需要存放最近3個月的流水數據,三個月前的數據做歸檔即可,那麼pt-archiver就可以輕松幫你完成這件事情,甚至你可以配置成自動任務,無需人工干預。
作為DBA,我們應該知其然更應該知其所以然,這樣我們也能夠放心地使用pt工具。相信很多DBA都研究過pt-online-schema-change的原理,那麼今天我們深入刨一刨pt-archiver的工作原理。
一、原理觀察
土人有土辦法,我們直接開啟general log來觀察pt-archiver是如何完成歸檔的。
命令
pt-archiver --source h=127.0.0.1,u=xucl,p=xuclxucl,P=3306,D=xucl,t=t1 --dest h=127.0.0.1,P=3306,u=xucl,p=xuclxucl,D=xucl_archive,t=t1 --progress 5000 \
--statistics --charset=utf8mb4 --limit=10000 --txn-size 1000 --sleep 30
常用選項
--analyze
指定工具完成數據歸檔後對表執行'ANALYZE TABLE'操作。指定方法如'--analyze=ds',s代表源端表,d代表目標端表,也可以單獨指定。
--ask-pass
命令行提示密碼輸入,保護密碼安全,前提需安裝模塊perl-TermReadKey。
--buffer
指定緩沖區數據刷新到選項'--file'指定的文件並且在提交時刷新。
只有當事務提交時禁用自動刷新到'--file'指定的文件和刷新文件到磁碟,這意味著文件是被操作系統塊進行刷新,因此在事務進行提交之前有一些數據隱式刷新到磁碟。默認是每一行操作後進行文件刷新到磁碟。
--bulk-delete
指定單個語句刪除chunk的方式來批量刪除行,會隱式執行選項'--commit-each'。
使用單個DELETE語句刪除每個chunk對應的錶行,通常的做法是通過主鍵進行逐行的刪除,批量刪除在速度上會有很大的提升,但如果有復雜的'WHERE'條件就可能會更慢。
--[no]bulk-delete-limit
默認值:yes
指定添加選項'--bulk-delete'和'--limit'到進行歸檔的語句中。
--bulk-insert
使用LOAD DATA LOCAL INFILE的方法,通過批量插入chunk的方式來插入行(隱式指定選項'--bulk-delete'和'--commit-each')
而不是通過逐行單獨插入的方式進行,它比單行執行INSERT語句插入的速度要快。通過隱式創建臨時表來存儲需要批量插入的行(chunk),而不是直接進行批量插入操作,當臨時表中完成每個chunk之後再進行統一數據載入。為了保證數據的安全性,該選項會強制使用選項'--bulk-delete',這樣能夠有效保證刪除是在插入完全成功之後進行的。
--channel
指定當主從復制環境是多源復制時需要進行歸檔哪個主庫的數據,適用於多源復制中多個主庫對應一個從庫的情形。
--charset,-A
指定連接字元集。
--[no]check-charset
默認值:yes
指定檢查確保資料庫連接時字元集和表字元集相同。
--[no]check-columns
默認值:yes
指定檢查確保選項'--source'指定的源端表和'--dest'指定的目標表具有相同的欄位。
不檢查欄位在表的排序和欄位類型,只檢查欄位是否在源端表和目標表當中都存在,如果有不相同的欄位差異,則工具報錯退出。如果需要禁用該檢查,則指定'--no-check-columns'。
--check-slave-lag
指定主從復制延遲大於選項'--max-lag'指定的值之後暫停歸檔操作。默認情況下,工具會檢查所有的從庫,但該選項只作用於指定的從庫(通過DSN連接方式)。
--check-interval
默認值:1s
如果同時指定了選項'--check-slave-lag',則該選項指定的時間為工具發現主從復制延遲時暫停的時間。每進行操作100行時進行一次檢查。
--columns,-c
指定需要歸檔的表欄位,如有多個則用','(逗號)隔開。
--commit-each
指定按每次獲取和歸檔的行數進行提交,該選項會禁用選項'--txn-size'。
在每次獲取表數據並進行歸檔之後,在獲取下一次數據和選項'--sleep'指定的休眠時間之前,進行事務提交和刷新選項'--file'指定的文件,通過選項'--limit'控制事務的大小。
--host,-h
指定連接的資料庫IP地址。
--port,-P
指定連接的資料庫Port埠。
--user,-u
指定連接的資料庫用戶。
--password,-p
指定連接的資料庫用戶密碼。
--socket,-S
指定使用SOCKET文件連接。
--databases,-d
指定連接的資料庫
--source
指定需要進行歸檔操作的表,該選項是必須指定的選項,使用DSN方式表示。
--dest
指定要歸檔到的目標端表,使用DSN方式表示。
如果該選項沒有指定的話,則默認與選項'--source'指定源端表為相同表。
--where
指定通過WHERE條件語句指定需要歸檔的數據,該選項是必須指定的選項。不需要加上'WHERE'關鍵字,如果確實不需要WHERE條件進行限制,則指定'--where 1=1'。
--file
指定表數據需要歸檔到的文件。使用類似MySQL DATE_FORMAT()格式化命名方式。
文件內容與MySQL中SELECT INTO OUTFILE語句使用相同的格式,文件命名選項如下所示:
%Y:年,4位數(Year, numeric, four digits)
%m:月,2位數(Month, numeric (01..12))
%d:日,2位數(Day of the month, numeric (01..31))
%H:小時(Hour (00..23))
%i:分鍾(Minutes, numeric (00..59))
%s:秒(Seconds (00..59))
%D:資料庫名(Database name)
%t:表名(Table name)
例如:--file '/var/log/archive/%Y-%m-%d-%D.%t'
--output-format
指定選項'--file'文件內容輸出的格式。
默認不指定該選項是以製表符進行欄位的分隔符,如果指定該選項,則使用','(逗號)作為欄位分隔符,使用'"'(雙引號)將欄位括起。用法示例:'--output-format=mp'。
--for-update
指定為每次歸檔執行的SELECT語句添加FOR UPDATE子句。--share-lock
指定為每次歸檔執行的SELECT語句添加LOCK IN SHARE MODE子句。
--header
指定在文件中第一行寫入欄位名稱作為標題。
--ignore
指定為INSERT語句添加IGNORE選項。
--limit
默認值:1
指定每條語句獲取表和歸檔表的行數。
--local
指定不將OPTIMIZE和ANALYZE語句寫入binlog。
--max-lag
默認值:1s
指定允許主從復制延遲時長的最大值,單位秒。如果在每次獲取行數據之後主從延遲超過指定的值,則歸檔操作將暫停執行,暫停休眠時間為選項'--check-interval'指定的值。待休眠時間結束之後再次檢查主從延遲時長,檢查方法是通過從庫查詢的'Seconds_Behind_Master'值來確定。如果主從復制延遲一直大於該參數指定值或者從庫停止復制,則操作將一直等待直到從庫重新啟動並且延遲小於該參數指定值。
--no-delete
指定不刪除已被歸檔的表數據。
--optimize
指定工具完成數據歸檔後對表執行'OPTIMIZE TABLE'操作。指定方法如'--analyze=ds',s代表源端表,d代表目標端表,也可以單獨指定。
--primary-key-only
指定只歸檔主鍵欄位,是選項'--columns=主鍵'的簡寫。
如果工具歸檔的操作是進行DELETE清除時最有效,因為只需讀取主鍵一個欄位而無需讀取行所有欄位。
--progress
指定每多少行列印進度信息,列印當前時間,已用時間以及多少行進行歸檔。
--purge
指定執行的清除操作而不是歸檔操作。允許忽略選項'--dest'和'--file'進行操作,如果只是清除操作可以結合選項'--primary-key-only'會更高效。
--quiet,-q
指定工具靜默執行,不輸出任何的執行信息。
--replace
指定寫入選項'--dest'指定目標端表時改寫INSERT語句為REPLACE語句。
--retries
默認值:1
指定歸檔操作遇到死鎖或超時的重試次數。當重試次數超過該選項指定的值時,工具將報錯退出。
--run-time
指定工具歸檔操作在退出之前需要運行的時間。允許的時間後綴名為s=秒,m=分,h=小時,d=天,如果沒指定,默認為s。
--[no]safe-auto-increment
默認值:yes
指定不使用自增列(AUTO_INCREMENT)最大值對應的行進行歸檔。
該選項在進行歸檔清除時會額外添加一條WHERE子句以防止工具刪除單列升序欄位具有的具有AUTO_INCREMENT屬性最大值的數據行,為了在資料庫重啟之後還能使用到AUTO_INCREMENT對應的值,但這會引起無法歸檔或清除欄位對應最大值的行。
--set-vars
默認:
wait_timeout=10000
innodb_lock_wait_timeout=1
lock_wait_timeout=60
工具歸檔時指定參數值,如有多個用','(逗號)分隔。如'--set-vars=wait_timeout=5000'。
--skip-foreign-key-checks
指定使用語句SET FOREIGN_KEY_CHECKS = 0禁用外鍵檢查。
--sleep
指定工具在通過SELECT語句獲取歸檔數據需要休眠的時間,默認值是不進行休眠。在休眠之前事務並不會提交,並且選項'--file'指定的文件不會被刷新。如果指定選項'--commit-each',則在休眠之前會進行事務提交和文件刷新。
--statistics
指定工具收集並列印操作的時間統計信息。
統計信息示例如下:
'
Started at 2008-07-18T07:18:53, ended at 2008-07-18T07:18:53
Source: D=db,t=table
SELECT 4
INSERT 4
DELETE 4
Action Count Time Pct
commit 10 0.1079 88.27
select 5 0.0047 3.87
deleting 4 0.0028 2.29
inserting 4 0.0028 2.28
other 0 0.0040 3.29
--txn-size
默認:1
指定每個事務處理的行數。如果是0則禁用事務功能。
--version
顯示工具的版本並退出。
--[no]version-check
默認值:yes
檢查Percona Toolkit、MySQL和其他程序的最新版本。
--why-quit
指定工具列印當非因完成歸檔行數退出的原因。
在執行一個自動歸檔任務時該選項與選項'--run-time'一起使用非常方便,這樣可以確定歸檔任務是否在指定的時間內完成。如果同時指定了選項'--statistics',則會列印所有退出的原因。
二、原理解析
根據general log的輸出,我們整理出時序表格如下
三、其他說明
咋一看這個過程貌似也沒有什麼問題,但是,假如在原表掃描出數據,插入到新表的過程中,舊數據發生了變化怎麼辦?
帶著這個疑問,我們進行了源碼的跟蹤,我們在pt-archiver的6839行打上了斷點
然後我分別在幾個session窗口做了如下動作
最後pt-archiver輸出如下:
# A software update is available:
TIME ELAPSED COUNT
2020-04-08T09:13:21 0 0
2020-04-08T09:13:21 0 1
Started at 2020-04-08T09:13:21, ended at 2020-04-08T09:13:51
Source: A=utf8mb4,D=xucl,P=3306,h=127.0.0.1,p=...,t=t1,u=xucl
Dest: A=utf8mb4,D=xucl_archive,P=3306,h=127.0.0.1,p=...,t=t1,u=xucl
SELECT 1
INSERT 1
DELETE 1
Action Count Time Pct
sleep 1 30.0002 99.89
inserting 1 0.0213 0.07
commit 2 0.0080 0.03
select 2 0.0017 0.01
deleting 1 0.0005 0.00
other 0 0.0008 0.00
很明顯,id=3這條記錄並沒有進行歸檔(我們這里是改了條件列,實際生產中可能是更改了其他列,造成歸檔數據不準確)
那麼如何來解決這種情況的發生呢?
顯然,資料庫在資料庫中可以通過加排它鎖來防止其他程序修改對應的數據,pt-archiver其實早就已經幫我們考慮到了這樣的情況,pt-archiver提供了兩種選擇
--for-update:Adds the FOR UPDATE modifier to SELECT statements
--share-lock:Adds the LOCK IN SHARE MODE modifier to SELECT statements
四、總結
pt-archiver作為歸檔工具無疑是MySQL DBA日常運維的大利器之一,在使用過程中在知道如何使用的基礎上也能夠知曉其原理
歸檔過程中最好能對歸檔記錄進行加鎖操作,以免造成歸檔數據不準確
在主從環境中,歸檔過程最好控制速度,以免造成主從延遲
盡量控制好chunk的大小,不要過大,造成大事務
❸ 學習資料庫要掌握哪些技能才算入門
資料庫是當今世界最重要的技術,甚至都不用謙虛的加之一!
為什麼?因為它是各種應用的基礎!大數據,看名字就知道離不開資料庫。人工智慧,如果沒有數據,你哪來的智能?網路,網路上的內容還不是存在資料庫里的?管理系統,管理的是什麼?還不是數據嗎!哪怕你手機里的聯系人,也是存在數據里的哦。
❹ 資料庫如何管理
管理資料庫主要做好以下3方面的內容:
一、資料庫定期備份
首先利用資料庫自帶的命令行工具將資料庫備份下來,然後將該文件以日期參量重命名。
資料庫定期備份的原因:
1)、有些數據是隨時變化的,備份可以記錄某時間點的數據;
2)、如資料庫故障,可以隨時還原。
二、資料庫優化
1)、進行sql語句的執行優化;
2)、減少應用和資料庫的交互次數、同一個sql語句的執行次數;
3)、整理資料庫實體的碎片(特別是對某些表經常進行insert和delete動作,尤其注意,索引欄位為系列欄位、自增長欄位、時間欄位,對於業務比較頻繁的系統,最好一個月重建一次);
4)、減少表之間的關聯,特別對於批量數據處理,盡量單表查詢數據,統一在內存中進行邏輯處理,減少資料庫壓力(java處理批量數據不可取,盡量用c或者c++ 進行處理,效率大大提升);
5)、對訪問頻繁的數據,充分利用資料庫cache和應用的緩存;
6)、數據量比較大的,在設計過程中,為了減少其他表的關聯,增加一些冗餘欄位,提高查詢性能。
三、資料庫日誌文件管理
1、查看資料庫中日誌文件;
默認是三個組,這是資料庫創建時自己添加的三個日誌文件組;
2、添加日誌文件組並添加成員。
❺ excel有什麼整理數據的技巧
太長了,給不全,可以去我的空間看,有完整版的,
Excel表格的35招必學秘技
也許你已經在Excel中完成過上百張財務報表,也許你已利用Excel函數實現過上千次的復雜運算,也許你認為Excel也不過如此,甚至了無新意。但我們平日里無數次重復的得心應手的使用方法只不過是Excel全部技巧的百分之一。本專題從Excel中的一些鮮為人知的技巧入手,領略一下關於Excel的別樣風情。
一、讓不同類型數據用不同顏色顯示
在工資表中,如果想讓大於等於2000元的工資總額以「紅色」顯示,大於等於1500元的工資總額以「藍色」顯示,低於1000元的工資總額以「棕色」顯示,其它以「黑色」顯示,我們可以這樣設置。
1.打開「工資表」工作簿,選中「工資總額」所在列,執行「格式→條件格式」命令,打開「條件格式」對話框。單擊第二個方框右側的下拉按鈕,選中「大於或等於」選項,在後面的方框中輸入數值「2000」。單擊「格式」按鈕,打開「單元格格式」對話框,將「字體」的「顏色」設置為「紅色」。
2.按「添加」按鈕,並仿照上面的操作設置好其它條件(大於等於1500,字體設置為「藍色」;小於1000,字體設置為「棕色」)。
3.設置完成後,按下「確定」按鈕。
看看工資表吧,工資總額的數據是不是按你的要求以不同顏色顯示出來了。
二、建立分類下拉列表填充項
我們常常要將企業的名稱輸入到表格中,為了保持名稱的一致性,利用「數據有效性」功能建了一個分類下拉列表填充項。
1.在Sheet2中,將企業名稱按類別(如「工業企業」、「商業企業」、「個體企業」等)分別輸入不同列中,建立一個企業名稱資料庫。
2.選中A列(「工業企業」名稱所在列),在「名稱」欄內,輸入「工業企業」字元後,按「回車」鍵進行確認。
仿照上面的操作,將B、C……列分別命名為「商業企業」、「個體企業」……
3.切換到Sheet1中,選中需要輸入「企業類別」的列(如C列),執行「數據→有效性」命令,打開「數據有效性」對話框。在「設置」標簽中,單擊「允許」右側的下拉按鈕,選中「序列」選項,在下面的「來源」方框中,輸入「工業企業」,「商業企業」,「個體企業」……序列(各元素之間用英文逗號隔開),確定退出。
再選中需要輸入企業名稱的列(如D列),再打開「數據有效性」對話框,選中「序列」選項後,在「來源」方框中輸入公式:=INDIRECT(C1),確定退出。
4.選中C列任意單元格(如C4),單擊右側下拉按鈕,選擇相應的「企業類別」填入單元格中。然後選中該單元格對應的D列單元格(如D4),單擊下拉按鈕,即可從相應類別的企業名稱列表中選擇需要的企業名稱填入該單元格中。
提示:在以後列印報表時,如果不需要列印「企業類別」列,可以選中該列,右擊滑鼠,選「隱藏」選項,將該列隱藏起來即可。
三、建立「常用文檔」新菜單
在菜單欄上新建一個「常用文檔」菜單,將常用的工作簿文檔添加到其中,方便隨時調用。
1.在工具欄空白處右擊滑鼠,選「自定義」選項,打開「自定義」對話框。在「命令」標簽中,選中「類別」下的「新菜單」項,再將「命令」下面的「新菜單」拖到菜單欄。
按「更改所選內容」按鈕,在彈出菜單的「命名」框中輸入一個名稱(如「常用文檔」)。
2.再在「類別」下面任選一項(如「插入」選項),在右邊「命令」下面任選一項(如「超鏈接」選項),將它拖到新菜單(常用文檔)中,並仿照上面的操作對它進行命名(如「工資表」等),建立第一個工作簿文檔列表名稱。
重復上面的操作,多添加幾個文檔列表名稱。
3.選中「常用文檔」菜單中某個菜單項(如「工資表」等),右擊滑鼠,在彈出的快捷菜單中,選「分配超鏈接→打開」選項,打開「分配超鏈接」對話框。通過按「查找范圍」右側的下拉按鈕,定位到相應的工作簿(如「工資.xls」等)文件夾,並選中該工作簿文檔。
重復上面的操作,將菜單項和與它對應的工作簿文檔超鏈接起來。
4.以後需要打開「常用文檔」菜單中的某個工作簿文檔時,只要展開「常用文檔」菜單,單擊其中的相應選項即可。
提示:盡管我們將「超鏈接」選項拖到了「常用文檔」菜單中,但並不影響「插入」菜單中「超鏈接」菜單項和「常用」工具欄上的「插入超鏈接」按鈕的功能。
❻ 如何規范的整理一個資料庫
這個可以說非常麻煩
首先從表
然後整理 列名
最後整理數據存儲
我個人覺得不亞於一個系統的重新設計!
❼ 逐步講解 Oracle資料庫碎片如何整理
對於系統管理員來講,如何保證網路穩定運行,如何提高資料庫性能,使其更加安全高效,就顯得尤為重要。作為影響資料庫性能的一大因素 -- 資料庫碎片,應當引起 DBA 的足夠重視,及時發現並整理碎片乃是 DBA 一項基本維護內容。 1、碎片是如何產生的 當生成一個資料庫時,它會分成稱為表空間( Tablespace )的多個邏輯段( Segment ),如系統(System)表空間 , 臨時(Temporary)表空間等。一個表空間可以包含多個數據范圍(Extent)和一個或多個自由范圍塊,即自由空間(Free Space)。 表空間、段、范圍、自由空間的邏輯關系如下: 當表空間中生成一個段時,將從表空間有效自由空間中為這個段的初始范圍分配空間。在這些初始范圍充滿數據時,段會請求增加另一個范圍。這樣的擴展過程會一直繼續下去,直到達到最大的范圍值,或者在表空間中已經沒有自由空間用於下一個范圍。最理想的狀態就是一個段的數據可被存在單一的一個范圍中。這樣,所有的數據存儲時靠近段內其它數據,並且尋找數據可少用一些指針。但是一個段包含多個范圍的情況是大量存在的,沒有任何措施可以保證這些范圍是相鄰存儲的,當要滿足一個空間要求時,資料庫不再合並相鄰的自由范圍(除非別無選擇), 而是尋找表空間中最大的自由范圍來使用。這樣將逐漸形成越來越多的離散的、分隔的、較小的自由空間,即碎片。例如: 2、碎片對系統的影響 隨著時間推移,基於資料庫的應用系統的廣泛使用,產生的碎片會越來越多,將對資料庫有以下兩點主要影響: 1)導致系統性能減弱。 如上所述,當要滿足一個空間要求時,資料庫將首先查找當前最大的自由范圍,而 「最大」自由范圍逐漸變小,要找到一個足夠大的自由范圍已變得越來越困難,從而導致表空間中的速度障礙,使資料庫的空間分配愈發遠離理想狀態; 2)浪費大量的表空間。 盡管有一部分自由范圍(如表空間的 pctincrease 為非 0 )將會被 SMON (系統監控)後台進程周期性地合並,但始終有一部分自由范圍無法得以自動合並,浪費了大量的表空間。 3、自由范圍的碎片計算 由於自由空間碎片是由幾部分組成,如范圍數量、最大范圍尺寸等,我們可用 FSFI--Free Space Fragmentation Index (自由空間碎片索引)值來直觀體現: FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents))) 可以看出, FSFI 的最大可能值為 100 (一個理想的單文件表空間)。隨著范圍的增加, FSFI 值緩慢下降,而隨著最大范圍尺寸的減少, FSFI 值會迅速下降。 下面的腳本可以用來計算 FSFI 值: rem FSFI Value Compute rem fsfi.sql column FSFI format 999,99 select tablespace_name,sqrt(max(blocks)/sum(blocks))* (100/sqrt(sqrt(count(blocks)))) FSFI from dba_free_space group by tablespace_name order by 1; spool fsfi.rep; / spool off;比如,在某資料庫運行腳本 fsfi.sql, 得到以下 FSFI 值: TABLESPACE_NAME FSFI ------------------------------------- RBS 74.06 SYSTEM 100.00 TEMP 22.82 TOOLS 75.79 USERS 100.00 USER_TOOLS 100.00 YDCX_DATA 47.34 YDCX_IDX 57.19 YDJF_DATA 33.80 YDJF_IDX 75.55統計出了資料庫的 FSFI 值,就可以把它作為一個可比參數。在一個有著足夠有效自由空間,且FSFI 值超過 30 的表空間中,很少會遇見有效自由空間的問題。當一個空間將要接近可比參數時,就需要做碎片整理了。 4、自由范圍的碎片整理1)表空間的 pctincrease 值為非 0。 可以將表空間的預設存儲參數 pctincrease 改為非 0 。一般將其設為 1 ,如: alter tablespace temp default storage(pctincrease 1);這樣SMON 便會將自由范圍自動合並。也可以手工合並自由范圍: alter tablespace temp coalesce。 5、段的碎片整理我們知道,段由范圍組成。在有些情況下,有必要對段的碎片進行整理。要查看段的有關信息,可查看數據字典 dba_segments ,范圍的信息可查看數據字典 dba_extents 。如果段的碎片過多, 將其數據壓縮到一個范圍的最簡單方法便是用正確的存儲參數將這個段重建,然後將舊表中的數據插入到新表,同時刪除舊表。這個過程可以用 Import/Export (輸入 / 輸出)工具來完成。 Export ()命令有一個(壓縮)標志,這個標志在讀表時會引發 Export 確定該表所分配的物理空間量,它會向輸出轉儲文件寫入一個新的初始化存儲參數 -- 等於全部所分配空間。若這個表關閉, 則使用 Import ()工具重新生成。這樣,它的數據會放入一個新的、較大的初始段中。例如: exp user/password file=exp.dmp compress=Y grants=Y indexes=Y tables=(table1,table2);若輸出成功,則從庫中刪除已輸出的表,然後從輸出轉儲文件中輸入表: imp user/password file=exp.dmp commit=Y buffer=64000 full=Y 這種方法可用於整個資料庫。 以上簡單分析了 Oracle 資料庫碎片的產生、計算方法及整理,僅供參考。資料庫的性能優化是一項技術含量高,同時又需要有足夠耐心、認真細致的工作。 對資料庫碎片的一點探討, 下面是一種如何自動處理表空間碎片的代碼,希望對上大家看上文有用 Coalesce Tablespace Automatically This technique comes from Sandeep Naik, a database administrator for GSXXI, Inc. in New York City, New York Here is a handy script which can be scheled to automatically run and coalesces the tablespaces. This script is designed to run in NT but can be run in any operating system by slight modifications in the path where the file spools from the SQLPLUS environment. It assumes that the user who runs the script has priviledges to view the data dictionary. Start of code -------------------------------------- sqlplus / prompt this script will coalesce the tablespace automatically set verify off; set termout off; set head off; spool c: empcoalesce.log select alter tablespace ||TABLESPACE_NAME|| coalesce ; from DBA_FREE_SPACE_COALESCED where PERCENT_EXTENTS_COALESCED
❽ 資料庫設計技巧
就我個人的經驗來說,資料庫雖然在設計上確實需要有一定的經驗,但是它並不是最難的。
對於數據的設計其實是對於現實中業務的一種抽象。
就我的習慣的話,我會先對於現實中的業務場景、業務的角色進行分析。
就拿一般的進銷存系統來舉例吧。
我有一個對於物料管理的倉庫,我需要對我的物料的進銷存進行管理。
那麼我們就需要分析,沒有系統的時候,人與人之間的業務是怎麼流轉的,他們都是通過哪些表單來進行流轉的,上下級之間的消息傳遞和反饋都是怎麼進行的。
當知道了業務以後,我們的資料庫無非就是對於現實中的業務的一種具現。
對於業務的設計完成以後,就是針對角色的了。
例如:業務的傳遞都是在業務人員之間的,我們已經整理表單的傳遞,那角色其實就已經在這些傳遞中存在了。
但是,業務的角色是業務的角色,我們還要包括財務的角色,那對於財務來說,他需要在哪些環節看到這些業務的單據?並且需要怎麼處理?財務的處理結果又包括哪些?不同的處理結果對於下一步的操作又有什麼影響。
當我們把這一切的邏輯整理完成後,我們對於資料庫的功能上就已經滿足了。
接下來的就是抽象數據的分類了。
例如:我們需要對不同的表進行一個分類,我個人喜歡把表分成三種,一種是基礎數據表,一種是過程表,一種是結果表。
怎麼解釋呢?
基礎數據表:顧名思義,就是對於基礎數據的維護,哪些可以成為基礎數據呢?就是我們的業務發生的各個過程中,這些數據都是可以參與其中的,這就是基礎數據。
例如:貨物的信息,客戶的信息。
過程表:就是僅僅在一個過程中使用的表,當這個過程結束了,這個表就沒用了。
例如:訂單表,付款單表。他們表示的僅僅是訂單從下單到最後關閉的這個過程,關閉以後,這個訂單表其實我們就不會再去使用它了。
結果表:這個表的數據有一個特點,只允許添加,不允許刪除和修改,這個表的數據本身就是對於一種最終結果的表現。
例如:日誌表、賬單表。
那我們在進行資料庫設計的時候,就需要將這些使用情況考慮進去,將不同功能的表進行分離,盡量降低耦合,讓相互表的修改不會影響使用。
例如:收款單,我們需要收一筆款的時候,就會生成這個收款單,當款收到後,這個收款單的功能就結束了。
但現實的情況中,可能財務收到了這筆錢,結束了收款單流程後,他發現填錯了,本來應該收100,結果收款單寫的110。
但是,收款單表示的是過程,當這個過程結束了,我們就不會再需要上一個收款單了,所以,按照我們業務的處理流程,我們應該先生成一筆沖抵的收款單,例如收到-110,然後再生成新的100的收款單。
我們每個月還會有財務統計報表,財務報表因為和現實中的財務賬有關,是絕對不允許變動的,因此,這個財務報表就是一個結果表,我們會按月通過批處理程序,將收款單的明細和統計數據放到另一張表中,感覺好像比較冗餘,但是這個確實非常必要的。
因為我曾經就遇到過一個情況,我們直接用過程表來進行數據的統計,然後11月30日有一筆收款已經完成了,結果發現收錯了,就重新做了個收款單,結果本來已經出了11月結果的賬單發生了變化,導致財務實際的處理出現了問題。
因此,數據的冗餘有時候是有必要的,我們需要根據不同表的類型進行一些冗餘的設計。
對於資料庫設計的考慮點還有很多,可能一時半會兒也說不完,大家如果有什麼好的思路,也可以在下方評論或關注我給我留言。
❾ 大數據量的資料庫表設計技巧
大數據量的資料庫表設計技巧
即使是一個非常簡單的資料庫應用系統,它的數據量增加到一定程度也會引起發一系列問題。如果在設計資料庫的時候,就提前考慮這些問題,可以避免由於系統反映遲緩而引起的用戶抱怨。
技巧1:盡量不要使用代碼。比如性別這個欄位常見的做法:1代表男,0代表女。這樣的做法意味著每一次查詢都需要關聯代碼表。
技巧2:歷史數據中所有欄位與業務表不要有依賴關系。如保存列印發票的時候,不要只保留單位代碼,而應當把單位名稱也保存下來。
技巧3:使用中間表。比如職工工資,可以把每一位職工工資的合計保存在一張中間表中,當職工某一工資項目發生變化的時候,同時對中間表的數據做相應更新。
技巧4:使用統計表。需要經常使用的統計數據,生成之後可以用專門的表來保存。
技巧5:分批保存歷史數據。歷史數據可以分段保存,比如2003年的歷史數據保存在 《2003表名》中,而2004年的歷史數據則保存在《2004表名》中。
技巧6:把不常用的數據從業務表中移到歷史表。比如職工檔案表,當某一職工離開公司以後,應該把他的職工檔案表中的信息移動到《離職職工檔案表》中。
1、經常查詢的和不常用的分開幾個表,也就是橫向切分
2、把不同類型的分成幾個表,縱向切分
3、常用聯接的建索引
4、伺服器放幾個硬碟,把數據、日誌、索引分盤存放,這樣可以提高IO吞吐率
5、用優化器,優化你的查詢
6、考慮冗餘,這樣可以減少連接
7、可以考慮建立統計表,就是實時生成總計表,這樣可以避免每次查詢都統計一次
8、用極量數據測試一下數據
速度,影響它的因數太多了,且數據量越大越明顯。
1、存儲將硬碟分成NTFS格式,NTFS比FAT32快,並看你的數據文件大小,1G以上你可以採用多資料庫文件,這樣可以將存取負載分散到多個物理硬碟或磁碟陣列上。
2、tempdbtempdb也應該被單獨的物理硬碟或磁碟陣列上,建議放在RAID0上,這樣它的性能最高,不要對它設置最大值讓它自動增長
3、日誌文件日誌文件也應該和數據文件分開在不同的理硬碟或磁碟陣列上,這樣也可以提高硬碟I/O性能。
4、分區視圖就是將你的數據水平分割在集群伺服器上,它適合大規模OLTP,SQL群集上,如果你資料庫不是訪問特別大不建議使用。
5、簇索引你的表一定有個簇索引,在使用簇索引查詢的時候,區塊查詢是最快的,如用between,應為他是物理連續的,你應該盡量減少對它的updaet,應為這可以使它物理不連續。
6、非簇索引非簇索引與物理順序無關,設計它時必須有高度的可選擇性,可以提高查詢速度,但對表update的時候這些非簇索引會影響速度,且佔用空間大,如果你願意用空間和修改時間換取速度可以考慮。
7、索引視圖如果在視圖上建立索引,那視圖的結果集就會被存儲起來,對與特定的查詢性能可以提高很多,但同樣對update語句時它也會嚴重減低性能,一般用在數據相對穩定的數據倉庫中。
8、維護索引你在將索引建好後,定期維護是很重要的,用dbccshowcontig來觀察頁密度、掃描密度等等,及時用dbccindexdefrag來整理表或視圖的索引,在必要的時候用dbccdbreindex來重建索引可以受到良好的效果。
不論你是用幾個表1、2、3點都可以提高一定的性能,5、6、8點你是必須做的,至於4、7點看你的需求,我個人是不建議的。
❿ 初學資料庫應該從何學起
初學資料庫應該從以下幾點進行學習:
一、編程語言基礎
新手學大數據,首先要掌握基礎的編程語言基礎,比如Java、C++等,要初步掌握面向的對象、抽象類、介面及數據流及對象流等基礎,如果有疑問,可以去網上搜索相關書籍,再結合自己的疑問去翻書,就能很快的熟悉了解資料庫的基礎技術原理。
二、Linux系統的基本操作
Linux系統的基本操作是大數據不可分割的一部分,企業的MySQL大數據的組件都是跑在linux環境下的,所以學會linux常用命令不能缺少,重點是要學習一下Linux環境的搭建,搭建平台,,能寫shell程序就會更好了。
三、學習Hadoop架構設計
要學大數據,首先要了解的是如何在單台Windows系統上通過虛擬機搭建多台Linux虛擬機,從而構建Hadoop集群,再建立spark開發環境,環境搭建成功後在網上搜羅一些demo,sql腳本之類,直接動手敲進去一點一點體會。
四、採用機器學習模式
為了發揮出大數據的優勢,提升你的辦公效率,就需要實操並應用其中的內容,必然也會涉及大量機器學習及演算法,這能最大化的發揮出計算機的性能,也是大數據的優勢所在。
想了解更多有關資料庫的相關信息,推薦咨詢達內教育。作為國內IT培訓的領導品牌,達內的每一名員工都以「幫助每一個學員成就夢想」為己任,也正因為達內人的執著與努力,達內已成功為社會輸送了眾多合格人才,為廣大學子提供更多IT行業高薪機會,同時也為中國IT行業的發展做出了巨大的貢獻。