2010-12-08 6 views
0

가 내가 작업 스케줄러를 여러 번를 통해 실행됩니다 연결된 SQL 테이블에 액세스 MDE 파일을 통해 업데이트 우리의 공유 호스팅 계정에서 호스팅되는 작은 데이터베이스를 가지고 매우 느린 종료 하루.업데이트 SQL Server 테이블은

가 기본적으로 작은 (20 행 이하)의 사용자 테이블, 및 (현재) 1,000 행 데이터 테이블.

기본적으로 내 MDE '프런트 엔드'는 프로덕션 데이터베이스의 데이터를 Access의 임시 테이블로 쿼리하고 호스팅 공급자의 두 원격 테이블에서 데이터를 삭제 한 다음 다시 채 웁니다. 따라서 두 대의 서버 (로컬 서버 하나와 원격 서버 하나)에 연결되어 있으며 때로는 문제가 될 수 있다고 읽었습니다. 더 많은 사람들이 자신의 데이터에 대한 액세스를 요청대로

이 데이터는 천천히 성장하고, 현재 1000 개 행이 테이블은/삭제 연결된 테이블을 사용하여 다시 채울 약 5 분 정도 소요됩니다.

것은 내가 SQL 패스 스루를 사용하여 원격 테이블 데이터를 삭제하여 느림의 일부를 완화했습니다. 삭제는 거의 즉각적입니다. 내 임시 데이터가 로컬 MDE 파일에 그것을 업로드하는 것은 아무 의미 (지금보다 더 빨리되지 않을 것)를하지 않습니다 때문에

그러나, 나는 APPEND 위해 동일을 할 수 없습니다.

원격 서버에 대한 APPEND 쿼리의 속도를 높이려면 어떻게해야합니까? 1000 행의 데이터 (null이 8 열과 같은 것)는 Excel에 두었을 때 그다지 크지 않습니다 (몇 백 킬로바이트, MAYBE). APPEND가 오랫동안 사용하는 것은 의미가 없습니다.

사용자 및 데이터 테이블은 모두이 액세스 속도를하는 데 도움이 내가 읽은, 타임 스탬프 데이터 열이 -> 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가 계속 울려 퍼집니다. 나는 다른 갈등을 없애기 위해 테이블에서 가장 중요한 두 필드로 좁히려 고 노력했습니다.

오류 : [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를 레코드 당 하나의 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

ODBC 연결 데이터베이스에 대한 액세스에서 배치 INSERT를 실행하면 Jet/ACE는 배치 INSERT를 일련의 INSERT (INSERT 당 하나의 행)로 변환합니다. 이것이 느린 이유입니다. 그러나 이것은 또한 레코드 집합을 걷고 한 번에 하나의 레코드를 삽입하는 것과 똑같습니다. 따라서이 제안은 전혀 속도를 향상시키지 못합니다. –

+0

@David 그건 내가 생각했던 것입니다. 추천? – Mindflux

2

같은 ADO 연결에 해고? 나는 Access를 좋아하지만,이 경우에는 아무런 문제가 없으며 직접 실행하면 SQL Agent를 사용하여 작업을 자동화 할 수 있습니다.

+0

그건 내가 생각하지 않은 것입니다. SQL 관리 콘솔에서 테이블을 연결하는 방법을 잘 모르겠지만. – Mindflux

+0

그 복잡하지 ... "SQL 서버에 연결된"구글을 참조하거나 http://msdn.microsoft.com/en-us/library/ff772782.aspx –

+0

그래, 내가 알아 냈어. :) 그냥 지금 일을하는 가장 좋은 방법을 찾으려고. – Mindflux

관련 문제