|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
lygcw9603
註冊時間: 2011-12-25 文章: 130
第 1 樓
|
發表於: 星期一 十一月 06, 2017 9:16 pm 文章主題: 同分同名次示例 |
|
|
代碼: |
Create Cursor tt (Bh C(10),Cj N(3),Mc N(7))
=Rand(-1)
For i=1 to 100000
Insert Into tt (Bh,Cj) Values (Padl(i,10,"0"),Rand()*100)
EndFor
t1=Seconds()
Index On 200-Cj Tag px
nCj=0
nMc=1
nRec=1
Scan
If Cj!=nCJ
nMc=nRec
EndIF
Replace Mc With nMc
nRec=nRec+1
nCj=Cj
nMc=Mc
EndScan
MessageBox(Transform(Reccount())+" 條記錄共運行:"+Transform(Seconds()-t1,"999.99")+" 秒")
go top
browse
|
雖然代碼有些多,但該方法是VFP中排名次最快的方法,即使VFP中的SQL命令生成的代碼也不會比這段代碼速度快。
歡迎大家可以生成一些數據測試 |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 2 樓
|
發表於: 星期一 十一月 06, 2017 10:22 pm 文章主題: |
|
|
代碼: |
Close Databases All
Create CURSOR tt (Bh C(10),Cj N(3),Mc N(7))
=Rand(-1)
For i=1 To 100000
Insert Into tt (Bh,Cj) Values (Padl(i,10,"0"),Rand()*100)
ENDFOR
nCj=0
nMc=1
nRec=1
SELECT Bh,Cj,GetMc() AS Mc ;
FROM (;
Select Bh,Cj,0000000 AS Mc From tt Order By Cj DESC) a
Function getMc()
vRet = 0
If Cj!=nCj
nMc=nRec
Endif
vRet = nMc
nRec=nRec+1
nCj=Cj
nMc=vRet
Return MAX(vRet-1,0000001)
|
|
|
回頂端 |
|
|
lygcw9603
註冊時間: 2011-12-25 文章: 130
第 3 樓
|
發表於: 星期二 十一月 07, 2017 2:43 am 文章主題: |
|
|
100W條記錄:一樓的代碼運行2-3秒;二樓的代碼運行5秒左右 |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 4 樓
|
發表於: 星期二 十一月 07, 2017 4:49 pm 文章主題: |
|
|
100萬條記錄時,如果資料來源都是實體硬碟的話,結果會略有不同,
比如,Create Table c:\tt (Bh C(10),Cj N(3),Mc N(7))
1樓的程式,需要寫入硬碟100萬次(Replace Mc With nMc ),效能會大為減低,
2樓則只讀不寫,所以,不管資料來源是 cursor 或實體 table , 效能相差不大
當資料筆數越大,比如1000萬筆或更多,1樓程式會越拖越慢。
兩者各有千秋,您可個別試看看 |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2158
第 5 樓
|
發表於: 星期二 十一月 07, 2017 5:39 pm 文章主題: |
|
|
怎麼我的VFP9 執行 ckp6250 的程式比較快呢?
1000 , 10000, 100000 都在1秒內完成.
100W也在 3.17秒完成,
scan的要108.56 秒.
代碼: |
Close Databases All
Create CURSOR tt (Bh C(10),Cj N(3),Mc N(7))
=Rand(-1)
For i=1 To 1000000
Insert Into tt (Bh,Cj) Values (Padl(i,10,"0"),Rand()*100)
ENDFOR
DO test3
do test2
RETURN
FUNCTION test3
t1=Seconds()
nCj=0
nMc=1
nRec=1
SELECT Bh,Cj,GetMc() AS Mc FROM (Select Bh,Cj,00000000 AS Mc From tt Order By Cj DESC) a into cursor zz
? 'SQL',Transform(Reccount())+" 條記錄共運行:"+Transform(Seconds()-t1,"999.99")+" 秒"
Function getMc()
vRet = 0
If Cj!=nCj
nMc=nRec
Endif
vRet = nMc
nRec=nRec+1
nCj=Cj
nMc=vRet
Return MAX(vRet-1,00000001)
*****************
func test2
SELECT tt
t1=Seconds()
Index On 200-Cj Tag px
nCj=0
nMc=1
nRec=1
Scan
If Cj!=nCJ
nMc=nRec
EndIF
Replace Mc With nMc
nRec=nRec+1
nCj=Cj
nMc=Mc
EndScan
? 'scan',Transform(Reccount())+" 條記錄共運行:"+Transform(Seconds()-t1,"999.99")+" 秒"
*use
return
|
_________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
syntech
註冊時間: 2003-05-16 文章: 4225 來自: Taipei,Taiwan
第 6 樓
|
發表於: 星期二 十一月 07, 2017 9:30 pm 文章主題: |
|
|
ckp6250 寫到: | 100萬條記錄時,如果資料來源都是實體硬碟的話,結果會略有不同,
比如,Create Table c:\tt (Bh C(10),Cj N(3),Mc N(7))
1樓的程式,需要寫入硬碟100萬次(Replace Mc With nMc ),效能會大為減低,
2樓則只讀不寫,所以,不管資料來源是 cursor 或實體 table , 效能相差不大
|
不一定.
在FILE SERVER 上,為了安全起見,
通常OS的硬碟讀寫策略會使用較慢的 WRITE THROUGH,
而非較快的WRITE BACK策略,
這時確實一樓應該會感覺到慢一點.
(這裡其實也很難說,因為現代的OS已經比計算機概論中的範本進步很多)
但若是WRITE BACK時,
除非TABLE大到OS的DISK CACHE 裝不進去,
否則一樣的機會較大.
話說回來,就算是CURSOR,
如果資料真的太大的時候,
一樣會被OS移出RAM,擺到實體磁碟中.
也就是根目錄的pagefile.sys _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙
syntech 在 星期二 十一月 07, 2017 9:43 pm 作了第 1 次修改 |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 7 樓
|
發表於: 星期二 十一月 07, 2017 9:41 pm 文章主題: |
|
|
如果是SSD再加上cache很大的話,可能沒差多少
但,如果是傳統硬碟的話,寫入100萬次,(還有索引檔也要隨之更新),用猜的,也知道會有效能問題,
不過,都不要緊啦,使用者最關心的是東西有沒有跑出來,正不正確。 |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 8 樓
|
發表於: 星期二 十一月 07, 2017 9:43 pm 文章主題: |
|
|
garfield 寫到: |
scan的要108.56 秒.
|
您的機器要換了啦,
像我的機器,i7+32G ram + 高速ssd
不管跑一或跑二,都很快,
ckp6250 在 星期二 十一月 07, 2017 10:11 pm 作了第 2 次修改 |
|
回頂端 |
|
|
syntech
註冊時間: 2003-05-16 文章: 4225 來自: Taipei,Taiwan
第 9 樓
|
發表於: 星期二 十一月 07, 2017 9:51 pm 文章主題: |
|
|
ckp6250 寫到: |
但,如果是傳統硬碟的話,寫入100萬次,(還有索引檔也要隨之更新),用猜的,也知道會有效能問題,
|
現在的傳統硬碟有buffer ram,8/16/32/64/128/256MB,
還有混合SSD的.
有錢就是任性. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
syntech
註冊時間: 2003-05-16 文章: 4225 來自: Taipei,Taiwan
第 10 樓
|
發表於: 星期二 十一月 07, 2017 10:00 pm 文章主題: |
|
|
ckp6250 寫到: | garfield 寫到: |
scan的要108.56 秒.
|
您的機器要換了啦,
像我的機器,i7+32G rma + 高速ssd
不管跑一或跑二,都很快, |
看起來要拿出鎮店之寶
486DX4-100 + 1M RAM + 540M HDD 來測試了.
win95 應該可以動吧.
_________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 11 樓
|
發表於: 星期二 十一月 07, 2017 10:03 pm 文章主題: |
|
|
syntech 寫到: |
現在的傳統硬碟有 buffer ram 256MB
|
真想買來當 Server HD 使用 !
很久沒有買硬碟了,不知道進步這麼快! |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 12 樓
|
發表於: 星期二 十一月 07, 2017 10:09 pm 文章主題: |
|
|
syntech 寫到: |
看起來要拿出鎮店之寶
486DX4-100 + 1M RAM + 540M HDD 來測試了.
win95 應該可以動吧.
|
garfield已經程式寫好了,煩請用貴【鎮店之寶】測看看,
給大伙長點見識,看看100萬筆跑起來如何?
|
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2158
第 13 樓
|
發表於: 星期三 十一月 08, 2017 10:26 am 文章主題: |
|
|
ckp6250 寫到: | garfield 寫到: |
scan的要108.56 秒.
|
您的機器要換了啦,
像我的機器,i7+32G ram + 高速ssd
不管跑一或跑二,都很快, |
我都是用客戶不要的電腦湊一湊來用, 太快了我會跟不上, 會以為我老年痴呆.
讓我沈浸在我的動作還很迅速的幻覺中吧. XD _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
syntech
註冊時間: 2003-05-16 文章: 4225 來自: Taipei,Taiwan
第 14 樓
|
發表於: 星期三 十一月 08, 2017 11:55 am 文章主題: |
|
|
ckp6250 寫到: | syntech 寫到: |
看起來要拿出鎮店之寶
486DX4-100 + 1M RAM + 540M HDD 來測試了.
win95 應該可以動吧.
|
garfield已經程式寫好了,煩請用貴【鎮店之寶】測看看,
給大伙長點見識,看看100萬筆跑起來如何?
|
這種機器"開一次是一次,開一次少一次".
電源鈕按下去不知道會不會"碰"一聲.
所以我也不敢開.
都是先用 VM跑 WIN95/98 看看. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
lygcw9603
註冊時間: 2011-12-25 文章: 130
第 15 樓
|
發表於: 星期三 十一月 08, 2017 12:21 pm 文章主題: |
|
|
1KW條記錄SQL命令比VFP命令多跑30秒以上;VFP用時在30-40秒。 |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|