0

フィルタリングしようとしている小さなadodbレコードセットがあります。これは、テスト顧客の 6 つのレコードです。何らかの理由でフィルターが完了するまでに 2 秒かかります。私は自分の ASP ページでこれを約 30 回実行しています。したがって、ページの読み込みが非常に遅くなります。このページの他のレコードセット フィルタは高速で実行されています。

異なる CursorLocations と CursorTypes を設定しようとしました..

このフィルターが非常に遅い理由を特定するのを手伝ってくれる人はいますか?

rsAvgPrice.Filter = "CommodityID = 13 AND CropYear = '12'"
4

2 に答える 2

0

この問題は解決しました。

問題は、次の方法でレコード セットを宣言したときでした。カーソル タイプは adOpenForwardOnly として設定され、カーソル位置は adUseServer に設定されます。command.Execute を使用してレコードセットを埋める場合、これらの設定は変更できません。

Set cmd = Server.CreateObject("ADODB.Command")

cmd.CommandType = adCmdText

cmd.CommandText = mySQL

cmd.CommandTimeout = 3000

cmd.ActiveConnection = cn

Set rs = Server.CreateObject("ADODB.Recordset")

Set rs = cmd.Execute

Set cmd = Nothing

これを解決した方法は、フィールドを含む永続的なレコードセットを手動で宣言することでした。次に、command.execute を使用して一時レコードセットを埋めました。次に、宣言されたレコードセットに、レコードごとに一時的なレコードセットを手動で設定しました。これにより、カーソル位置を adUseClient に設定できました。したがって、飛躍的にフィルターを高速化します。

于 2012-12-05T17:32:08.363 に答える
0

おそらく、クエリ全体が再度実行されてから、フィルターが適用されます。

すべての項目に対して 1 つのループを作成し、必要なデータをローカル変数に格納してから、独自のフィルターを作成します。最高の効率、はるかに優れた制御。

たとえば、これら 2 つのフィールドでフィルター処理されたデータが必要な場合は、次のように Dictionary を使用します。

Dim oCommodity_CropYear_Data, curKey
Dim curCommodityID, curCropYear, curData
Set oCommodity_CropYear_Data = Server.CreateObject("Scripting.Dictionary")
Do Until rsAvgPrice.EOF
    curCommodityID = rsAvgPrice("CommodityID")
    curCropYear = rsAvgPrice("CropYear")
    curKey = curCommodityID & "_" & curCropYear
    curData = "field1: " &  rsAvgPrice("somefield") & ", field 2: " & rsAvgPrice("other_field") & "<br />"
    oCommodity_CropYear_Data(curKey) = oCommodity_CropYear_Data(curKey) & curData
    rsAvgPrice.MoveNext
Loop
rsAvgPrice.Close

次に、ループでデータを抽出します。

For x=1 To 30
    For y=1 To 12
        curKey = x & "_" y
        If oCommodity_CropYear_Data.Exists(curKey) Then
            Response.Write("Data for Commodity " & x & " and CropYear " & y & ":<br />" & oCommodity_CropYear_Data(curKey)
        End If
    Next
Next

これは一般的な考え方です。実際のニーズに合わせて使用​​できることを願っています。

于 2012-12-05T07:37:09.313 に答える