2010-12-08 93 views
0

私は、リンクされたSQLテーブルを使用してアクセスMDEファイルで更新する共有ホスティングアカウントでホストされている小さなデータベースを持っています。 1日。WAN経由でSQL ServerのテーブルをWAN経由でアクセスするアクセスが遅い

基本的には、小さな(20行未満)ユーザーテーブルと(現在)1000行のデータテーブルがあります。

基本的に私のMDEの「フロントエンド」は、本番データベースのデータをAccessの一時テーブルに照会し、ホスティングプロバイダの2つのリモートテーブルからデータを削除して再投入します。したがって、2つのサーバー(ローカルサーバーとリモートサーバーの1つ)にリンクされていますが、これが問題になることがあります。

多くの人がデータへのアクセスを求めているため、データが徐々に増加しています。現在、1000行のテーブルには、リンクテーブルを使用して削除/再投入するのに約5分かかります。

SQL Passthroughを使用してリモートテーブルのデータを削除することで、遅さのPARTを軽減しました。削除は瞬時に近いです。

私の一時データは、ローカルMDEファイル上にあり、それは(今よりも速くならない)のは意味がありませんアップロードしかし、私はAPPENDのために同じことを行うことはできません。

私が知りたいのは、どのようにしてAPPENDクエリをリモートサーバーに高速化できますか? 1000行のデータ(8列のようなもので、ヌルが少ないもの)は、Excelに置くと非常に大きくはありません(カップル100 KB、MAYBE)。

ユーザーとデータテーブルの両方にタイムスタンプのデータ列があります。これは、Accessがタイムスタンプと行の比較をチェックできるため、Access - > SQLの削除/追加のスピードアップに役立ちます。

私はこれをスピードアップする方法についていくつかの提案が大好きです。どのような方法でも、それは大量のデータではありません。


Private Sub UpdateWebFunc() 
On Error GoTo errors 
    Dim conn As New ADODB.Connection 
    Dim cmd As New ADODB.Command 
    Dim rst As New ADODB.Recordset 
    Dim rst2 As DAO.Recordset 
    Dim qdf As DAO.QueryDef 

    conn.ConnectionString = "Blah blah blah here" 

    conn.Open 

    Set qdf = CurrentDb.QueryDefs("GetWebData") 

    Set rst2 = qdf.OpenRecordset 
    If Not rst2.BOF And Not rst2.EOF Then 
    rst2.MoveFirst 
    End If 

    With cmd 
    .CommandText = ”sp_UpdateWeb” 
    .CommandType = adCmdStoredProc 
    .ActiveConnection = conn 
    .NamedParameters = True 
    '.Parameters.Append .CreateParameter("@RETURN_VALUE", adInteger, adParamReturnValue, 0) 
    .Parameters.Append .CreateParameter("@SampID", adVarChar, adParamInput, 50) 
    .Parameters.Append .CreateParameter("@ReportTitle", adVarChar, adParamInput, 50) 
    End With 
    conn.BeginTrans 
    Do Until rst2.EOF 
    cmd.Parameters("@SampID") = rst2!SampID 
    cmd.Parameters("@ReportTitle") = rst2!ReportTitle 

    cmd.Execute , , adExecuteNoRecords 
    rst2.MoveNext 
    Loop 
    conn.CommitTrans 
    conn.Close 
Set cmd = Nothing 

    rst2.Close 
    Set rst2 = Nothing 

errors: 
    MsgBox "Number: " & Err.Number & vbCr & " Description: " & Err.Description 
End Sub 

文法エラーでcmd.executeが立ち往生しています。私はテーブルの2つの最も重要なフィールドに絞り込み、他の競合を排除しようとしました。

ERROR:[Microsoft]の[ODBC SQL Serverドライバー]構文エラーまたはアクセス違反

ここに私のSPです:


USE [MYDB] 
GO 

SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 
ALTER PROCEDURE [dbo].[sp_UpdateWeb] 
    -- Add the parameters for the stored procedure here 
    @SampID VarChar(50), 
    @ReportTitle VarChar(50) 

