ACC2000: Microsoft Access 2000에서 쿼리를 최적화하는 방법

이 문서는 이전에 다음 ID로 출판되었음: KR209126
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
요약
일반: 기본적인 매크로, 코딩 및 상호 운용성 기술이 필요합니다.

본 문서에서는 Microsoft Access 2000에서 쿼리 성능을 최적할 수 있는 방법을 설명합니다. Microsoft Jet 데이터베이스 엔진의 쿼리 최적화 프로그램(Optimizer), 쿼리 타이밍(Timing), 성능 분석, 쿼리 성능을 높이기 위한 설계 정보 등의 주제를 다룹니다.

본 문서의 내용은 데이터베이스에 링크된(또는 연결된) 테이블 대신 로컬 테이블이 있는 것을 전제로 합니다. 본 문서의 내용은 링크된 테이블에도 적용되지만 링크된 테이블의 경우에는 쿼리 성능에 영향을 미치는 추가적인 문제가 있습니다. 링크된 테이블에서의 성능 향상에 대한 자세한 내용은 Microsoft 기술 자료에서 아래 문자열을 검색하십시오.
odbc and optimizing and tables
추가 정보

쿼리 최적화 프로그램(Optimizer)

Microsoft Jet 데이터베이스 엔진에 여러 구성 요소가 포함되어 있지만 가장 복잡하면서 쿼리에 가장 중요한 구성 요소는 최적화 프로그램(Optimizer)입니다. 최적화 프로그램(Optimizer)은 비용 기준(Cost-Based) 형식입니다. 즉, 최적화 프로그램(Optimizer)은 각 쿼리 작업에 시간 비용을 할당한 다음, 의도한 결과 집합을 생성하고 수행하는 데 비용이 가장 적게 드는 작업의 목록을 선택합니다. 작업 수행 시간이 길수록 비용이 많이 드는 작업 또는 비싼 작업으로 간주됩니다.

사용할 쿼리 전략을 결정하기 위해 최적화 프로그램(Optimizer)은 통계를 이용합니다. 이 통계는 테이블의 레코드 개수, 테이블에 있는 데이터 페이지의 수, 테이블의 위치, 인덱스의 유무, 인덱스의 고유성 등을 기준으로 합니다. 최적화 프로그램(Optimizer)은 이 통계를 바탕으로 특정 쿼리를 처리하는 데 가장 적합한 내부 쿼리 전략을 선택합니다.

쿼리가 컴파일될 때마다 통계가 업데이트됩니다. 퀴리 또는 원본으로 사용하는 테이블에 변경 내용을 저장할 때와 데이터베이스가 압축될 때 쿼리에는 컴파일이 필요하다는 표시가 됩니다. 쿼리가 컴파일이 필요한 것으로 표시되면 다음에 쿼리가 실행될 때 컴파일과 통계 업데이트가 수행됩니다. 컴파일하는 데 보통 1-4초 정도 걸립니다.

상당히 많은 레코드를 데이터베이스에 추가하는 경우에는 쿼리를 열었다가 저장하여 다시 컴파일해야 합니다. 예를 들어, 예제 데이터 중 일부분을 사용하는 쿼리를 디자인하고 테스트하는 경우 데이터베이스에 좀더 많은 레코드가 추가된 후에는 쿼리를 다시 컴파일해야 합니다. 이렇게 하면 일단 응용 프로그램이 사용 중인 동안에는 최적의 쿼리 성능이 보장됩니다.

참고: Jet 데이터베이스 엔진 최적화 구성표를 볼 수 없거나 쿼리의 최적화 방법을 지정할 수 없습니다. 그러나 데이터베이스 구조 분석기(Database Documenter)를 사용하면 인덱스의 존재 여부와 인덱스의 고유성을 알 수 있습니다.

데이터베이스 구조 분석기(Database Documenter)에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
207782 ACC2000: Error Using Database Documenter If Objects Are Open

쿼리 타이밍(Timing)

선택(Select) 쿼리를 위한 시간 측정에는 첫 번째 한 화면 분량의 데이터를 표시하는 시간과 마지막 레코드를 얻는 시간 등 두 가지 중요한 측정이 있습니다. 쿼리가 한 화면 분량의 데이터만 반환한다면 이 두 시간 측정이 동일합니다. 쿼리가 많은 레코드를 반환한다면 이 두 시간 측정에 큰 차이가 날 수 있습니다.

데이터시트 보기에서 선택(Select) 쿼리를 볼 때 두 측정이 동일하면 한 화면 분량의 데이터와 더불어 "현재 레코드 1, 전체 N"과 같은 형식으로 쿼리에서 반환된 레코드의 전체 개수를 볼 수 있습니다. Jet 데이터베이스 엔진이 첫 번째 한 화면 분량의 데이터를 표시한 다음 쿼리를 완료하고 마지막 레코드를 검색하는 것이 더 빠른 경우에는 한 화면 분량의 데이터만 표시되고 "현재 레코드 1, 전체 N"에서 "N"은 표시되지 않습니다. N 값은 쿼리가 완료되거나 마지막 레코드로 스크롤할 때까지 비어 있습니다.

