질문 중 최근 프로젝트, 조사 후 문에 서브 쿼리의 사용 후 사용하는 대신 연결 테이블이있는 방법이지만, 변화를 최소화하기 위해, 대신 달성하기 위해 존재 사용할 경우 너무 많은 쿼리 프로세서, 자원 부족이있을 것이다 발견
1, 새로운 기능, 참고 : 저장 프로 시저
ALTER의 FUNCTION [ DBO ] . [ dnt_split ] ( @splitstring VARCHAR을 ( 최대 ) @separator CHAR ( 1 )은 = ' , ' ) RETURNS @splitstringstable TABLE ( [ 아이템 ] VARCHAR ( 200 ) ) AS BEGIN DECLARE의 @currentindex INT의 DECLARE @nextindex의 INT의 DECLARE을 @returntext VARCHAR (200 ) SELECT @currentindex = 1 개 동안 ( @currentindex <= 데이터 길이 ( @splitstring )) BEGIN SELECT @nextindex = charIndex의 ( @separator , @splitstring , @currentindex는 ) IF ( @nextindex = 0 OR @nextindex은 IS NULL ) SELECT @nextindex을 = 데이터 길이 ( @splitstring ) + 1 SELECT @returntext = 문자열 ( @splitstring , @currentindex , @nextindex - @currentindex ) INSERT INTO @splitstringstable ( [ 아이템 ] ) VALUES ( @returntext ) SELECT @currentindex = @nextindex + 1 개 의 END RETURN의 END를
2, 다음 문에서 수정
INS = 모두 StringBuilder 새로운 새 모두 StringBuilder (); // ins.Append ( "(") ins.Append ( "12은 13이고, " ); // ins.Append ( ")"); // +의 변성 바로 아래 전면 ) (ins.ToString , 직후 것은 수정
문자열 strFilter = " 존재 (dnt_split (SELECT * \ ' ' + ins.ToString () + ' \' '') 여기서 아이템 = xxxid) " ;
직접 원래 단어에 strExist1을 대체한다.
3, 왜 문에 문제가있는 것
명령문이 서브 테이블 할 데카르트 제품, 낮은 시스템 리소스의 기본 테이블에 해당하기 때문에, 그것은 문제가 될 것이다 (실제로, 다른 컴퓨터의 I 더 나은 성능이 존재하지 않는 이 문제).
4, 다른 하나는 존재에
전송 : HTTPS : //zhidao.baidu.com/question/134174568.html
테이블 데이터 A 및 B에 나타난 데이터와 같은 대용량과 거의 효율 존재하는 경우, A는 선택적으로 사용된다. 에서 다음과 같이 존재의 차이 :
4.1, 다른 상황의 사용
SQL은 서브 쿼리에 적용하면 주 조회 테이블 적은 결과 세트 기록하며 큰 인덱스 테이블을 갖는다. 주요 질의 덜 기록, 하위 쿼리 큰 테이블의 외부 층에 존재하는 SQL 적용, 인덱스는 시간이.
4.2 상이한 구동 시퀀스
IN 하위 쿼리는 첫 번째 룩업 테이블이며, 다음 다음 선별 조건에 따라 표에보고 직교 제품을한다. 존재하는 테이블 구동 방문 할 최초로 외부 테이블이다.
4.3, NULL은 다른 프로세스에 대한 값.
IN은 NULL 값이 존재 처리됩니다,하지 NULL을 처리.
4.4 다른 기본 원칙
해시에 대한 외부 및 내부 테이블 조인하는 루프 사이클은 내부 테이블 쿼리 재순환 각 루프의 등장으로, 그리고 존재한다.