2012-03-23 3 views
1

테이블 tbl_ 수익에서 최소 수익을 찾아야했습니다. 내가 할 두 가지 방법을 발견 :"Min in Select 문"또는 DMin(). 어느 것이 더 낫습니까?

방법 1

Dim MinRevenueSQL As String 
Dim rsMinRev As DAO.Recordset 
MinRevenueSQL = "SELECT Min(tbl_Revenue.Revenue_Value)As MinRevenue FROM tbl_Revenue WHERE (((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'));" 
Set rsMinRev = CurrentDb.OpenRecordset(MinRevenueSQL) 
MinRev = rsMinRev!MinRevenue 

방법 2

MinRev2 = DMin("Revenue_Value", "tbl_Revenue", "(((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'))") 

나는 다음과 같은 질문이 있습니다

그들 중 하나가 계산 더 효율적입니다
  1. ? tbl_Revenue 테이블 대신 조인을 사용하는 select 문장이 있다면 계산 효율면에서 많은 차이가 있습니까?
  2. DMin 기금의 정확성에 문제가 있습니까? (정확도 내 말은 내가 DMIN를 사용하기 전에 알아야 할 거기에 어떤 허점이 있습니다.) 특정 코드에서

답변

1

는 많은 차이를하지 않도록, 당신은 한 번 실행하고 있습니다. 반복문이나 쿼리에있어 수백 또는 수천 번의 반복을 결합하면 문제가 발생합니다. MinRev2의 부품을 교체,

Sub runDMin() 
    x = Timer 

    For i = 1 To 10000 
     MinRev2 = DMin("Revenue_Value", "tbl_Revenue", "(((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'))") 
    Next 

    Debug.Print "Total runtime seconds:" & Timer - x 
End Sub 

는 그 다음 DAO 쿼리에 대한 동일하게 구현 :

반복 수천 이상 성능이 당신에게 중요하다면

는, 나는 다음과 같은 일을 작성합니다. 그들을 여러 번 실행하고 평균을 취하십시오. 실행 조건을 시뮬레이트하기 위해 최선을 다하십시오. 예를 들어, 각 쿼리 내의 매개 변수를 변경하는 경우 두 방법 모두의 성능에 영향을 줄 가능성이 높으므로 동일한 작업을 수행하십시오. Access에서 DAO 및 ADO와 유사한 작업을 수행했으며 내 조건에서 DAO가 더 빠르게 실행되고 있음을 알면 놀랐습니다. (몇 년 전 이었으므로 그 이후로 상황이 바뀌었을 것입니다.)

외부 테이블에서 최소값을 얻기 위해 쿼리에서 DMin을 사용할 때 분명히 다른 점이 있습니다. 액세스 문서에서 :

팁 : 외국 테이블의 필드에서 최소값 를 찾기 위해 DMIN 기능을 사용할 수 있지만, 필드를 포함하는 쿼리를 생성하는 것이 더 효율적이 될 수 있음 두 테이블 모두에서 필요하며 은 해당 쿼리의 양식 또는 보고서를 기반으로합니다.

그러나 VBA 메서드에서 두 가지를 모두 실행하는 경우와 약간 다릅니다.

저는 도메인 기능 (DMin, DMax 등)이 SQL을 사용하는 것보다 느리다는 (아마도 잘못된 증거가 아니기 때문에 실수로) 가능성이 있습니다. 아마도 위 코드를 실행하면 어떻게되는지 알려줄 수 있습니다.

DMin 호출을 올바르게 작성하면 내가 알고있는 정확성 문제가 없습니다. 거기 있다고 들었 니? 본질적으로 통화는 다음과 같아야합니다. DMin("<Field Name>", "<Table Name>", "<Where Clause>")

행운을 빈다!

2

귀하의 상황에 따라 답변이 다를 수 있습니다.
단일 사용자 상황에서 @ transistor1 테스트 방법을 사용하면 격리 된 검색에 대한 좋은 대답을 얻을 수 있습니다.

그러나 네트워크에서 공유되는 DB를에

경우 이미 Set db = CurrentDb, 다음 SELECT 방법은 속도가 느립니다 DB를,에 두 번째 연결을 여는 필요로하지 않기 때문에, 빨리해야한다.

마찬가지로, Set db = CurrentDb에 더 효율적이며 해당 데이터베이스를 어디에서나 재사용 할 수 있습니다.
내가 가장 좋은 속도를 갖고 있는지 확인하려는 경우 앱을 열 때 Public db as DAO.Database을 사용합니다. 그런 다음 필요한 모든 모듈에서
If db is Nothing Then set db = CurrentDb을 사용합니다.

+0

그냥 궁금 해서요 - Set db = CurrentDb를 사용하든 아니면 CurrentDb 개체를 모든 곳에서 사용하든 상관 없습니다 (CodeDB 또는 다른 것으로 변경할 유연성이 필요하지 않은 경우). OP가 CurrentDB를 사용 중입니다. 또한 내부적으로 CurrentDB 객체를 사용하는 대신 DMin이 별도의 연결을 여는 것을 어떻게 알 수 있습니까? – transistor1

+2

일부 * 경우에는 CurrentDb를 사용하는 것이 제대로 작동하지 않는다는 것을 경험했습니다. 특별히 여러 번 참조 할 때 그렇습니다. 솔직히 말해서 그 내용을 분명히 기억하지 못합니다. 여기에 예제가 있다고 생각합니다. http://social.msdn.microsoft.com/Forums/en-US/accessdev/thread/7ea9506f-5e91-4896-80b9-6712762388ea/ –

+2

+1 매우 흥미 롭습니다. 링크를 이용해 주셔서 감사합니다. 나는 그 특별한 이슈가 왜 작동하지 않았는지 궁금해했고 OpenRecordset()을 사용하여 그걸 밟았습니다. 나는 그것이 (IntelliSense를 통해) 메소드라는 것을 알았지 만, 나는 CurrentDb()를 객체로 생각할 것이라는 것을 인정해야한다. 나는 항상 CurrentDb()가 매번 동일한 참조를 반환한다고 위조했다. – transistor1

관련 문제