限制筆數 |
尚未結案
|
chengwenlien
一般會員 發表:11 回覆:16 積分:5 註冊:2004-01-05 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
只修改某一欄位的話應該不會造成太大的 overhead...
不知道您指的是不是 Refresh 畫面的時候造成的??
如果是的話,試看看利用 SQL command 分頁顯示,看會不會好一點?? 如果是指 SQL 執行效率的話,試看看 Batch 的方式執行 SQL..
類似 BDE 的 TQuery TUpdateSQL 的效果,要在 ApplyUpdates 時才會真正執行對 DB 的動作,否則是 cache 在 Local 的... ----
我只會兩件事,這也不會,那也不會
|
chengwenlien
一般會員 發表:11 回覆:16 積分:5 註冊:2004-01-05 發送簡訊給我 |
|
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
引言: 如果是指 SQL 執行效率的話,試看看 Batch 的方式執行 SQL.. 類似 BDE 的 TQuery TUpdateSQL 的效果,要在 ApplyUpdates 時才會真正執行對 DB 的動作,否則是 cache 在 Local 的...講到 ApplyUpdates 我有切身之痛(其實我不會痛,是客戶在痛), 因為我是新手,沒寫過這個東東,我還以為 update 執行過就沒事了, 於是就交差了,結果客戶用一個禮拜後就打電話來跟我講資料都消失了, 我在 說怎麼可能都消失了?? 結果結果..最後的原因正是 cache 在作怪.. 資料都在記憶體內,根本沒存入,當時我是新手第一次寫,根本不知道這 件事,查了很久最後原因才找到,當然我也是死不承認是我的錯。 而客戶有多痛??他大概輸入了400多筆資料都消失了?因為電腦都沒關機,所以 都沒事,結果假日一關機,隔週上班才發現資料都沒了..而且資料消失是 消失兩次(第二次就沒那麼多筆了)..夠痛吧? |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 請教SOUTH WIND兄 何謂SQL command 分頁顯示?以下這是 mysql 的分頁語法,利用改變 LIMIT $begin $page_num 的值達到分頁的功能 (Ex: 每頁 20 筆資料) "SELECT * FROM $datatable ORDER BY id DESC LIMIT $begin,$page_num" 我記得 MS SQL 與 Oracle 是用另外一種方法 (不是直接下 SQL Cmd),但是原理都是一樣的,螢幕 (或目的) 沒有要顯示出這個多筆資料,就不要 select 出來 (或顯示),每次顯示 N 筆,透過 TDBGrid scroll event,來顯示新紀錄(要計算) ---- 我只會兩件事,這也不會,那也不會 ---- 眼見不一定為真 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 因資料量龐大,每當修改某一欄位時,都要等SQL漏斗很久..... 是否有什麼好辦法可改善此問題,多謝各大大指導chengwenlien 你好: 如果下 Update Command 就要等很久, 我想即使分頁取資料, 應該也不會有太大幫助, 只會讓 Open 快一些, 我的建議是: 1. 調整 Index( 多餘的 Index, 反而會造成 Data 異動變慢 ). 2. Data/Index 置放於不同的儲存空間(Oracle:Tablespace; MSSQL/Sybase:DataDevice). 3. 切割資料表( Partition Table ). |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi,chengwenlien 你好: 我贊同 Mickey 大大的說法,Update Command 的等待時間應該與資料量無關,建議你從 DataBase 中著手進行 Tuning
除 Mickey 大大的幾點建議外,你也可以
1.檢查你要 Update 的 Table 是否有適當的 Index
2.如果你的 DataSet 資料是來自於 TQuery,將與Index 有關的欄位一併 Select 出來(即使你不會去異動它,甚至不允許異動) 大家一起加油 --------------------------------
小弟才疏學淺,若有謬誤請不吝指教
--------------------------------
------
Fishman |
chengwenlien
一般會員 發表:11 回覆:16 積分:5 註冊:2004-01-05 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 我試過加入Index後,scroll roll可以快一些 但Apply Update還是慢 但因本表有備註欄位,也有BLOB欄位 是否是這種影響 另外SQL SERVER 7中可以下south wind兄提道的SQL COMMAND嗎? 謝謝指導這樣看起來應該是卡在 SQL Server 上, Mickey 版主與 Fishman 的方法才是正本清源的王道,試看看 Mickey 版主的建議,重新分析(也許正規化是一個方向),將要 Update 的 Table 切開 (即 Mickey 版主建議的 3. 切割資料表),不過這會付出很大的代價 (程式碼會受影響),取捨就您個人了... LIMIT 是 MySQL 的一個 "特異功能" ,我記得 MS SQL 不是直接下 Command 的方法,(在 ASP 的 ADO 中的 Recordset 提供的分頁控制,使用AbsolutePage,PageSize,PageCount等屬性),這可能要請教有經驗人了,資料庫我的程度只是門外漢... 誠如 Mickey 版主所言,分頁只能讓您的顯示速度加速而已,對 Update Command 就要等很久的狀況並無明顯幫助... ---- 我只會兩件事,這也不會,那也不會 ---- 眼見不一定為真 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
|
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
這個問題其實沒啥好討論的,因為這是資料庫引擎效能的特性,當資料量小時
都不會有差別,但當資料超過20萬筆時,資料庫引擎的好壞漸漸可以比較出來了,像paradox就蠻爛的,那個access我不把他當成是資料庫,所以不討論,
那個access其實也蠻爛的。 OK..那要怎樣加快這些速度??還是有幫助的,
第一,當然就是在特定的欄位加上index,暫時刪除用不到的 index。
第二、加快你的硬體設備,例如把RAM加大,或者把硬碟的DMA模式開啟,
這些幫助都會非常的大..,至於加快CPU速度沒用的,要加快CPU不如加
多CPU數量,而且要使用支援多執行序的系統才有效。
第三、程式碼部分當然也有技巧,這些技巧我已經三番兩次在別的文章內容寫
過了,只要用到資料庫,這些技巧都永遠有效,怎樣修改?就是關閉跟元件連結
,你只要下一道指令 Query1->DisableControls(); 只要寫這一行而已,你就會
發覺速度差異性真的很大。如果你有用到迴圈(while...),而且這個過程非常非常久(短暫的話就別加),在這裡面加上 Application->ProcessMessages();
這一行也會加快速度(很神奇吧?大家會認為會變慢,但經過實驗就是會加快,
因為你把資源釋放出來,讓程式去處理別的事情,不把資源咬死,系統就不會
一直在排程上互相打架了)。
我暫時只有想到這些,以後有想到再補上,程度不夠,如果內容有錯誤,還請
各位指正。
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 可否請 Mickey 版大詳述一下?? 給我這井底之蛙開開眼界 ... 在此先致歉,誤會您的意思了... >>< face="Verdana, Arial, Helvetica"> 因為"分割資料行"這個主題, 說明內容資料滿多的, 詳請參閱 SQL Server 線上說明, 會比較清楚. 大致上看了一下 SQL Server 與 Oracle 的分割資料觀念有一些差異, 建置程序也較複雜(透過 View 去 union Table), 而 Oracle 只須於 Table Create 時, DDL 中加以指定便可以, 如 : CREATE TABLE [TableName] ( ID integer not null, ... ) PARTITION BY RANGE (ID) (PARTITION [PartitionName] VALUES LESS THAN (MAXVALUE)); 當資料大到某一程度時, 可將 Table Partition 切割, 如 alter table [TableName] split partition [MainPartitionName] at (30000) into (partition [Partition30K],partition [MainPartitionName]); PS. MSSQL 的 select SQL 可下 Top xxx ,如 :select top 10 * from sysobjects MySQL 我不熟, 不過我想這跟 MySQL "LIMIT" 應該有點像. 發表人 - Mickey 於 2004/01/08 08:51:51 |
terrychen
尊榮會員 發表:90 回覆:794 積分:501 註冊:2003-05-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |