導航:首頁 > 網路數據 > datatable大數據

datatable大數據

發布時間:2023-05-29 05:49:04

A. 在大數據分析時 例如資產負債表 利潤表這樣的財報數據表屬於什麼表

屬於財務報表。
隨著互聯網信息的高速發展,大數據應用已經成為市場經濟下各大企業的主流應用。大數據時代給了市場經濟新的活力。上市公司作為市場經濟中的龍頭企業,更是在財務報表以及財務分析上側重於應用大數據來科學整合分析財務信息。大數據時代下的財務分析可以從眾多的財務數據信息中提取關鍵信息,對相應條件下的財務報表進行完善和補充修改。因而將大數據時代與財務信息管理進行融合,才會使財務信息的提取更加便捷化、時效化、科學化。
希望幫助到你。

B. c# 如何快速處理大數據量得查詢及顯示

對於大量的數據
分頁的時候,我們可以按需取數據。
行得到記錄
總數

Rscount,
然後
根據自內己需容要設定的每頁顯示的記錄條數,

12條
再計算
可以分成多少頁
Pagecount=
Rscount/12
如果是第5頁,
則取第6頁的12條記錄,頁碼是可以用變數的,如PageSize
每次給不同的頁值。
select
top
12
*
from

where
Id
not
in(select
top
5*12
Id
from

order
by
id
desc)
order
by
Id
desc
以此類推和
擴展。
20萬條記錄的資料庫
用access
太可憐了!

C. 如何優化操作大數據量資料庫

如何優化操作大數據量資料庫

下面以關系資料庫系統Informix為例,介紹改善用戶查詢計劃的方法。
1.合理使用索引
索引是資料庫中重要的數據結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用IBM最先提出的ISAM索引結構。索引的使用要恰到好處,其使用原則如下:
●在經常進行連接,但是沒有指定為外鍵的列上建立索引,而不經常連接的欄位則由優化器自動生成索引。
●在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引。
●在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員表的「性別」列上只有「男」與「女」兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。
●如果待排序的列有多個,可以在這些列上建立復合索引(pound index)。
●使用系統工具。如Informix資料庫有一個tbcheck工具,可以在可疑的索引上進行檢查。在一些資料庫伺服器上,索引可能失效或者因為頻繁操作而使得讀取效率降低,如果一個使用索引的查詢不明不白地慢下來,可以試著用tbcheck工具檢查索引的完整性,必要時進行修復。另外,當資料庫表更新大量數據後,刪除並重建索引可以提高查詢速度。
2.避免或簡化排序
應當簡化或避免對大型表進行重復的排序。當能夠利用索引自動以適當的次序產生輸出時,優化器就避免了排序的步驟。以下是一些影響因素:
●索引中不包括一個或幾個待排序的列;
●group by或order by子句中列的次序與索引的次序不一樣;
●排序的列來自不同的表。
為了避免不必要的排序,就要正確地增建索引,合理地合並資料庫表(盡管有時可能影響表的規范化,但相對於效率的提高是值得的)。如果排序不可避免,那麼應當試圖簡化它,如縮小排序的列的范圍等。
3.消除對大型錶行數據的順序存取
在嵌套查詢中,對表的順序存取對查詢效率可能產生致命的影響。比如採用順序存取策略,一個嵌套3層的查詢,如果每層都查詢1000行,那麼這個查詢就要查詢10億行數據。避免這種情況的主要方法就是對連接的列進行索引。例如,兩個表:學生表(學號、姓名、年齡……)和選課表(學號、課程號、成績)。如果兩個表要做連接,就要在「學號」這個連接欄位上建立索引。
還可以使用並集來避免順序存取。盡管在所有的檢查列上都有索引,但某些形式的where子句強迫優化器使用順序存取。下面的查詢將強迫對orders表執行順序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
雖然在customer_num和order_num上建有索引,但是在上面的語句中優化器還是使用順序存取路徑掃描整個表。因為這個語句要檢索的是分離的行的 *** ,所以應該改為如下語句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
這樣就能利用索引路徑處理查詢。
4.避免相關子查詢
一個列的標簽同時在主查詢和where子句中的查詢中出現,那麼很可能當主查詢中的列值改變之後,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。
5.避免困難的正規表達式
MATCHES和LIKE關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時間。例如:SELECT * FROM customer WHERE zipcode LIKE 「98_ _ _」
即使在zipcode欄位上建立了索引,在這種情況下也還是採用順序掃描的方式。如果把語句改為SELECT * FROM customer WHERE zipcode >「98000」,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。
另外,還要避免非開始的子串。例如語句:SELECT * FROM customer WHERE zipcode[2,3]>「80」,在where子句中採用了非開始子串,因而這個語句也不會使用索引。
6.使用臨時表加速查詢
把表的一個子集進行排序並創建臨時表,有時能加速查詢。它有助於避免多重排序操作,而且在其他方面還能簡化優化器的工作。例如:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>「98000」
ORDER BY cust.name
如果這個查詢要被執行多次而不止一次,可以把所有未付款的客戶找出來放在一個臨時文件中,並按客戶的名字進行排序:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然後以下面的方式在臨時表中查詢:
SELECT * FROM cust_with_balance
WHERE postcode>「98000」
臨時表中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁碟I/O,所以查詢工作量可以得到大幅減少。
注意:臨時表創建後不會反映主表的修改。在主表中數據頻繁修改的情況下,注意不要丟失數據。

