2012-03-01 2 views
2

DataContext.CreateDatabase을 사용하여 데이터베이스를 만들고 거기에 레코드를 삽입했습니다.C#에서 데이터베이스의 ID로 레코드를 찾는 가장 빠른 방법은 무엇입니까?

많은 레코드가 있으므로 가장 빠른 방법으로 이드의 레코드를 찾고 싶습니다.

첫째로 나는 시도 :

foreach (var currentRecord in _context.Cities) 
{ 
    if (currentRecord.ID == recordIdToFind) 
    return currentRecord; 
} 

그러나 그것은 매우 느렸다 그래서 나는 그것을 변경 :

var recordToReturn = from r in _context.Cities 
        where r.ID == recordIdToFind 
        select r; 
return recordToReturn.FirstOrDefault(); 

빨리 그것을 얻었다.

더 빠른 방법이 있습니까?

답변

2

(정기적으로) 검색하는 모든 항목은 최적의 속도를 위해 데이터베이스에 색인이 정의되어 있어야합니다. 일부 열과 특정 종류의 검색은 색인이 잘되지 않으므로 (예 : 큰 텍스트 필드 또는 "포함"검색) 색인 생성을 위해 다른 종류의 색인 (전체 텍스트)이 필요할 수 있습니다. 귀하의 경우, 클러스터 된 인덱스가 있어야 기본 키를 사용하는 것으로 나타납니다.

일단 색인이 정의되면 색인을 활용하는 조회를 수행하려고합니다. 첫 번째 쿼리는 전체 테이블 스캔을 수행하여 모든 결과를 메모리에로드 한 다음 코드를 통해 반복합니다. 쿼리 속도를 높이고 필요한 것보다 훨씬 많은 데이터를 전송할 수 있도록 데이터베이스를 제공하지 않았습니다. 두 번째 쿼리를 사용하면 인덱스 된 열을 지정하는 where 절을 추가하여 인덱스를 사용하여 데이터베이스에서 원하는 행만 찾을 수 있습니다. 별도로 실행하면 (즉, 순서대로 모든 행이 아니라 하나의 행 만 조회하는 것이므로) 최적의 방법입니다. 그것은 행에 대한 색인 조회를 수행 한 다음 해당 행만을 응용 프로그램에 전송합니다.

실제로 기본 키인 경우 SingleOrDefault을 사용하여 성능이 아니더라도 가독성을 향상시킬 수 있습니다. 테이블에 해당 키가있는 행이 하나만있을 수 있기 때문입니다. 고유 한 것으로 예상되지만 그렇지 않은 컬럼이있는 경우 조회의 단일성을 강요하면 잠재적 인 오류를 발견하는 데 도움이됩니다 (기본 키의 컨텍스트가 아 니라). 이 경우 은 불일치에 대한 정보를 제공하지 않고 집합에서 첫 번째 것을 선택하는 반면, 둘 이상의 결과가 발견되면 SingleOrDefault은 예외를 throw합니다. 그것이 생성하기 때문에

1

두 번째 코드 예제 빨라졌습니다이

2

두 번째를 할 수있는 가장 빠른 방법이어야한다 where 절, WHERE ID = <whatever> 같은 응용 프로그램 만 일치하는 행을 반환하는 데이터베이스를 쿼리.

데이터베이스의 Cities 테이블에서 모든 레코드를 읽고 응용 프로그램에 모두 복사하기 때문에 첫 번째 레코드가 느려지므로 하나의 레코드를 제외한 모든 레코드가 삭제됩니다.

아직 없으면 Cities 테이블의 ID 열에있는 인덱스 (또는 기본 키)가 더 빠르게 표시됩니다 (특히 테이블에 데이터를 추가 할 때).

0

linq 문은 그 정도면 충분합니다. 후드에서 linq 문과 firstordefault를 SQL 서버에 대한 명령문으로 변환해야합니다. 결과를 검색하면이를 도시 객체로 매핑합니다.

그래서 사실은이 준비된 명령문에 가까운 무언가로 전송됩니다

SELECT TOP 1 * FROM Cities where [email protected] 

당신은 이론적으로 다음과 같이 자신을 준비된 문을 전송하여 속도를 높일 수 있지만이 도시 개체를 당신에게 제공하고 있습니다 않을 것 대부분의 상황에서 눈에 띄게 빨라지는 것은 아닙니다. (반복 해보십시오. 원하는 작업은 아니지만 데이터를 빠르게 가져 오는 방법입니다.)

string commandText = "SELECT TOP 1 * FROM Cities where [email protected];"; 

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = new SqlCommand(commandText, connection); 
    command.Parameters.Add("@ID", SqlDbType.Int); 
    command.Parameters["@ID"].Value = recordIdToFind; 

    connection.Open(); 
    SqlDataReader reader = command.ExecuteReader(); 
    try 
    { 
     while (reader.Read()) 
     { 
      Console.WriteLine(String.Format("{0}, {1}", 
       reader[0], reader[1])); 
     } 
    } 
    finally 
    { 
     // Always call Close when done reading. 
     reader.Close(); 
    } 
} 
관련 문제