2008-11-11 4 views
2

수행하는 데 약 30 초가 걸리는 특정 SQL 문을 가지고 있으며 누군가가 문제를 볼 수 있는지 또는 추가 인덱싱이 필요한지 궁금합니다.MS Access의 로컬 서버에서 느린 SQL 코드

코드는 Access의 하위 폼에 있으며 마스터 폼의 5 개 필드 내용에 따라 결과가 표시됩니다. 쿼리되는 테이블에는 약 5000 개의 레코드가 있습니다. Access 프로젝트는 실제 SQL 서버의 터미널 서버 세션에서 저장되고 실행되므로 네트워크 문제라고 생각하지 않습니다. 동일한 유형의 쿼리를 사용하는 매우 유사한 다른 형식이 있습니다 ...

감사

PG

SELECT TabDrawer.DrawerName, TabDrawer.DrawerSortCode, TabDrawer.DrawerAccountNo, TabDrawer.DrawerPostCode, QryAllTransactons.TPCChequeNumber, tabdrawer.drawerref 
FROM TabDrawer LEFT JOIN QryAllTransactons ON TabDrawer.DrawerRef=QryAllTransactons.tpcdrawer 
WHERE (Forms!FrmSearchCompany!SearchName Is Null 
     Or [drawername] Like Forms!FrmSearchCompany!SearchName & "*") 
     And (Forms!FrmSearchCompany.SearchPostcode Is Null 
     Or [Drawerpostcode] Like Forms!FrmSearchCompany!Searchpostcode & "*") 
     And (Forms!FrmSearchCompany!SearchSortCode Is Null 
     Or [drawersortcode] Like Forms!FrmSearchCompany!Searchsortcode & "*") 
     And (Forms!FrmSearchCompany!Searchaccount Is Null 
     Or [draweraccountno] Like Forms!FrmSearchCompany!Searchaccount & "*") 
     And (Forms!FrmSearchCompany!Searchcheque Is Null 
     Or [tpcchequenumber] Like Forms!FrmSearchCompany!Searchcheque & "*"); 
    "); 

편집

보류 최대가 될 것으로 보인다 QryAllTransactons 쿼리를 구성하는 통합 쿼리.

SELECT 
    "TPC" AS Type, 
    TabTPC.TPCRef, 
    TabTPC.TPCBranch, 
    TabTPC.TPCDate, 
    TabTPC.TPCChequeNumber, 
    TabTPC.TPCChequeValue, 
    TabTPC.TPCFee, 
    TabTPC.TPCAction, 
    TabTPC.TPCMember, 
    tabtpc.tpcdrawer, 
    TabTPC.TPCUser, 
    TabTPC.TPCDiscount, 
    tabcustomers.* 
FROM 
    TabTPC 
    INNER JOIN TabCustomers ON TabTPC.TPCMember = TabCustomers.CustomerID 

UNION ALL 

SELECT 
"CTP" AS Type, 
    TabCTP.CTPRef, 
    TabCTP.CTPBranch, 
    TabCTP.CTPDate, 
    TabCTP.CTPChequeNumb, 
    TabCTP.CTPAmount, 
    TabCTP.CTPFee, 
    TabCTP.CTPAction, 
    TabCTP.CTPMember, 
    0 as CTPXXX, 
    TabCTP.CTPUser, 
    TabCTP.CTPDiscount, 
    TABCUSTOMERS.* 
FROM 
    TabCTP 
    INNER JOIN TabCustomers ON Tabctp.ctpMember = TabCustomers.CustomerID; 

나는

+0

"프로젝트에 액세스하십시오."라고 말합니다. 이것은 ADP입니까? 그렇다면 꼭 필요한 답변의 종류가 바뀝니다. –

+0

전체 스레드를 읽었으며 ADP-> SQL Server 또는 MDB-> ODBC-> SQL Server인지 여부는 여전히 알 수 없습니다. –

+0