7.用排序來取代非順序存取
非順序磁碟存取是最慢的操作,表現在磁碟存取臂的來回移動。SQL語句隱藏了這一情況,使得我們在寫應用程序時很容易寫出要求存取大量非順序頁的查詢。
有些時候,用資料庫的排序能力來替代非順序的存取能改進查詢。
實例分析
下面我們舉一個製造公司的例子來說明如何進行查詢優化。製造公司資料庫中包括3個表,模式如下所示:
1.part表
零件號?????零件描述????????其他列
(part_num)?(part_desc)??????(other column)
102,032???Seageat 30G disk?????……
500,049???Novel 10M neork card??……
……
2.vendor表
廠商號??????廠商名??????其他列
(vendor _num)?(vendor_name) (other column)
910,257?????Seageat Corp???……
523,045?????IBM Corp?????……
……
3.parven表
零件號?????廠商號?????零件數量
(part_num)?(vendor_num)?(part_amount)
102,032????910,257????3,450,000
234,423????321,001????4,000,000
……
下面的查詢將在這些表上定期運行,並產生關於所有零件數量的報表:
SELECT part_desc,vendor_name,part_amount
FROM part,vendor,parven
WHERE part.part_num=parven.part_num
AND parven.vendor_num = vendor.vendor_num
ORDER BY part.part_num
如果不建立索引,上述查詢代碼的開銷將十分巨大。為此,我們在零件號和廠商號上建立索引。索引的建立避免了在嵌套中反復掃描。關於表與索引的統計信息如下:
表?????行尺寸???行數量?????每頁行數量???數據頁數量
(table)?(row size)?(Row count)?(Rows/Pages)?(Data Pages)
part????150?????10,000????25???????400
Vendor???150?????1,000???? 25???????40
Parven???13????? 15,000????300?????? 50
索引?????鍵尺寸???每頁鍵數量???頁面數量
(Indexes)?(Key Size)?(Keys/Page)???(Leaf Pages)
part?????4??????500???????20
Vendor????4??????500???????2
Parven????8??????250???????60
看起來是個相對簡單的3表連接,但是其查詢開銷是很大的。通過查看系統表可以看到,在part_num上和vendor_num上有簇索引,因此索引是按照物理順序存放的。parven表沒有特定的存放次序。這些表的大小說明從緩沖頁中非順序存取的成功率很小。此語句的優化查詢規劃是:首先從part中順序讀取400頁,然後再對parven表非順序存取1萬次,每次2頁(一個索引頁、一個數據頁),總計2萬個磁碟頁,最後對vendor表非順序存取1.5萬次,合3萬個磁碟頁。可以看出在這個索引好的連接上花費的磁碟存取為5.04萬次。

