⑴ sqlserver 大數據量的表怎麼修改結構
您好:
從理論上來說,修改表結構和數據量無關。
所以修改方法是一樣的。。。
從實際情況看,您可以根據需要的結構建立新表使用。
原有數據根據情況遷移回來一部分,滿足版本迭代的要求。
逐步棄用原表。。。
⑵ 如何向Oracle資料庫表中進行大數據量的插入並提交
大數據量提交可能會造成系統癱瘓,所以不建議這樣做。
如果有需要,可以在導出insert語句的時候分批次commit(提交)。
方法如下:
1、登錄plsql,進入導出表
⑶ 怎樣用SQL腳本為指定的一批表增加欄位
declare @TableName varchar(255) --要增加欄位的表名
declare @id int --要增加的表ID
declare @sql nvarchar(max) --增加時動態SQL
DECLARE IncludeListTable CURSOR FOR --取出所有表名包括list的表名和表ID
SELECT name ,id
FROM sysobjects where name like '%list%' and xtype='U'
OPEN IncludeListTable
FETCH NEXT FROM IncludeListTable INTO @TableName,@id
IF @@FETCH_STATUS <> 0
PRINT '沒有表'
WHILE @@FETCH_STATUS = 0
BEGIN
if (select COUNT(*) from syscolumns where id=@id and name='contact') =0 --從欄位表中取出本表中contact欄位,如果個數是0,表示沒有
begin
print '為' + @TableName + '表添加欄位contact'
set @sql = 'ALTER TABLE ' + @TableName + ' ADD contact varchar(200) NULL' ;
exec sp_executesql @sql --添加這個欄位
end
FETCH NEXT FROM IncludeListTable INTO @TableName,@id
END
CLOSE IncludeListTable
DEALLOCATE IncludeListTable
寫了一大堆,你看看,對不,看明白再用,頭兩表的判斷我寫的並不是太全,你自己再研究下吧
⑷ 如何在mysql大數據量表中增加一個欄位
1. 能不加欄位就不要加, 能不修改欄位就不要修改, 能不刪除欄位就不要刪除, 等等為什麼要刪除欄位呢? 如果沒事,不要蛋疼的找事。 實際上,我們那次更新失敗後, 我們並沒有增加那個欄位, 然後我們一直運行到今天, 但是後來還是增加了其他欄位
2. 增加欄位的情況下, 如果可以通過增加一個新的表來增加這個欄位, 那麼就增加一個新的表, 通過cache 或 程序來實現join 的效果
3. 如果能停機, 並且停機的時間在你容忍范圍之內, 數據備份之後停機來做。 如果是主從備份,做這樣大的操作的時候,停掉主從備份, 萬一你掛了, 備份資料庫可以救你。 等到一切安全了, 重啟主從備份;
4. 如果上面都不行, 這個欄位還是要改,要加, 需要用到下面的方法, 也是扇貝網正在使用的方法;
修改大數據表的方法:
1. 被修改的表 Table A 需要有一個記錄時間戳的欄位, 這個時間戳就是每次數據更新,都會更新的欄位, 這個欄位需要有索引,在django里可以使用 auto_now=True
2. 創建一個新的臨時表 Table B, 不是tmp_table, 是一個新的表,但是是臨時使用的。 這個表和要修改的表擁有一模一樣的數據結構, 加上你要修改的部分, 比如增加的欄位;
3. 記錄下Table A 的索引
4. 刪除 Table B 的全部索引
5. 把Table A 的數據全部復制到Table B, 是不是執行 INSERT INTO B(field1, field2) SELECT field1, field2 FROM A? 當然不是, 這么做不還是鎖死了Table A 么, 這里的遷移就是一個需要細分的地方,需要寫一個腳本, 讓程序每次讀取比如5000條數據出來, 插入到Table B裡面, 因為Table B 是沒有索引的, 所以要當心不要使用多進程來做; 如果是多進程, 要確保插入到B的時候是不會有重復數據的; 如果是1000萬的數據,每次5000條, 假設這個操作需要500ms, 那麼 2000*200ms = 16 分鍾。 這只是一個估值, 具體情況和伺服器當時的情況有關, 不好細說。 另外, 我們要記錄這個遷移開始的時間點,記為t1;
6. 那麼這個時候Table A 的數據是不是都進入了Table B 呢, 應當說差不多大部分都進入了, 但5中說, 這大概需要16分鍾, 這么長的時間里, 可能有新的數據進入了, 也有可能已有的數據發生了更新, 所以我們要把Table A 中在t1 之後發生變化的數據查找出來, 然後更新到Table B 中, 我們的做法是:
記錄這個操作對應的時間點 t2
BEGIN;
DELETE FROM B WHERE updated_time > t1;
INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t1;
COMMIT;
7. 現在A 和 B 差不多該同步了吧? 差不多了, 但是6 執行完之後, A仍然在寫, 子子孫孫無窮盡也 ... , 但這個時候 A 和 B 的差異已經非常非常小了, 所以在下一步,我們在一個transaction 里執行下面的操作:
BEGIN;
DELETE FROM B WHERE updated_time > t2;
INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t2;
ALTER TABLE A RENAME TO C;
ALTER TABLE B RENAME TO A;
COMMIT;
8. Done
PS: 如果A表沒有時間戳, 實際上沒有先見之明的人大概不會想到要預留一個時間戳的欄位, 那麼幾乎是沒有辦法快速比較兩個表的差異的, 這個時候我選擇的做法就是放棄修改的數據, 只管新的數據了, 所以只要把t1, t2 換成id 就可以了, 這樣delete 語句也省略了, 因為沒啥好delete的;
千萬不要想著根據ID 來JOIN 然後更新B表的欄位來補齊新的數據, 如果能把兩個千萬級別的表JOIN起來, 內存有多大呢?
9. 上面的解決方案是我們第二次嘗試之後犯下了一個巨大的錯誤,這個錯誤導致網站癱瘓了大概20分鍾, 如果你和我一樣沒有發現問題,那麼這就是悲劇的地方。 問題就在於我是根據上面的PS來操作的, 然後B就華麗地變成了A. B 表至今身上是沒有索引的, 立即悲劇。 所以應當在第5步之後按照A的索引為B建立索引, 待索引全部好了之後, 再繼續6。 如果不是走PS這條路, 而是有時間戳的欄位的話, 在6的時候會發現這個問題, 因為那條Delete 慢的超出想像, 會明白這里是有問題的
⑸ sql server中如何寫腳本為數據表增加一個欄位
sql server 使用SQL語句為數據表增加一個欄位,使用alter table子句。
語法:alter table 表格名 add 欄位名 數據類型 -alter table table_name add col_name char(5)
⑹ 大數據量下如何高效過濾表中的某個欄位
(1) 選擇最有效率的表名順序(只在基於規則的優化器中有效):
ORACLE 的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表.
(2) WHERE子句中的連接順序.:
ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾.
(3) SELECT子句中避免使用 『 * 『:
ORACLE在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間
(4) 減少訪問資料庫的次數:
ORACLE在內部執行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變數 , 讀數據塊等;
(5) 在SQL*Plus , SQL*Forms和Pro*C中重新設置ARRAYSIZE參數, 可以增加每次資料庫訪問的檢索數據量 ,建議值為200
(6) 使用DECODE函數來減少處理時間:
使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表.
(7) 整合簡單,無關聯的資料庫訪問:
如果你有幾個簡單的資料庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關系)
(8) 刪除重復記錄:
最高效的刪除重復記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) 用TRUNCATE替代DELETE:
當刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的信息. 如果你沒有COMMIT事務,ORACLE會將數據恢復到刪除之前的狀態(准確地說是恢復到執行刪除命令之前的狀況) 而當運用TRUNCATE時, 回滾段不再存放任何可被恢復的信息.當命令運行後,數據不能被恢復.因此很少的資源被調用,執行時間也會很短. (譯者按: TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)
(10) 盡量多使用COMMIT:
只要有可能,在程序中盡量多使用COMMIT, 這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少:
COMMIT所釋放的資源:
a. 回滾段上用於恢復數據的信息.
b. 被程序語句獲得的鎖
c. redo log buffer 中的空間
d. ORACLE為管理上述3種資源中的內部花費
(11) 用Where子句替換HAVING子句:
⑺ Oracle更新(update)某大數據量的表的最優方法(語句)請教。解決送分。
建議你通過某個條件把這150萬條記錄,分成多個部分,寫個存儲過程,依次執行,執行完一部分就提交一部分。
這樣即即減少了對內存的要求,也防止玩意update出錯,還要花費大量的時間在回滾上。
⑻ 大數據量的資料庫表設計技巧
大數據量的資料庫表設計技巧
即使是一個非常簡單的資料庫應用系統,它的數據量增加到一定程度也會引起發一系列問題。如果在設計資料庫的時候,就提前考慮這些問題,可以避免由於系統反映遲緩而引起的用戶抱怨。
技巧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點看你的需求,我個人是不建議的。
⑼ linux下如何用腳本實現大數據量的文件中快速的把三列內容輸出其中前兩列內容
不用for循環,直接awk。awk本身就是逐行處理文件的。
awk'{print$1FS$2}'myfile
FS: Field Separator,欄位分隔符。
⑽ 如何給1個大數據量的表添加一個新的欄位
1、重新建一張新表tmp_test,把test表的數據到新表tmp_test里,然後給新表加上主鍵,唯一索引。
2、rename表名,切換業務。(將test改為test_bak,將tmp_test改為test)
3、由於原test表不停的有數據的insert 和update操作,所以把第一步執行過程中原test表insert和update變動的數據,更新到新test表。