AS 
BEGIN 
    -- Insert statements for procedure here 
    INSERT INTO [dbo].[WEB] (SampID, ReportTitle) VALUES (@SampID, @ReportTitle) 

END 
+0

別のツールを試して、問題がAccessまたは接続またはホストによるものかどうかを確認できます。 –

+0

これはおそらくすべてのものです。私はリモートホスト上のテーブルに5200行を追加したSQLMS経由のアップデートを実行したところ、約6分かかりました。 :/ – Mindflux

+0

挿入のためにADOを使用しようとしましたか?バッチINSERTをレコードごとに1つのINSERT(Jet/ACEがバッチINSERTをODBCサーバーデータベースに送信する仕組み)に分割する際に、Jet/ACEの間違った決定をバイパスする可能性があります。 –

答えて

1

私は、現時点ではあなたがすることで、データを追加していること、それを取るが、アクセスクエリを使用して? brute forceメソッドを試して、ローカルテーブルをコードで開き、そのレコードセットをループして各行のinsertステートメントを起動することができます。これをすべてトランザクション内でラップしてパフォーマンスを向上させることができます。また、挿入ステートメントをローカルに作成するのではなく、パラメータを渡して渡すSQLサーバー上でストアドプロシージャを実行することもできます。

コードサンプルを追加しました*

あなたはすでに私はそのためのプレストコードを使用するように、ローカルテーブルを開く方法を知っています。あなたは、ローカルアクセステーブルのためにDAOを使用することができます(そして、いくつか議論する必要があります)。ストアドプロシージャは、本番サーバーへのリンクサーバーとしてリモートサーバーを取り付けて、完全にアクセスをバイパスしないのはなぜこの

DIM cmd as NEW ADODB.Command 
Dim dbCon as NEW ADODB.Connection 

dbCon.ConnectionString = “Your connection string to the SQL server” 
dbCon.Open 

‘Setup the command 
With CMD 
.CommandText=”spYour_stored_procedure” 
.CommandType=adCmdStoredProc 
.ActiveConnection=dbCon 
.NamedParameters=True 
.Parameters.Append .CreateParameter("@YourIntField", adInteger, adParamInput, 0, 123456) 
.Parameters.Append .CreateParameter("@YourTextField", adVarChar, adParamInput, 20, “Badger”) 
‘keep on adding parameters 
End With 
dbcon.BeginTrans 
Do until YourDAORecordset.EOF 
cmd.Parameters(“@YourIntField”)= YourDAORecordset.YourField 
cmd.Parameters(“@YourTextField”)=” YourDAORecordset.YourOtherField 
cmd.Execute , , adExecuteNoRecords 
YourDAORecordset.MoveNext 
Loop 
dbcon.CommitTrans 
Dbcon.close 
Set cmd=nothing 

+0

はい私はAccessを使用して追加しています。私は数百のインサートを持っているのは、私の現在の状況よりも良くないと思いますか?とにかくクエリーがやっていることは多かれ少なかれですか? – Mindflux

+0

AccessからODBCリンクデータベースへのバッチINSERTを実行すると、Jet/ACEはバッチINSERTを一連のINSERT(INSERTごとに1行)に変換します。これが遅い理由です。しかし、それはレコードセットを歩いて一度に一つのレコードを挿入するのとまったく同じです。だから、この提案は物事を速くすることはありません。 –

+0

@Davidそれは私が思ったものです。推薦? – Mindflux

2

などのADO接続で解雇されましたか?私はAccessが好きですが、このケースでは、それは不公平です、そして、直接SQLエージェントを使用してタスクを自動化することができます。

+0

それは私が考えなかったものです。 SQL管理コンソールでテーブルをリンクする方法がわかっていませんが、 – Mindflux

+0

それほど複雑ではありません... "SQL Serverにリンクされた" Googleを参照するか、http://msdn.microsoft.com/en-us/library/ff772782.aspxを参照してください。 –

+0

ええ、私はそれを得ました。 :)ちょうど今、物事を行うための最良の方法を見つけようとしています。 – Mindflux

関連する問題