command對象與RecordSet對象比較及Command+GetRows實現SQL速度提升

我們可以採用:Command+GetRows的方法來提升ASP讀取數據庫數據效率,如:

        dim sql,rs,cmd,r
        sql = "Select [columns] From [table] Where [cloumns]='something' order by [columns]"
        Set cmd = Server.CreateObject("Adodb.Command")
        cmd.ActiveConnection = conn
        cmd.CommandText = sql
        Set rs = cmd.Execute
        If Not rs.eof then
            r = rs.getRows
        end if
        rs.close
        Set rs = Nothing
        Set cmd = Nothing

因爲Command要快過直接Recordset Open,所以我們選擇Command

因爲GetRows直接將所有查詢結果保存到內存,不需要每次Recordset Move,所以我們選擇GetRows

以下是關於這幾種方式對比的一些數據:

Access數據庫保存10W條數據

通過普通的Recordset Open提取:

<%
Set conn= Server.CreateObject("ADODB.Connection")
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db2.mdb")
conn.Open connstr

Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from people order by id desc"
rs.Open sql,conn,1,1

Do While Not rs.EOF
     Response.write rs("id")&" | "
     rs.MoveNext
Loop
%>

結果如下:

耗時3,250.000毫秒,總測試平均值在3秒左右

==========================================================

通過使用Command方式提取:

<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2.mdb")

cmd.ActiveConnection = conn
cmd.CommandText = "Select * from people order by id desc"
Set rs = cmd.Execute

Do While Not rs.EOF
Response.write rs("id")&" | "
rs.MoveNext
Loop
%>

結果如下:

耗時2,187.500毫秒,總測試平均值在2秒左右

=========================================================

發現,以上兩種均不能徹底解決執行時間漫長的問題,主要原因即是循環每次都須向數據庫抽取記錄(Command速度相對較快)

那麼使用Command + GetRows()方法又會是一個怎樣的情況呢:

<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2.mdb")
cmd.ActiveConnection = conn
cmd.CommandText = "Select * from people order by id desc"
Set rs = cmd.Execute
rsArray = rs.GetRows()

For i = 0 To UBound(rsArray, 2)
Response.Write rsArray(0, i)&" | "
Next
%>


結果如下:

耗時187.500毫秒,總測試平均值在0.2秒左右

很明顯,我們可以很明顯的感覺到,在ASP中使用Command+GetRows的方法來讀取數據庫數據是目前爲止所知的具有最高效率的方式!

擴展閱讀:

GetRows 方法

GetRows方法能夠將 Recordset 對象中的多個記錄存儲到內存數組中。

GetRows語法

array = recordset.GetRows( Rows, Start, Fields )

GetRows返回值

返回二維數組。

GetRows參數

Rows    可選,長整型表達式,指定要檢索記錄數。默認值爲 adGetRowsRest (-1)。

Start    可選,字符串長整型,計算得到在 GetRows 操作開始處的記錄的書籤。也可使用下列 BookmarkEnum 值。

常量 說明 AdBookmarkCurrent 從當前記錄開始。 AdBookmarkFirst 從首記錄開始。 AdBookmarkLast 從尾記錄開始。

Fields   可選,變體型,代表單個字段名、順序位置、字段名數組或順序位置號。ADO 僅返回這些字段中的數據。

GetRows使用說明

使用 GetRows 方法可將記錄從 Recordset 複製到二維數組中。第一個下標標識字段,第二個則標識記錄號。當 GetRows 方法返回數據時數組變量將自動調整到正確大小。

如果不指定 Rows 參數的值,GetRows 方法將自動檢索 Recordset 對象中的所有記錄。如果請求的記錄比可用記錄多,則 GetRows 僅返回可用記錄數。

如果 Recordset 對象支持書籤,則可以通過傳送該記錄的 Bookmark 屬性值,來指定 GetRows 方法將從哪個記錄開始檢索數據。

如要限制 GetRows 調用返回的字段,則可以在 Fields 參數中傳送單個字段名/編號或者字段名/編號數組。

在調用 GetRows 後,下一個未讀取的記錄成爲當前記錄,或者如果沒有更多的記錄,則 EOF 屬性設置爲 True

希望本文能幫助大家學習到ASP中如何使用GetRows獲得更高的數據庫讀取效率!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章