2009-09-09 3 views
0

SQL 데이터베이스에 액세스하는 VB 응용 프로그램이 있습니다. 나는 그것이 느리게 움직이고 있다고 생각한다. 그리고 아마 내가 테이블 프로 폴리 색인을 가지고 있지 않을 것이라고 생각했다. 나는 당신이 어떻게 인덱스를 만들지 궁금해하고 있었습니까? 여기 상황이 있습니다.VB6 SQL 2005 데이터베이스 인덱스 질문

내 주요 루프는 내가 다른 두 데이터베이스 안타가이 루프 내부

Select * from Docrec 
Order by YearFiled,DocNumb 

입니다.


Select * from MapRec 
Where FiledYear = DocRec.YearFiled 
and Volume = DocRec.Volume and Page = DocRec.Page 
Order by SeqNumb 

Select * from Names 
Where YearFiled = DocRec.YearFiled 
and Volume = DocRec.Volume and Page = DocRec.Page 
Order by SeqNumb 

는 다행스럽게도 필자는 이해했다. INNER를 사용하여 하나 개의 쿼리에서

+0

이름표에서 속도가 느려지는 것을 추적했습니다. YearFiled, Volume, Page 및 SeqNumb으로 구성된 namerec 테이블에 클러스터되지 않은 인덱스를 추가했습니다. 또한 여기 DBA와 이야기 한 후 ID를 기본 키로 추가했습니다. 그는 또한 데이터베이스의 데이터 유형을 char에서 varchar로 전환 시켰습니다. 이것은 프로세스를 약간만 가속화했습니다. 나는 새로운 질문이있다. 확실하지 않은 경우 나는 그것을 새로운 것으로 게시해야합니까? NULL 값을 허용하기 때문에 일반적으로 내 VB 응용 프로그램에서 변형의 데이터 형식을 사용합니다. 데이터 유형간에 성능 차이가 있습니까? –

답변

0

일반적으로 레코드를 루핑하는 것은 좋지 않습니다. 한 번에 필요한 모든 것을 제공하는 집합 기반 쿼리를 수행 할 수 있습니까?

색인을 생성하는 데는 순서 지정에서 사용하는 필드 또는 조인과 where 절 및 where filed를 고려하십시오. 기본 키는 기본 레이의 설정의 일부로 인덱싱되지만 외래 키는 인덱싱되지 않습니다. 종종 사람들은 색인을 생성해야한다는 사실을 잊어 버립니다.

프로덕션 환경에서 절대로 *를 사용하지 마십시오. 그것은 가난한 행동입니다. 필요 이상으로 더 많은 데이터를 반환하지 마십시오.

3

봅니다 가입 : 당신은 데이터베이스에 하나의 쿼리를해야합니다

SELECT * FROM Doctec d 
    INNER JOIN Names n ON d.YearField = n.YearField AND d.Volume = n.Volume AND d.Page = n.Page 
    INNER JOIN MapRec m ON m.FiledYear = n.YearFiled AND m.Volume = n.Volumen and m.Page = n.Page 
ORDER BY YearFiled, DocNumb 

. 문제는 데이터베이스를 여러 번 조회하고 시간당 하나 또는 몇 개의 행을 얻는 것일 수 있습니다.

+2

이것은 이름과 MapRec에서 일치하는 docrec의 조회수 만 반환합니다. 그의 샘플은 모든 docrec을 통해 루프를 보여 주며 이름 테이블과 maprec 테이블에서 일치하는 항목을 찾습니다. – klabranche

3

정말로 중요한 것은 모든 항목이 필요한지를 결정하는 데 도움이되는 한 가지입니다.

SELECT * 대신에 필요한만큼의 열만 선택하면 많은 양의 데이터를 가져 오지 않게됩니다.

그렇다면 SQL Server Management Studio (또는 SQL Server 관리에 사용하는 모든 항목)에서 인덱싱 된 항목과 그렇지 않은 항목을 확인해야합니다. 가장 많이 검색하는 경향이있는 열은 색인의 첫 번째 후보가됩니다. 그것을 아래로 통합 할 수있는 방법이없는 경우