david의 질문에 즉시 대답하십시오. –

답변

2

두 가지. 이 데이터베이스는 SQL Server 백엔드가있는 Access 데이터베이스이므로 저장 프로 시저로 변환하면 속도가 상당히 향상 될 수 있습니다.

두 번째로, 특히 tabCustomers 테이블에서 모든 필드를 반환해야합니까? 실제로 사용하려는 것보다 많은 필드를 반환하면 성능이 향상됩니다.

+0

이것은 머리 부분의 못을 쳤습니다. - 모든 필드가 필요한 보고서가 있지만,이 특별한 경우에는 왼쪽 조인이 필요하지도 않습니다. - 저는 노조를 만드는 시계를 만들었습니다. proc을 저장하면 50 배 이상 빨라집니다. 도움을 주신 모든 분들께 감사드립니다. –

+0

첫 번째 SQL 문에서 매개 변수로 양식 컨트롤을 정의하는 것은 어떻습니까? ADP는 사용하지 않지만 MDB 또는 ODBC-> SQL Server를 사용하면 속도가 빨라집니다. 후자의 경우 Jet이 SQL Server로 전달하는 것을 완전히 바꿀 수 있으며 ADP가 똑똑하게 스마트하지는 않을 것이라고 생각합니다. –

1

먼저, 압축 및 .mdb 파일을 복구하려고 ... 간단한 통합 쿼리와 함께 작품의 공정한 조금을 수행하지만,이 전에 본 적이.

WHERE 
    [drawername] Like Nz(Forms!FrmSearchCompany!SearchName, "") & "*" 
    And 
    [Drawerpostcode] Like Nz(Forms!FrmSearchCompany!Searchpostcode, "") & "*" 
    And 
    [drawersortcode] Like Nz(Forms!FrmSearchCompany!Searchsortcode, "") & "*" 
    And 
    [draweraccountno] Like Nz(Forms!FrmSearchCompany!Searchaccount, "") & "*" 
    And 
    [tpcchequenumber] Like Nz(Forms!FrmSearchCompany!Searchcheque, "") & "*" 

여전히 느리게 실행됩니까 :

그런 다음 절은 WHERE 당신의 간소화? 그것을 알고 보니

편집

, 문제는 그것이 SQL 서버 백 엔드 및 액세스 프로젝트 프런트 엔드를 가진 최대 크기의 Access 데이터베이스 인 것을 명확하지 않았다.

이것은 전체적인 문제에 대해 다른 점을 밝힙니다.

더 자세히 설명 할 수 있습니까 전체 쿼리를 사용하는 방법은 무엇입니까?

  • 가 올바른 데이터를 반환하는 SQL 서버 뷰를 만들 : 당신은 어떤 형태의 레코드 원본 또는 보고서를 채우는 데 사용하는 경우

    , 나는이 같은 모든 일을 리팩토링 할 수있을 것이라고 생각 하지 액세스 구문

  • 과 더불어, SQL 서버 구문을 볼
  • 쿼리 서버 정렬 그것을 밖으로
+0

그는 SQL Server에 저장된 데이터에 대한 프론트 엔드 (GUI 및 일부 VBA) 인 액세스 프로젝트 파일을 사용하고 있으므로 MDB가없고 필요하지 않은 복구가 필요 없습니다. – VVS

+0

언급 한 또 다른 포인트는 값이 비어있는 부분이 유사한 연산자이기 때문에 쿼리가 더 느려야하며 값이 null 인 경우에도 쿼리를 수행해야한다는 것입니다. – VVS

+0

정말요? 몇 시간 전에 그 사실을 알았습니다. 그의 대답에 대한 논평에서 토론이 계속되었다. 문제를 찾을 수있는 기회가 생길 때까지 나는 내 대답을 업데이트 할 이유를 찾지 못했습니다. – Tomalak

0

QryAllTransactons에 얼마나 많은 행이 있습니까?