hibernate如何優化大數據量操作?

建議你直接用Jdbc好了,用batch,這樣是最快的。

如何實現大數據量資料庫的歷史數據歸檔

打開資料庫
con.Open();
讀取數據
OdbcDataReader reader = cmd.ExecuteReader();
把數據載入到臨時表
dt.Load(reader);
在使用完畢之後,一定要關閉,要不然會出問題
reader.Close();

這個問題是這樣的:
首先你要明確你的插入是正常業務需求么?如果是,那麼只能接受這樣的數據插入量。
其次你說資料庫存不下了 那麼你可以讓你的資料庫上限變大 這個你可以在資料庫裡面設置的 裡面有個資料庫文件屬性 maxsize
最後有個方法可以使用,如果你的歷史數據不會對目前業務造成很大影響 可以考慮歸檔處理 定時將不用的數據移入歷史表 或者另外一個資料庫。
注意平時對資料庫的維護 定期整理索引碎片

時間維度分區表,然後定情按照規則將屬於歷史的分區數據遷移到,歷史庫上,寫個存儲自動維護分區表。

如何用java jdbc 向資料庫表插入大數據量

一次性插入大量數據,只能使用循環,
如:游標,while 循環語句
下面介紹While 循環插入數據,
SQL 代碼如下:
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 5000000;
SET @rc = 1;
INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
--以上函數取自Inside SQL Server 2005: T-SQL Query一書。
INSERT dbo.Sample SELECT n, RAND(CAST(NEWID() AS BINARY(16))) FROM Nums

php 怎麼解決 大數據量 插入資料庫

