2009-09-15 1 views
0

가끔씩 느리게 실행되는 응용 프로그램이 있는데 데이터베이스 커서와 관련이 있다고 생각합니다.커서에 대한 SQL Server 인덱스

응용 프로그램 소스에 대한 액세스 권한이 없으므로 데이터베이스 호출을 제어 할 수 없지만 필요한 경우 인덱스를 추가 할 수 있도록 데이터베이스가 열려 있습니다.

문제는 인덱스로 커서를 빠르게하는 방법을 모른다는 것입니다.

커서 쿼리가 간단하고

SELECT * FROM table WHERE field1=1 AND field2=2 ORDER BY field3, field4 

처럼 내가 SSMS에서 직접 쿼리를 실행하면

(표는 1M 행에 대해이 포함되어 있습니다. 때로는 하나의 왼쪽뿐만 아니라 가입이) 그것을 커서의 응용 프로그램에서 실행될 때 첫 번째 행을 가져 오는 데 30 초가 걸릴 수 있습니다 (sql-trace로 확인 됨).

WHERE 및 ORDER BY 절의 필드는 모두 개별적으로 인덱싱됩니다.

field1, field2, field3, field4에 결합 된 색인이 더 빠를 것이라고 생각합니다. 필드의 각 조합과 순서에 대한 색인을 만들지 않고 속도를 높이는 방법이 있습니까?

: 나는 항상

+0

쿼리 실행 계획을 보았습니까? – Kane

+0

옵션으로 커서를 선언하고 있습니까? 즉, 당신은 단지 DECLARE bob CURSOR FOR SELECT를하고 있습니까? 아니면 명시 적으로 옵션을 제공하고 있습니까? 예를 들어, bob CURSOR STATIC, READ_ONLY FOR SELECT ... (또는 옵션의 다른 조합 - 동적, FAST_FORWARD, KEYSET, etc ...) –

+0

어쨌든 커서 옵션을 변경할 수 없으므로 커서 옵션을 확인하지 않았습니다. 커서 옵션은 인덱스 조정에 실제로 중요한가요? 쿼리에 대한 실행 계획을 살펴 보았지만 쿼리 자체가 빠르게 실행되기 때문에 많은 내용이 표시되지 않습니다. 커서의 실행 계획을 보려면 어떻게해야합니까? – adrianm

답변

1

한 가지 (가능한 경우) 내가 DB 튜닝 관리자를 실행 (그냥 반복합니다. 나는 응용 프로그램이 데이터베이스에 액세스하는 방법에 영향이없는 성능은 인덱스를 통해 조정할 수 있습니다).

나를 틀리게하지 마라. 나는 그의 모든 규칙과 제안을 따르지 않는다. 그러나 그것은 어떻게되고 있는지, 얼마나 자주 발생하는지 등을 보는 쉬운 방법이다. 몇 시간 (일반적인 !!!) 작업량은 기본적인 "느낌"을 얻기에 좋습니다.

그런 다음 제안 사항 중 일부를 구현할지 여부를 결정할 수 있습니다. 그리고 비록 당신이 디자인에서 최선을 다 했더라도, 실제로 어떤 일이 일어나고 있는지 (예측할 수있는 것은 아님) 어쩌면 당신은 어떤 통계를 잊어 버리거나 다른 인덱스가 도움이 될 수 있습니다 ...

+0

튜닝 관리자가 설치되어 있지만 아직 사용하지 않았습니다. 나는이 과정이 백업을하고 동시에 sqltrace를 시작하는 것이라고 가정한다. – adrianm

0

나는 쿼리를 사용하도록 바꿀 것입니다. SELECT *가 아닌 실제 열 이름을 입력 한 다음 field1 = 1 및 field2 = 2에 덮어 쓰기 색인을 만듭니다. 가능하면 field3 및 field4에 클러스터형 인덱스를 넣습니다.

SQL 2005 이상을 사용하는 경우 커서 대신 CTE를 보거나 임시 테이블을 사용하도록 쿼리를 리팩토링하십시오.