결과가 0 행을 반환하면 Access에서 즉시이를 볼 수 있고 중지 할 수 있지만 단일 행도 반환하는 경우 내부적으로 조인을 수행 할 수 있도록 QryAllTransactons의 전체 결과 집합을 가져와야합니다. 그 일은 내 첫 추측 일 것입니다.

일반적으로 SQL Server에서 조인을 수행하는 것이 가장 좋습니다.LEFT OUTER JOIN을 수행하고 이에 대해 쿼리하는 뷰를 생성 해보십시오.

Access는 SQL Server에서 자체적으로 실행되고 네트워크 트래픽을 최소화 할 때도 Access에 절대적으로 필요한 것만 보내면됩니다. 그렇지 않으면 커다란 테이블이 메모리 등을 차지합니다.

+0

방금 ​​확인한 바에는 쿼리에 166 개의 행이 있습니다. –

0

유니온에서 각각의 하위 쿼리를 실행 해 보았습니까? 일반적으로 옵티마이 저는 노조 요소 간의 효율성을 검사하는 데 많은 시간을 소비하지 않습니다. 각 요소는 자체 장점으로 실행됩니다.

사실을 고려하면 "IF"로직을 절차 코드에 넣고 더 많은 호출로 인한 추가 오버 헤드없이 검색 순서대로 각 테스트를 실행할 수 있습니다.

0

연산자와 같은 것을 제거하십시오.

귀하의 경우에는 필요하지 않습니다. 필드가이 같은 아 파크 achive 수 주어진 값으로 시작하면 그냥 확인 :

SELECT 
    TabDrawer.DrawerName, 
    TabDrawer.DrawerSortCode, 
    TabDrawer.DrawerAccountNo, 
    TabDrawer.DrawerPostCode, 
    QryAllTransactons.TPCChequeNumber, 
    TabDrawer.DrawerRef 
FROM 
    TabDrawer 
    LEFT JOIN QryAllTransactons 
    ON TabDrawer.DrawerRef = QryAllTransactons.TpcDrawer 
WHERE 
    (Forms!FrmSearchCompany!SearchName Is Null 
    Or Left([drawername], Len(Forms!FrmSearchCompany!SearchName)) = Forms!FrmSearchCompany!SearchName) 
And 
    (Forms!FrmSearchCompany.SearchPostcode Is Null 
    Or Left([Drawerpostcode], Len(Forms!FrmSearchCompany!Searchpostcode)) = Forms!FrmSearchCompany!Searchpostcode) 
And 
    (Forms!FrmSearchCompany!SearchSortCode Is Null 
    Or Left([drawersortcode], Len(Forms!FrmSearchCompany!Searchsortcode)) = Forms!FrmSearchCompany!Searchsortcode) 
And 
    (Forms!FrmSearchCompany!Searchaccount Is Null 
    Or Left([draweraccountno], Len(Forms!FrmSearchCompany!Searchaccount)) = Forms!FrmSearchCompany!Searchaccount) 
And 
    (Forms!FrmSearchCompany!Searchcheque Is Null 
    Or Left([tpcchequenumber], Len(Forms!FrmSearchCompany!Searchcheque)) = Forms!FrmSearchCompany!Searchcheque) 
: (가독성을위한 몇 가지 포맷을 다시 한)
Left([field], Len(value)) = value 

과 같을 것이다 쿼리에 적용이 방법

대소 문자를 비교한다는 점에 유의하십시오. MS-Access에서 like 연산자가 대소 문자를 구별하는지 확실하지 않습니다. 필요한 경우 두 문자열을 모두 대문자 또는 소문자로 변환하십시오.

0

크기가 커질 때 테이블의 색인이 제대로 만들어 졌는지 확인 했습니까? 색인은 제대로 사용하면 쿼리 속도가 빨라집니다 (삽입/업데이트/삭제 속도가 느려질 수 있으므로 색인 생성 대상을 신중하게 선택하십시오).

관련 문제