2010-07-12 2 views
5

임시 테이블이 필요한 일부 sprocs가 있습니다. 컬럼 테이블 (어떤 길이의 varchar)을 하드 코딩하지 않기 위해 참조 테이블 스키마가 변경되면 (즉 필드가 길어질 때) 선언을 변경하지 않아도됩니다 (테이블 호출 생성 대신). 이에 실행 계획을 수행 할 때 어디에서 1 = 2가 모든 행에 대해 호출 되나요?

select orderId 
into #sometmptbl 
from orders 
where 1=2 

그러나, 실제로는 테이블/인덱스에 갈 것 같다 : 성명 1

쿼리 계획 (라인 1에서). 632082.

이 평균 1 = 2가 인덱스의 모든 항목에 대해 평가됩니다 않습니다

STEP 1 
    The type of query is CREATE TABLE. 

STEP 2 
    The type of query is INSERT. 
    The update mode is direct. 

    FROM TABLE 
     orders 
    Nested iteration. 
    Index : orders_idx1 
    Forward scan. 
    Positioning at index start. 
    Index contains all needed columns. Base table will not be read. 
    Using I/O Size 2 Kbytes for index leaf pages. 
    With LRU Buffer Replacement Strategy for index leaf pages. 
    TO TABLE 
     #sometmptbl 
    Using I/O Size 2 Kbytes for data pages. 

는 (1 호선에서) 문 1 I/O 비용을 추정? 일정 시간에이 작업을 수행 할 수있는 방법이 있습니까?

Table: orders scan count 0, logical reads: (regular=0 apf=0 total=0), physical reads: (regular=0 apf=0 total=0), apf IOs used=0 
Table: #sometmptbl_____00002860018595346 scan count 0, logical reads: (regular=1 apf=0 total=1), physical reads: (regular=0 apf=0 total=0), apf IOs used=0 
Total actual I/O cost for this command: 2. 
Total writes for this command: 3 
0 row(s) affected. 

답변

4

당신이 통계 io를 설정 한 경우 :

업데이트 : 실제 실제로 0입니다 그래서 성능에 영향이 없습니다 읽어처럼 그렇게 보이는 실행 후 다음

는 실제 I/O 비용입니다 켜기, 논리적 및 물리적 읽기가 0이어야합니다. 인덱스를 스캔 할 계획을 만들지 만 실제로 사용하지는 않는 것으로 보입니다.

대량 생산 환경에서 이런 식으로 임시 테이블을 만들지 않는 것이 좋습니다. 시스템 테이블 잠금 문제는 물론 약간의 성능 저하 (마일리지가 다를 수 있음)가 있습니다. (또한 열의 ID 속성이 임시 테이블로 이월됩니다).

바로 가기 - 명시 적 tempdb..MyScratchTable에 1 = 2를 입력 한 다음 RapidSQL (또는 다른 도구)을 사용하여 스크래치 테이블에서 DDL을 생성합니다.

varchar 인 경우 최대 값에 대한 열 길이를 표준화하고 everwhere를 사용할 수없는 이유가 없어야합니다.

+0

당신 말이 맞아요. 실제 읽기는 0입니다. – naumcho

0

select orderId from orders where 1=2 무엇을 제공합니까?

데이터 유형 등을 읽는 색인을 선택한 반면, INTO가없는 매우 간단한 쿼리는 테이블/색인 액세스없이 최적화되어야합니다.

관련 문제