2014-09-18 2 views
0

우리 서버에 반복적으로 연결되는 작은 코드 패치를 최적화하려고합니다. 시작하려면 여기 당신이있는 경우객체의 단일 속성에 액세스하기 위해 데이터베이스에서 객체를 생성하기 위해 작업하십시오.

Dim sale as Sale() 
With sale 
    If .CustomerID > 0 Then 
     .CustomerName = CCCustomer.SelectByID(.CustomerID).FirstNameLastName 
    Else 
     .CustomerName = "Cash Sale" 
    End If 
End With 

그래서 문제가,이를 통해 반복되는 50 명 고객이 말하는 것을 코드의 패치, 그것은 각 고객 ID에 관해서는, 데이터를 통해 얻을 수있는 긴 시간이 오래 걸립니다 CCCustomer 개체에 액세스하고, 데이터베이스에 연결하고, ID로 고객을 찾은 다음 개체에서 FirstNameLastName을 선택해야합니다.

내 첫번째 생각은 바로 박쥐 모든 고객의리스트 또는 배열을 당긴 다음 ID별로 일치하도록했지만이 더 오래

Dim sale as Sale() 
With sale 
Dim allCustomers() = CCCustomer.SelectAll 
If .CustomerID > 0 Then 
    .CustomerName = Array.FindIndex(allCustomers, Function(c) c.CustomerID = .CustomerID) 
Else 
    .CustomerName = "Cash Sale" 
End If 
End With 

(이 코드는 반환이 걸릴 것으로 보인다 customerId, 이름은 아니지만 여전히 영원히 걸립니다.)

내가 생각할 수있는 유일한 다른 옵션은 다중 저장 프로 시저를 완전히 다시 작성하고 객체를 업데이트하여 고객 이름과 customerID.하지만 프로그램의 나머지 부분을 완전히 분해하기 전에 체크인하리라고 생각했습니다.

그렇다면 누구나 데이터베이스에서 당길 때 이처럼 적절한로드 시간을 얻는 좋은 방법을 알고 있습니까?

편집 : 죄송합니다. 내 부분에 대한 잘못된 설명이었습니다. 고객을 통해 iterating하지 않는 것은 고객 개체를 만드는 것입니다. 이 같은 것을 .... 있었다 그렇다면

| SaleID | CustId | ... | 
| 1  | 1  | ... | 
| 2  | 1  | ... | 
| 3  | 2  | ... | 
| 4  | 1  | ... | 
| 5  | 2  | ... | 

는 그런 다음 CCCustomer.SelectByID (1) 3 번을 사용 - 기본적으로 고객 대상 3 회를 만드는 그냥 firstnamelastname 정보를 얻을 수 있습니다.

답변

1

가장 효율적이고 쉬운 (가장 안전하거나 읽기 쉽지 않은) 방법은 모든 ID를 단일 SQL 쿼리 문자열 "... (여기서 id = 12 또는 id = 44 또는 id = 77 또는 등 ..) "그리고 쿼리 문자열을 db에 runql() 함수를 사용하거나 사용중인 시스템에서 이에 상응하는 문자열을 전달합니다. ID를 수집하는 로직을 쿼리 자체에 넣을 수 있고 사람 이름과 같은 기준을 전달하여 theID를 선택할 수 있다면 훨씬 더 빠릅니다.

db는 쿼리 분석에서 매우 빠르며 데이터 및 채우기 테이블을 반복합니다.

대신 linq (즉 linqtosql)을 사용하여 좀 더 읽기 쉽고 안전한 코드를 만들 수 있습니다. 다소 가치가 있지만 성능은 비슷합니다. 이 옵션이 아니면 데이터베이스 서버 저장 프로 시저에 기능을 넣고 매개 변수 (조건 또는 ID 목록)를 사용하여 프로 시저를 호출 할 수도 있습니다.

현재 db 데이터를 반복하는 방식이 가장 비효율적입니다. 나는 내가 언급 한 다른 모든 옵션들이 1-2 order 정도 더 빨라질 것으로 기대한다.

관련 문제