이 동작은 Jet 데이터베이스 엔진이 쿼리를 완료한 다음 데이터를 표시하는 전략과 데이터를 표시한 다음 쿼리를 완료하는 전략 등, 두 성능 전략 중 하나를 선택한 결과로 발생합니다. 사용되는 전략은 사용자가 선택할 수 없으며 Jet 데이터베이스 엔진이 가장 효율적인 전략을 선택할 것입니다.

성능 분석

Microsoft Access 7.0, Access 97 또는 Access 2000을 사용하고 있는 경우 성능 분석 마법사(Performance Analyzer)를 사용하여 데이터베이스의 쿼리를 분석할 수 있습니다. 쿼리 성능 분석은 데이터베이스 엔진과 밀접하게 연관되어 있기 때문에 성능 분석 마법사(Performance Analyzer)는 Jet 데이터베이스 엔진이 쿼리를 최적화하기 위해 인덱스를 실제로 사용하는 경우에만 인덱스를 추가하도록 제안합니다. 따라서 성능 분석 마법사(Performance Analyzer)는 본 문서에서 아래의 "쿼리 성능을 높이는 정보" 절에서 설명하는 일반 제안 사항보다 데이터베이스에 좀더 특정한 성능 정보를 제공할 수 있습니다.

Microsoft Access 7.0, Microsoft Access 97 또는 Microsoft Access 2000에서 성능 분석 마법사(Performance Analyzer)를 실행하려면 도구 메뉴에서 분석을 가리키고 성능을 누릅니다.

쿼리 성능을 높이는 정보

