2010-12-22 2 views
1

Sql Server 2008에서 전체 텍스트 인덱스를 약간 재생하고 있습니다. 인덱스를 만들고 카탈로그를 채 웁니다. 내 테이블에는 약 400,000 개의 레코드가 있습니다. 내 전체 텍스트 색인은 varchar (최대) 열로 정의됩니다 (지금은 Text라고 부름). 다음 쿼리를 실행하고 있습니다.Sql Server 2008 FullText Optimization

select * from MyTable where (텍스트, '집').

이 쿼리는 14 초 만에 거의 20,000 개의 레코드를 반환합니다. 나는 그것이 매우 느린다고 생각한다. 그러나, 나는이 쿼리를 실행할 때 : MyTable에 에서

개수를 선택 (*)를 어디에 (텍스트, '집')

그것은 결과를 보여주기 위해 단 1 초 소요가 포함되어 있습니다.

내가보고있는 한, 실행 계획은 두 쿼리에서 동일합니다. 왜 SQL Server는 많은 쿼리 결과를 표시합니까?

이미 한 것을 :

가 나는 SSD를 구입하고이 디스크에 MDF와 LDF를 모두 넣어. 하지만 첫 번째 쿼리를 실행하면 로그와 tmp 데이터베이스가 내 HDD (SSD가 아님)에서 생성되고 있음을 알 수 있습니다. 내 SSD는 D :이고 모든 임시 파일은 C :에서 생성됩니다.

sql이 엔터프라이즈 관리자 결과 격자를 채우는 데 해당 파일을 필요로하기 때문에 시간이 오래 걸리나요? 내가 데이터베이스를 최적화하기 위해 할 수있는 일이 있습니까? 2 초 이내에 쿼리를 실행해야합니다.

+0

모든 것이 단일 시스템에서 수행되고 있습니까, 아니면 네트워크를 통해 데이터를 전송하고 있습니까? –

+0

한 번 더 질문 : 14 초 숫자는 SSMS 창으로 결과 집합을 반환하는 데 걸리는 시간 또는 값을 표시하는 데 걸리는 시간입니까? –

+0

결과 세트를 내 SSMS로 되 돌리는 데 걸리는 시간 –

답변

2

정말 모든 텍스트를 표시해야합니까, 아니면 검색 결과에 대해 더 많은 쿼리를 실행하고 더 좁히고 싶습니까? 나는 14 초의 대부분이 디스플레이에 디스플레이에 사용된다고 가정합니다. 디스플레이 할 필요가 없거나 이러한 결과의 일부 하위 세트 만 보여주고 싶다면 실행 시간이 내려야합니다.

1

20,000 개의 레코드를 반환해야하는 이유가 있습니까? 쿼리에 페이징을 추가하여 결과 집합을 20, 100, 1000 또는 20,000보다 작은 값으로 반환 할 수 있습니까? 얼마나 많은 최적화를하든 큰 결과 집합을 반환하는 데는 시간이 걸릴 것입니다.

+0

나는 1000의 큰 덩어리를 사용할 수 있다고 생각한다. –

+0

나는 톱 1000을 선택하려고 시도했으나 4 초가 걸렸다 ... 아직도 매우 느리다. –

+0

1000 개의 레코드는 여전히 테이블의 데이터에 따라 많이 달라집니다. 각 행에 1000 자의 텍스트가 있다고 가정 해 봅시다. 그것은 행당 약 1 킬로바이트의 텍스트입니다. 1000 열은 열만의 경우 1MB가됩니다. 나는 당신의 데이터가 어떻게 생겼는지는 모르지만 그럴 수있다. 이 데이터를 그리드의 사용자에게 표시하고 있습니까? 그렇다면 결과를 페이지 당 20 개로 제한하는 것이 좋습니다. 그러나 귀하의 특정 시나리오가 무엇인지 알지 못해 적절하지 않을 수 있습니다. – Dismissile

1

쿼리의 추가 시간은 아마도 Management Studio에서 표를 채우는 것일 수 있습니다.

SELECT *를 수행 할 때 그리드 결과에 텍스트 열 자체도 포함된다는 점에 유의하십시오. 텍스트 열 이외의 열만 선택하면 SELECT COUNT (*) 쿼리의 실행 시간이 더 짧아집니다. 선택 목록에 DATALENGTH (텍스트)를 포함시킬 수도 있습니다.

Grid로 검색된 최대 문자를 제어하는 ​​옵션이 Management Studio에 있습니다. 도구 -> 옵션 -> 쿼리 결과 -> 결과 그리드에서 찾을 수 있습니다.

0

나는 기독교에 동의한다. 문제는 결과 렌더링에 있습니다. 그리드가 아닌 텍스트로 출력을 시도하여이 오버 헤드를 제거하십시오.

+0

당신은 그 질문이 4 세 이상인지 알지? – Plutonix