ini_set('max_execution_time',Ɔ');
$pdo = new PDO("mysql:host=localhost;dbname=test","root","123456");
$sql = "insert into test(name,age,state,created_time) values";
for($i=0; $i<100000; $i++){
$sql .="('zhangsan',21,1,񟭏-09-17')";
}
$sql = substr($sql,0,strlen($sql)-1);
var_mp($sql);
if($pdo -> exec($sql)){
echo "插入成功!";
echo $pdo -> lastinsertid();
}
試試吧。10萬條1分鍾多,我覺得還行

請教如何通過WCF傳輸大數據量數據

就是直接把DataSet 類型作為參數直接傳遞給服務端
WCF默認支持這么做,直接傳Datatable不行。
你看一下 「服務引用設置」中你選的 *** 類型是什麼,我選的是System.Array
字典 *** 類型是默認第一項 System.Collections.Generic.Dictionary

又是一個把自己架在火上烤的需求啊,
如果不考慮傳輸因素,可以調整wcf配置,提升傳遞的容量,如果是對象傳遞可能還要調整對象層次的深度

D. 資料庫進階:循序漸進講解數據表的十二個設計原則

數據表的設計原則:

( )不應針對整個系統進行資料庫設計 而應該根據系統架構中的組件劃分 針對每個組件所處理的業務進行組件單元的資料庫設計;不同組件間所對應的資料庫表之間的關聯應盡可能減少 如果不同組件間的表需要外鍵關聯也盡量不要創建外鍵關聯 而只是記錄關聯表的一個主鍵 確保組件對應的表之間的獨立性 為系統或表結構的重構提供可能性

( )採用領域模型驅動的方式和自頂向下的思路進行資料庫設計 首先分析系統業務 根據職責定義對象 對象要符合封裝的特性 確保與職責相關的數據項被定義在一個對象之內 這些數據項能夠完整描述該職責 不會出現職責描述缺失 並且一個對象有且只有一項職責 如果一個對象要負責兩個或兩個以上的職責 應進行分拆

( )根據建立的領域模型進行資料庫表的映射 此時應參考資料庫設計第二範式 一個表中的所有非關鍵字屬性都依賴於整個關鍵字 關鍵字可以是一個屬性 也可以是多個屬性的集合 不論那種方式 都應確保關鍵字能夠保證唯一性 在確定關鍵字時 應保證關鍵字不會參與業務且不會出現更新異常 這時 最優解決方案為採用一個自增數值型屬性或一個隨機字元串作為表的關鍵字

( )由於第一點所述的領域模型驅動的方式設計資料庫表結構 領域模型中的每一個對象只有一項職責 所以對象中的數據項不存在傳遞依賴 所以 這種思路的資料庫表結構設計從一開始即滿足第三範式 一個表應滿足第二範式 且屬性間不存在傳遞依賴

( )同樣 由於對象職責的單一性以及對象之間的關系反映的是業務邏輯之間的關系 所以在領域模型中的對象存在主對象和從對象之分 從對象是從 N或困飢N N的角度進一步主對象的業務邏輯 所以從對象及對象關系映射為的表及表關聯關系不存在刪除和插入異常

( )在映射後得出的資料庫表結構中 應再根據第四範式進行進一步修改 確保不存在多值依賴 這時 應根據反向工程的思路反饋給領域模型 如果表結構中存在多值依賴 則證明領域模型中的對象具有至少兩個以上的職責 應根據返李第一條進行設計修正 第四範式 一個表如果滿足BCNF 不應存在多值依賴

( )在經過分析後確認所有的表都滿足二 三 四範式的情況下 表和表之間的關聯盡量採用弱關聯以便於對表欄位和表結構的調整和重構 並且 我認為資料庫中的表是用來持久化一個對象實例在特定時間及特定條件下的狀態的 只是一個存儲介質 所以 表和表之間也不應用強關聯來表述業務(數據間的一致性) 這一職責應由系統的邏輯層來保證 這種方式也確保了系統對於不正確數據(臟數據)的兼容性 當然 從整個系統的角度來說我們還是要盡最大努力確保系統不會產生臟數據 單從另一個角度來說 臟數據的產生在一定程度上也是不可避免的 我們也要保證系統對這種情況的容錯性 這是一個折中的方案

( )應針對所有表的主鍵和外鍵建立索引 有針對性的(針對一些大漏尺遲數據量和常用檢索方式)建立組合屬性的索引 提高檢索效率 雖然建立索引會消耗部分系統資源 但比較起在檢索時搜索整張表中的數據尤其時表中的數據量較大時所帶來的性能影響 以及無索引時的排序操作所帶來的性能影響 這種方式仍然是值得提倡的

( )盡量少採用存儲過程 目前已經有很多技術可以替代存儲過程的功能如 對象/關系映射 等 將數據一致性的保證放在資料庫中 無論對於版本控制 開發和部署 以及資料庫的遷移都會帶來很大的影響 但不可否認 存儲過程具有性能上的優勢 所以 當系統可使用的硬體不會得到提升而性能又是非常重要的質量屬性時 可經過平衡考慮選用存儲過程

( )當處理表間的關聯約束所付出的代價(常常是使用性上的代價)超過了保證不會出現修改 刪除 更改異常所付出的代價 並且數據冗餘也不是主要的問題時 表設計可以不符合四個範式 四個範式確保了不會出現異常 但也可能由此導致過於純潔的設計 使得表結構難於使用 所以在設計時需要進行綜合判斷 但首先確保符合四個範式 然後再進行精化修正是剛剛進入資料庫設計領域時可以採用的最好辦法

( )設計出的表要具有較好的使用性 主要體現在查詢時是否需要關聯多張表且還需使用復雜的SQL技巧

lishixin/Article/program/SQL/201311/16156

E. asp.net用datatable好還是用 dataview好

DataView.RowFilter和DataTable.Select都具有對表進行過濾得到結果的功能。在數據量比較小的時候效率沒有分別,但是對於大數據量,DataView.RowFilter比DataTable.Select的效率要慢很多。
從內部實現上就可以看出來,DataView.RowFilter是每次都對DataTable建立一個視圖,然後再進行操作。
我做以下測試:DataTable數據記錄數3400條,過濾操作3000,DataView.RowFilter完成的速度為100秒,DataTable.Select的速度為1.5秒。可見速度相差之大。
所以在做該類操作的時候請使用DataTable.Select。

F. redis比datatable快

redis是比datatable更快的GB量級的庫。
datatable雖然是數據分析、機器學習等必備利器,但現在流行的機器學習應用訓練模型動輒需要GB級別的數據,很多時候datatable無法快速讀取大數據文件或者進行高效運算,甚至可能存在內存溢出等情況。所以redis是datatable更好的替代品。

G. 緩存 是session 還是 cookie

以前實現數據的緩存有很多種方法,有客戶端的Cookie,有伺服器端的Session和Application。

其中Cookie是保存在客戶端的一組數據,主要用來保存用戶名等個人信息。

Session則保存對話信息。Application則是保存在整個應用程序范圍內的信息,相當於全局變數。

Session

Session用來保存每一個用戶的專有信息

Session的生存期是用戶持續請求時間加上一段時間(一般是20分鍾左右)

Session信息是保存在Web伺服器內存中的,保存數據量可大可小
由於用戶停止使用應用程序之後它仍在內存中存留一段時間,因此這種方法效率較低

代碼:

Session[「UserID」]=」test」;
String UserName=Session[「UserID」].ToString();

Cookie

Cookie用來保存客戶瀏覽器請求伺服器頁面的請求信息

我們可以存放非敏感的用戶信息,保存時間可以根據需要設置

如果沒有設置Cookie失效日期,它的生命周期保存到關閉瀏覽器為止

Cookie對象的Expires屬性設置為MinValue表示永不過期

Cookie存儲的數據量受限制,大多數的瀏覽器為4K因此不要存放大數據

由於並非所有的瀏覽器都支持Cookie,數據將以明文的形式保存在客戶端

代碼:

Resopnse.Cookies[「UserID」]=」test」;
String UserName= Resopnse.Cookies [「UserID」].ToString();

Cache

Cache用於在Http請求期間保存頁面或者數據

Cache的使用可以大大的提高整個應用程序的效率

它允許將頻繁訪問的伺服器資源存儲在內存中,當用戶發出相同的請求後,伺服器不是再次處理而是將Cache中保存的數據直接返回給用戶

可以看出Cache節省的是時間—伺服器處理時間

Cache實例是每一個應用程序專有的,其生命周期==該應用程序周期

應用程序重啟將重新創建其實例

注意:如果要使用緩存的清理、到期管理、依賴項等功能必須使用Insert 或者Add方法方法添加信息

代碼:

Cache[」ID」]=」cc」;或者Cache.Insert(「ID」,」test」);
String ID =Cache[「ID」].ToString();

通常使用最頻繁的是Session,那麼Session和Cache又有什麼區別呢?

Session緩存和Cache緩存的區別。

(1)最大的區別是Cache提供緩存依賴來更新數據,而Session只能依靠定義的緩存時間來判斷緩存數據是否有效。

(2)即使應用程序終止,只要Cache.Add方法中定義的緩存時間未過期,下次開啟應用程序時,緩存的數據依然存在。而Session緩存只是存在於一次會話中,會話結束後,數據也就失效了。

(3)Session容易丟失,導致數據的不確定性,而Cache不會出現這種情況。

(4)由於Session是每次會話就被載入,所以不適宜存放大量信息,否則會導致伺服器的性能降低。而Cache則主要用來保存大容量信息,如資料庫中的多個表。

(5)Session目前只能保存在內存中,對其性能有影響。

Session:為當前用戶會話提供信息。還提供對可用於存儲信息的會話范圍的緩存的訪問,以及控制如何管理會話的方法。它存儲在伺服器的內存中,因此與在資料庫中存儲和檢索信息相比,它的執行速度更快。與不特定於單個用戶會話的應用程

序狀態不同,會話狀態應用於單個的用戶和會話。因此,應用程序狀態非常適合存儲那些數量少、隨用戶的變化而變化的常用數據。而且由於其不發生伺服器-客戶
端數據傳輸,Session還適合存儲關於用戶的安全數據,如購物車信息。

Session的關鍵特性有:存儲於伺服器內存中,與會話相關,在會話的整個生存期中存在即不會被主動丟棄,不被序列化,不發生伺服器-客戶端數據傳輸。
Cache:它存儲於

伺服器的內存中,允許您自定義如何緩存項以及將它們緩存多長時間。例如,當缺乏系統內存時,緩存會自動移除很少使用的或優先順序較低的項以釋放內存。該技術

也稱為清理,這是緩存確保過期數據不使用寶貴的伺服器資源的方式之一。它不與會話相關,所以它是多會話共享的,因此使用它可以提高網站性能,但是可能泄露
用戶的安全信息,還由於在伺服器缺乏內存時可能會自動移除Cache因此需要在每次獲取數據時檢測該Cache項是否還存在。

Cache的關鍵特性有:存儲於伺服器內存中,與會話無關,根據伺服器內存資源的狀況隨時可能被丟棄,不被序列化,不發生伺服器-客戶端數據傳輸。

Cookie:Cookie 提供了一種在 Web 應用程序中存儲用戶特定信息的方法。例如,當用戶訪問您的站點時,您可以使用 Cookie
存儲用戶首選項或其他信息。當該用戶再次訪問您的網站時,應用程序便可以檢索以前存儲的信息。在開發人員以編程方式設置Cookie時,需要將自己希望保
存的數據序列化為字元串(並且要注意,很多瀏覽器對Cookie有4096位元組的限制)然後進行設置。

Cookie的關鍵特性有:存儲於客戶端硬碟上,與用戶相關,在一定時間內持久化存儲,可以跨瀏覽器共享數據,需要被序列化,發生伺服器-客戶端數據傳輸。

下面這個問題很有啟發性:

最近小組的同事很喜歡用Session做頁面跳轉,具體就是在查詢頁面把查詢結果放到DataTable中,用Session存儲這個dataTable,讀取到數據之後再子頁面做Session清除,這樣對性能有沒有什麼影響?

1、session:session的確是存放在伺服器的內存中(但不是4k上限,具體大小限制應該是伺服器內存),而且同一個sessionid的多個
http請求會排隊,也就是session對於同一個瀏覽器來說是同步的,用不好會極大影響性能。另外,session依賴於客戶端cookie,因為
sessionid是存放在客戶端瀏覽器進程cookie中的,因此不支持cookie的瀏覽器,session也會丟失(session
url重寫可部分解決這個問題,可參考:http://www.sungness.com/archives/48)。因此不建議用。

2、cookie,也不建議存放datatable這樣的「大數據」。因為cookie不僅有4k上限,並且不是「純存放在客戶端」這么簡單,要知道

cookie的值在每次web頁面請求往返的過程中都是要附帶在http頭中的,如果太大會佔用伺服器和客戶端之間的網路帶寬(雖然只是4k,但在線人多
了可就是4k * n了)。對於b/s結構的應用來說,網路帶寬是性能最主要的瓶頸之一!另外,對於datatbale轉換成json字元串再存入
cookie,伺服器CPU也會消耗。最可怕的是,一但你的cookie忘記刪除了,那麼在其有效期和作用域內,用戶訪問你的所有頁面時都將攜帶這個4K
大小的http頭,那就悲劇了。10000在線人數,4千兆網卡也不夠你花的。

3、資料庫連接,每次保存查詢語句然後再查詢的方式不錯,不過看你的查詢復雜度了,如果很費時的查詢,這樣調用也是不可取的。內存和cpu的矛盾你要根據

實際情況作出選擇。對於具有連接池的應用來說,一次連接數據的成本並不高,經過測試差不多=10次調用取當前系統時間函數。但查詢語句的復雜度就沒譜了。

另外,如果並發人數很多的情況下,頻繁佔用資料庫連接,會導致連接池沒有可用連接了,那就又悲劇了。此時就不是一次連接的成本,系統整體性能將毀滅性的下
降,反應遲鈍。

4、cache:一個不錯的選擇,不過它可同樣是佔用伺服器內存哦,只是比session多了一些靈活性。不過我也不建議你用於存放傳遞參數的地方。要知

道session就算內存滿了也不會丟失你的參數值(會拋異常),可cache可不是,它會直接刪掉你的參數值,甚至內存極度不足時都不會讓你進去(也不
會報錯)。換句話說,可能上一行代碼剛存進去,下一行代碼去讀就丟了。很可怕吧~

5、form表單:最為提倡的方式,http協議中原本頁面間傳值的方法就是這樣的,只是有時不太方便,能用之則用之。
6、自定義存儲機制:如果你對性能要求很苛刻,或者非要精益求精的話。那麼還是自己寫一個存儲機制吧。例如我自己就是寫了自己的XSession對象,它

的用法與session使用類似,但是存儲機制都是我自己封裝的,既有cache的優點、又有session的優點,還有資料庫的優點、性能看你寫的演算法
了、而且具有更大的使用靈活性。缺點就是需要你自己coding.

H. 一個200行數據的datatable大概佔用多少內存

太少了,現在的內存都是用G來計算的,200行對它來說太少了!

你可以通過二進制序列化,把你那個datatable序列化到文件裡面,你可以大概知道大小了!

BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
DataTable dt = new DataTable();
bf.Serialize(ms, dt);

運行看了看,一個空的DataTable也就930個位元組,在.NET 4.0裡面!

I. C#:幾種資料庫的大數據批量插入

/// <summary>
/// 提供數據批量處理的方法。
/// </summary>
public interface IBatcherProvider : IProviderService
{
/// <summary>
/// 將 <see cref="DataTable"/> 的數據批量插入到資料庫中。
/// </summary>
/// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
/// <param name="batchSize">每批次寫入的數據量。</param>
void Insert(DataTable dataTable, int batchSize = 10000);
}

一、SqlServer數據批量插入
SqlServer的批量插入很簡單,使用SqlBulkCopy就可以,以下是該類的實現:

/// <summary>
/// 為 System.Data.SqlClient 提供的用於批量操作的方法。
/// </summary>
public sealed class MsSqlBatcher : IBatcherProvider
{
/// <summary>
/// 獲取或設置提供者服務的上下文。
/// </summary>
public ServiceContext ServiceContext { get; set; }

/// <summary>
/// 將 <see cref="DataTable"/> 的數據批量插入到資料庫中。
/// </summary>
/// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
/// <param name="batchSize">每批次寫入的數據量。</param>
public void Insert(DataTable dataTable, int batchSize = 10000)
{
Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)
{
return;
}
using (var connection = (SqlConnection)ServiceContext.Database.CreateConnection())
{
try
{
connection.TryOpen();
//給表名加上前後導符
var tableName = DbUtility.FormatByQuote(ServiceContext.Database.Provider.GetService<ISyntaxProvider>(), dataTable.TableName);
using (var bulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, null)
{
DestinationTableName = tableName,
BatchSize = batchSize
})
{
//循環所有列,為bulk添加映射
dataTable.EachColumn(c => bulk.ColumnMappings.Add(c.ColumnName, c.ColumnName), c => !c.AutoIncrement);
bulk.WriteToServer(dataTable);
bulk.Close();
}
}
catch (Exception exp)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}
}

SqlBulkCopy的ColumnMappings中列的名稱受大小寫敏感限制,因此在構造DataTable的時候應請注意列名要與表一致。
以上沒有使用事務,使用事務在性能上會有一定的影響,如果要使用事務,可以設置SqlBulkCopyOptions.UseInternalTransaction。

二、Oracle數據批量插入
System.Data.OracleClient不支持批量插入,因此只能使用Oracle.DataAccess組件來作為提供者。

/// <summary>
/// Oracle.Data.Access 組件提供的用於批量操作的方法。
/// </summary>
public sealed class OracleAccessBatcher : IBatcherProvider
{
/// <summary>
/// 獲取或設置提供者服務的上下文。
/// </summary>
public ServiceContext ServiceContext { get; set; }

/// <summary>
/// 將 <see cref="DataTable"/> 的數據批量插入到資料庫中。
/// </summary>
/// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
/// <param name="batchSize">每批次寫入的數據量。</param>
public void Insert(DataTable dataTable, int batchSize = 10000)
{
Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)
{
return;
}
using (var connection = ServiceContext.Database.CreateConnection())
{
try
{
connection.TryOpen();
using (var command = ServiceContext.Database.Provider.DbProviderFactory.CreateCommand())
{
if (command == null)
{
throw new BatcherException(new ArgumentException("command"));
}
command.Connection = connection;
command.CommandText = GenerateInserSql(ServiceContext.Database, command, dataTable);
command.ExecuteNonQuery();
}
}
catch (Exception exp)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}

/// <summary>
/// 生成插入數據的sql語句。
/// </summary>
/// <param name="database"></param>
/// <param name="command"></param>
/// <param name="table"></param>
/// <returns></returns>
private string GenerateInserSql(IDatabase database, DbCommand command, DataTable table)
{
var names = new StringBuilder();
var values = new StringBuilder();
//將一個DataTable的數據轉換為數組的數組
var data = table.ToArray();

//設置ArrayBindCount屬性
command.GetType().GetProperty("ArrayBindCount").SetValue(command, table.Rows.Count, null);

var syntax = database.Provider.GetService<ISyntaxProvider>();
for (var i = 0; i < table.Columns.Count; i++)
{
var column = table.Columns[i];

var parameter = database.Provider.DbProviderFactory.CreateParameter();
if (parameter == null)
{
continue;
}
parameter.ParameterName = column.ColumnName;
parameter.Direction = ParameterDirection.Input;
parameter.DbType = column.DataType.GetDbType();
parameter.Value = data[i];

if (names.Length > 0)
{
names.Append(",");
values.Append(",");
}
names.AppendFormat("{0}", DbUtility.FormatByQuote(syntax, column.ColumnName));
values.AppendFormat("{0}{1}", syntax.ParameterPrefix, column.ColumnName);

command.Parameters.Add(parameter);
}
return string.Format("INSERT INTO {0}({1}) VALUES ({2})", DbUtility.FormatByQuote(syntax, table.TableName), names, values);
}
}
以上最重要的一步,就是將DataTable轉為數組的數組表示,即object[][],前數組的上標是列的個數,後數組是行的個數,因此循環Columns將後數組作為Parameter的值,也就是說,參數的值是一個數組。而insert語句與一般的插入語句沒有什麼不一樣。

J. .Net 大數據量導出Excel方案

當要導出的 DataTable 數據量很大時(喚兆含比如行數幾十萬的情況下), NPOI 內存佔用非常高,這里和笑研究一下性能更好的 excel 導出方式

內猜隱存佔用不超過【260 MB】,耗時【30秒】,生成文件大小【48.1MB】

顯然,在只考慮生成文件的情況下,應該選擇使用 OpenXmlWriter 的方式

GitHub Page-LargeDataExportExcel

閱讀全文

與datatable大數據相關的資料

熱點內容
2602i升級胖ap 瀏覽:642
macbookair怎麼關閉程序 瀏覽:485
有道機器人編程課怎麼樣 瀏覽:791
商業銀行app如何查看銀行卡號 瀏覽:522
貴港市直播app開發怎麼樣 瀏覽:674
iphone6畫面同步電腦 瀏覽:801
adf上傳文件 瀏覽:772
微信撩妹表情包 瀏覽:935
作息app 瀏覽:24
29星卡哪些app免流 瀏覽:842
如何查找歷史地震數據 瀏覽:315
iphone6港版和國行哪個好 瀏覽:760
word錄制新宏 瀏覽:939
官方航班app有哪些 瀏覽:836
jssubstring中文 瀏覽:463
讀取小米路由器文件 瀏覽:739
win10玩孤島驚魂4 瀏覽:844
微信jssdk配置 瀏覽:89
蘋果系統光碟機怎麼存儲文件 瀏覽:722
把文件夾發送 瀏覽:681

友情鏈接