2012-03-21 4 views
3

일부 필드를 반환하는 저장 프로 시저가 있고 대부분 고객 정보가 들어있는 저장 프로 시저가 있고 텍스트 데이터 유형 필드에 xslfo "blob"가 들어있는 저장 프로 시저가 1 개 있습니다. 나는이 텍스트 데이터 형식 필드에 값이없는 레코드를 무시하는 프로세스를 최적화하기 위해 노력하고 있지만거야 내가 어디 절에이를 추가 할 때 :where 절에서 텍스트 데이터 유형이 올바르게 수행되지 않습니다.

And cl.CorrespondenceFO IS NOT NULL 
And Convert(varchar(1), cl.CorrespondenceFO) <> '' 

쿼리 시간 제한. 텍스트 데이터 유형이 더 이상 사용되지 않으므로 미래에 해당 열을 변환해야하지만이 문제가 발생하기 전에 최적화해야합니다. 이 두 개의 추가 where 절이 추가 된 결과를 반환하도록이 저장 프로 시저를 얻는 방법에 대한 제안이 있습니까? TIA

편집 : varchar (max)로 데이터 유형을 업데이트했으며 아래의 제안 사항을 모두 시도했지만 쿼리가 아직 시간 초과되었습니다. 다른 제안?

+0

다음과 같은 간단한 쿼리를 고려해야합니다. select 1 where Convert (varchar (1), 'a') = ''가 true를 확인하므로 공백으로 시작하고 텍스트가 뒤 따르는 서신이 있으면 그것을 걸러 내십시오. –

답변

0

이 작동 할 수 있습니다. 이전 text, ntext 및 image 데이터 유형을 varchar (max), nvarchar (max) 및 varbinary (max)로 변환하라는 제안을받은 후에도 쿼리는 여전히 시간 초과되었습니다. 여기 수정 된 내용이 있습니다.

구버전 = FieldA에서 ('값 1', '값 2') 그리고 렌 (FieldB)> 0 TableA의 에서 선택 FieldA, FieldB - 이것이 무엇 작동하지 않았다

새로운 버전 = 표 #temp ( FieldA의 VARCHAR (10), FieldB의 VARCHAR (최대) )

에 삽입] #temp ( FieldA 만들기, FieldB ) 선택 FieldA, FieldB TableA의 어디에서 FieldA에서 ('값 1', '값 2')

선택 * #temp 에서 렌 (FieldB)> 0

테이블 삭제 #temp

어떤 이유

, 항상 시간 초과 나는 렌() 원래 쿼리 체크인을하려고 할 때 쿼리 (있을 수 있습니다

(내 포맷, 미안 작동하지 않는 이유는 확실하지 않다) th와 관련이있다. e 테이블이 1,700 만 개가 넘는 레코드), 처리 할 레코드의 하위 집합을 생성 한 다음 해당 하위 집합의 Len()을 검사하면 제 기록을시기 적절하게 얻을 수있었습니다.

감사합니다.

0

저는 SQL Server에 익숙하지 않지만 텍스트 유형이 MySQL/PostGres 텍스트 유형과 같은 경우 비효율적입니다. 이러한 유형은 테이블에 저장되므로 실제 행에는 실제 텍스트 blob에 대한 포인터 만 포함됩니다. 이

4
  1. 은 CHECK 제약 조건과 빈 문자열을 허용하지 않음으로 쓰기에 데이터를 수정 지금 varchar(max)
  2. 로 변환 등, 디스크의 많은 인덱스는 당신에게 많은 좋은 일을하지 않습니다 추구 의미
  3. 사용 WHERE ... cl.CorrespondenceFO IS NOT NULL

나는 테스트 할 수 있지만,이 NULL 비트 맵을 사용한다 NULL 체크 IS NOT

또는 계산 된 열을 LEN (또는 텍스트의 경우 DATALENGTH)으로 사용하고 색인화/필터링하십시오.

+0

'my_table WHERE my_text_column is not NULL에서 SELECT COUNT (*) my_text_column is not NULL '은 어떤 이유로 든 LOB 읽기를 보여 주므로'NULL_BITMAP'에 확실하지 않습니다. –

+0

@MartinSmith : 아마 내가 의심하는 텍스트 일 ​​수 있습니다. 테스트 주셔서 감사합니다 – gbn

+0

'varchar (max)'및 이와 유사한 결과에 대해 테스트했습니다. 사실'text'는'NOT NULL' 값과'varchar (max)'값에 대해 1 로브 읽음을주었습니다. 일관성있게 반복 할 수 있는지 또는 아직 그렇지 않은지 확실하지 않습니다. –

3

아직도 TEXT을 사용하고 계십니까? 이 값은 VARCHAR(MAX)이어야합니다. 대신 당신이 가지고있는 쿼리, 왜 안의 :

WHERE DATALENGTH(cl.CorrespondenceFO) > 0; 

(. 내가 @gbn에 동의하지만 - 당신이 NULL 당신에게 동일한 의미하는 경우 빈 문자열을 허용해서는 안)

+1

'TEXT'에'LEN'을 사용할 수 없습니다. –

+0

'VARCHAR (MAX) '사용에 대해 너무 선취 적이 었습니다. –

+0

이것은 여전히 ​​타임 아웃입니다. – ganders

1

로 변환 VARCHAR은 매우 효율적으로 소리가 나지 않습니다. cl.CorrespondenceFO IS NOT NULL이 빈 얼룩이있는 행을 필터링하는 것으로 충분하지 않습니까? 정말 충분하지 않은 경우

, 당신은 변환을 방지하기 위해 DATALENGTH을 사용할 수 드디어 도착

And cl.CorrespondenceFO IS NOT NULL 
And DATALENGTH(cl.CorrespondenceFO) > 0 
+0

예, 일부 레코드는 null을 가지며 일부 레코드는 비어 있습니다. DataLength 일을 시도하고 알려 드리겠습니다. 편집 : "IS NOT NULL"을 추가해도 절차 시간이 초과 되더라도 DataLength 검사로 가서 전화해도됩니까? – ganders

+0

업데이트 : 그리고 DataLength (cl.CorrespondenceFO)> 0 여전히 타임 아웃. – ganders

+0

인덱싱 된 계산 열 또는 재 설계가 유일한 방법입니다. 'AND'를 추가하지 않는다면 다른 (나쁜) 계획을 세우고 텍스트 문제는 붉은 청어라고 할 수 있습니다. –

관련 문제