쿼리 성능을 높이려면 아래와 같은 방법을 시도합니다.

  • 데이터베이스를 압축합니다. 데이터베이스를 압축하면 테이블의 레코드들이 테이블의 주 키에 의해 정렬되고 인접한 데이터베이스 페이지에 있도록 다시 구성되므로 쿼리 속도를 높일 수 있습니다. 이렇게 하면 최소의 데이터베이스 페이지를 읽고 모든 레코드를 검색하기 때문에 테이블의 레코드에 대한 순차 검색(Sequential Scan) 성능이 향상됩니다. 데이터베이스를 압축한 후 업데이트된 테이블 통계를 사용하여 각 쿼리를 실행하고 컴파일합니다.
  • 쿼리에 조건을 설정하기 위해 사용되는 모든 필드와 조인의 양쪽 필드에 인덱스를 넣거나 이 필드들 간에 관계를 설정합니다. 관계를 설정할 때 Microsoft Jet 데이터베이스 엔진은 외래 키에 인덱스가 있으면 기존 인덱스를 사용하고 없으면 인덱스를 작성합니다.

    참고: Microsoft Access 테이블이 작고 조인된 필드에 인덱스가 작성되어 있는 경우 Microsoft Jet 데이터베이스 엔진은 하드 디스크의 Microsoft Access 테이블과 ODBC 서버 테이블을 조인하는 쿼리를 자동으로 최적화합니다. 이 경우 Microsoft Access는 필요한 레코드만을 서버에서 요청함으로써 성능을 높입니다. 서로 다른 원본에서 테이블을 조인할 때 조인 필드에 인덱스가 작성되었는지 확인하십시오.
  • 테이블에서 필드를 정의할 때 필드의 데이터에 적합한 가장 작은 데이터 형식을 선택합니다. 또한, FieldSize 속성이 Long Integer로 설정된 경우, 조인에 사용할 필드에 Autonumber와 Number 같은 동일하거나 호환되는 데이터 형식을 지정합니다.
  • 쿼리를 작성할 때 필요한 필드만을 추가합니다. 조건을 설정하기 위해 사용된 필드를 표시하지 않으려면 그 필드의 표시 확인란을 눌러 해제합니다.
  • 폼 또는 보고서를 위한 RecordSource 속성이 SQL 문으로 설정되어 있으면 SQL 문을 쿼리로 저장한 다음 RecordSource 속성을 쿼리 이름으로 설정합니다.
  • 하위 쿼리에 계산 필드(Calculated Field)를 사용하지 마십시오. 계산 필드(Calculated Field)를 포함하는 쿼리를 또 다른 쿼리에 추가하면 계산 필드(Calculated Field)의 식 때문에 최상위 쿼리에서 수행 속도가 느려질 수 있습니다. 아래 예제에서 쿼리 Q1은 쿼리 Q2의 입력으로 사용됩니다.
    Q1: SELECT IIF([MyColumn]="Yes","Order Confirmed","Order Not Confirmed") AS X FROM MyTable;
    Q2: SELECT * FROM Q1 WHERE X="Order Confirmed";
    Q1에 있는 IIF 식은 최적화될 수 없기 때문에 Q2 역시 최적화되지 않습니다. 최적화될 수 없는 식이 하위 쿼리 안에 중첩되어 있으면 전체 쿼리가 최적화될 수 없습니다.

    쿼리를 아래와 같이 다르게 작성할 수도 있습니다.
    Q1: SELECT * FROM MyTable WHERE MyColumn = "Yes";
    출력에 식이 필요하면 폼 또는 보고서의 컨트롤에 식을 넣으십시오. 예를 들어, 이전의 쿼리는 MyColumn의 값을 사용자로부터 입력받은 다음 쿼리를 기반으로 폼 또는 보고서를 만드는 매개 변수 쿼리로 변경할 수 있습니다. 그런 다음 MyColumn의 값에 따라 "Hello" 또는 "Goodbye"를 표시하는 계산(Calculated) 컨트롤을 폼 또는 보고서에 추가할 수 있습니다.

    아래와 같이 쿼리를 작성합니다.
    PARAMETERS [To see confirmed orders, enter Yes. To see unconfirmed orders, enter No.] Text;
    SELECT *
    FROM MyTable;
    WHERE MyColumn = [To see confirmed orders, enter Yes. To see unconfirmed orders, enter No.];
    폼 또는 보고서의 계산(Calculated) 컨트롤에 아래와 같이 입력합니다.
    =IIF([MyColumn]="Yes","Order Confirmed","Order Not Confirmed")
  • 조인된 필드의 값에 의해 레코드들을 그룹화할 때 합계를 구하는(집계를 계산하는) 필드와 동일한 테이블에 있는 필드에 Group By를 지정합니다. 예를 들어, Northwind 예제 데이터베이스에서 Order Details 테이블의 Quantity 필드에서 합계를 계산하고 OrderID에 의해 그룹화하는 경우 Order Details 테이블의 OrderID 필드에 Group By를 지정하는 것이 좋습니다. Orders 테이블의 OrderID 필드에 Group By를 지정하면 Microsoft Access는 집계를 수행한 다음 필요한 필드만을 조인하는 것이 아니라 먼저 모든 레코드를 조인한 다음 집계를 수행해야 합니다.

    속도를 빠르게 하려면 가능한 적은 수의 필드에 Group By를 사용합니다. 또 다른 방법은 적절한 경우에 First 함수를 사용하는 것입니다.

    합계 쿼리에 조인이 포함되어 있으면 한 쿼리에서 레코드를 그룹화하고 이 쿼리를 조인을 수행하는 별도의 쿼리에 추가하도록 고려하십시오. 이 방법을 사용하면 일부 쿼리에서 성능이 향상됩니다.
  • 가능하면 계산 필드(Calculated Field)와 인덱스되지 않은 필드에 제한적인 쿼리 조건을 사용하지 마십시오. 최적화할 수 있는 조건 식을 사용하십시오.
  • 일대다 관계의 테이블 사이의 조인에 사용되는 필드의 값을 제한하는 조건을 사용하는 경우, 조건을 조인의 한 쪽에 넣는 것과 여러 쪽에 넣는 것 중 어떤 경우에 쿼리가 더 빠르게 실행하는지 테스트합니다. 일부 쿼리에서는 조인의 "여러 쪽" 대신 "한 쪽"의 필드에 조건을 추가할 때 성능이 더 빠를 수 있습니다.
  • 정렬에 사용하는 필드에 인덱스를 작성합니다.
  • 데이터가 자주 변경되지 않는 경우에는 테이블 작성(Make-Table) 쿼리를 사용하여 쿼리 결과로부터 테이블을 만듭니다. 쿼리 대신 결과 테이블을 폼, 보고서 또는 다른 쿼리를 작성하는 토대로 사용하고 본 문서에서 설명한 지침에 따라 인덱스를 추가해야 합니다.
  • 테이블의 데이터를 액세스하기 위해 쿼리에 없는 DLookup 함수 같은 도메인 집계 함수를 사용하지 마십시오. 도메인 집계 함수는 Microsoft Access에 특정하기 때문에 이러한 함수를 사용하는 쿼리는 Jet 데이터베이스 엔진이 최적화할 수 없습니다. 대신에 함수가 액세스하는 테이블에 쿼리를 추가하거나 하위 쿼리를 작성합니다.
  • 크로스탭 쿼리를 작성할 경우 가능하면 고정된 열(Fixed Column) 머리글을 사용합니다.
  • 인덱스된 필드에 Between...And, In= 연산자를 사용합니다.
  • ODBC 데이터 원본을 대상으로 하는 일괄 업데이트(Bulk Update) 쿼리의 경우 FailOnError 속성을 로 설정하여 서버에서 성능을 최적화합니다.
참조
Microsoft Access 2000에서 성능 최적화에 대한 자세한 내용을 보려면 도움말 메뉴에서 Microsoft Access 도움말을 누르고 Office 길잡이나 도움말 마법사에서 "성능 최적화"를 입력한 다음 검색을 눌러 항목을 보십시오.
속성

문서 ID: 209126 - 마지막 검토: 12/05/2015 11:02:45 - 수정: 1.0

Microsoft Access 2000 Standard Edition

  • kbnosurvey kbarchive kbdta kbusage gnlothr KB209126
피드백