부록 이제 당신의 편집 본 적이 있다는
, 그것은 왜 당신이 방법 쿼리를하고있는 볼, 볼하는 데 도움이 될 수 있습니다 하나의 검색어. 컨텍스트가 없으면보다 최적의 쿼리를 추측 할 수 있습니다.

0

루프가 필요한지 잘 모르겠습니다. 당신이하고있는 일은 maprec에서 docrec과 일치하는 레코드를 가져 오는 것이고 두 번째 테이블에 대해 동일한 레코드를 가져 오는 것이면 내부 조인 구문을 사용하여 루프없이이 작업을 수행 할 수 있습니다. 두 번째 테이블

select columnlist from maprec m inner join docrec d on (m.filedyear = d.yearfield and m.volume = d.volume and m.page=d.page) 

후 다시 ...

당신은 대신 모든 가능한 경우 반환의 필요에만 열을 반환하는 쿼리를 손질 할 수있다. 이는 성능을 향상시켜야합니다.

SQL Server 2005에서 직접 색인을 만들려면 테이블 디자인으로 이동하여 인덱스 관리 & 키 도구 모음 항목을 선택하십시오.

데이터베이스 엔진 튜닝 관리자를 사용할 수 있습니다. 쿼리의 (SQL Server 프로파일 러를 사용하여) 추적을 작성하면 Advisor가 쿼리 실행을 위해 최적화하는 데 필요한 인덱스를 작성하고 작성합니다. ME TO YOUR FIRST COMMENT 이래

업데이트 :

당신은 아직도 내가 위에 표시된 것처럼 루프없이 다음 두 번째와 세 번째를 첫 번째 쿼리를 실행하여이 작업을 수행 할 수 있습니다. 여기에 속임수가 있습니다. 나는 당신이 첫번째와 두번째와 세번째를 묶어야 할 필요가 있다고 생각하고있다.

VB6 레코드 집합을 수행한지 꽤 오래되었지만 DB에서 반환 된 레코드 집합을 필터링하는 기능을 상기합니다. 따라서이 경우 루프를 유지할 수 있지만 매번 루프를 실행할 때마다 SQL을 호출하는 대신 첫 번째 레코드를 기반으로 결과 레코드 세트 데이터를 필터링하면됩니다. 이 루프 전에 두 번째 & 번째 쿼리를 초기화 /로드하여 데이터를로드합니다. 위의 구문을 사용하면 각 테이블에 부모 테이블 (docrec)과 일치하는 것을로드합니다.

이렇게하면 DB를 세 번 치기 만해도 부모 docrec 테이블을 통과해야 루프를 유지할 수 있으므로 일치 할 때 하위 테이블과 하위 테이블에서 작업 할 수 있습니다.

여기에 나는 아마도 그것은 가입 단지 왼쪽으로 해결 될 수있는이 이상한 느낌이 ....이 말 모두와 함께 http://www.devguru.com/technologies/ado/QuickRef/recordset_filter.html http://msdn.microsoft.com/en-us/library/ee275540(BTS.10).aspx http://www.w3schools.com/ado/prop_rs_filter.asp

.... ADO 레코드 필터링에 대한 몇 가지 링크입니다 너의 테이블에?

select * from docrec d 
left join maprec m on (d.YearFiled= m.FiledYear and d.Volume = m.Volume and d.Page = m.Page) 
left join names n on (d.YearFiled = n.YearFiled and d.Volume = n.Volume and d.Page = n.Page) 

이 모든 DocRec의 레코드를 반환하고 일치하는 경우는 null없는 경우 모든 maprec 값과 이름 값을 추가합니다.

필요에 따라 DB에 한 번만 적용됩니다.

+0

다른 테이블에 해당 항목이 있는지 여부에 관계없이 Docrec의 모든 레코드를 반환해야합니다. –

+0

읽어주세요 .... 업데이트가 도움이 될 것입니다. – klabranche

관련 문제