top
Loading...
編程優化雜談(一)
1. 在SQL中, 如果選擇某字段不為空的記錄有兩種寫法
where columnExample <> ''
或者是
where columnExample is not null

經測試, 后者比前者要快好幾倍(columnExample經過索引)

2. 在ASP中, 使用GetRows與不使用GetRows而直接用Record來循環調用, 兩者其實有所差別, 下面是測試
調用記錄數: 484

使用GetRows, 然后用數組來顯示, 發現單花在GetRows的運算上花了約620毫秒. 總共花了711毫秒

直接用RecordSet來循環調用, 總共花了931毫秒

所以建議大家使用GetRows, 特別是要顯示很多的返回記錄時, 但是它會占用一部分臨時內存.

在直接使用RecordSet時, 大部分時間是花費在游標的移動上, 大概占了90%以上

3. 關于SQL中Count的想法

近日我對一大型數據庫進行編程, 發現我的一段程序的無論怎么優化數據庫, 怎么優化源程序, 執行完畢至少需要
600毫秒以上, 而別一段只需要100多毫秒. 下面是兩段代碼的條件約束(AgentID已經索引):

1. where AgentID = 0 花了600多毫秒
2. where AgentID > 0 只要100多毫秒

真的是很奇怪, 我開始了尋找花費時間的根源, 一忽兒, 我就找到了原來是Count函數, 它花了將近500毫秒來進行
記錄總數統計, 對數據庫的AgentID的值進行分析, 又發現AgentID的98%的值都是0, 看來符合的記錄越多, Count
進行的時間就會越長.
后來我想想, 不知SQL是否會自動進行反計算, 也就是它先計算不符合的條數, 然后計算符合的而返:
1. where AgentID < 1 因為AgentID最不值是0, 所以用此條件也一樣
最后的時間花費仍是600多毫秒, 沒有任何必進.

所以只有一個解決方案, 那就是手動進行, 如果記錄總數已經知, 則只需要計算不符合條件的記錄, 然后 總數減
去不符記錄即可得到查找記錄的總數目.

下面是幾個Count進行的時間測試:

Count(*) 無條件 返回說共有記錄145539, 費時剛好100毫秒

count(*) where name is not Null and Agent = 0 返回說記錄有145530, 費時431-441毫秒
(name is not null去掉的后只需要執行時間110)

Count(*) where name is not Null 返回記錄共有145539, 費時100-110毫秒

以上的測試AgentID都是允許Null值的情況


北斗有巢氏 有巢氏北斗