2011-09-08 3 views
35

임시 테이블 삭제를 처리하는 가장 좋은 방법은 무엇입니까? 나는 당신이 명시 적으로 드롭을 처리해야하고 SQL 서버가 드롭을 처리해야한다는 것을 읽었습니다 .... 올바른 방법은 무엇입니까? 나는 항상 당신이 sproc 등에서 만드는 임시 테이블을 정리해야한다는 인상을 받았다. 그렇지만 다른 방법으로 제안하는 다른 비트를 발견했다.임시 테이블을 명시 적으로 삭제하거나 SQL Server에서 처리하도록하십시오.

어떤 통찰력이라도 대단히 감사하겠습니다. 나는 내가 만든 임시 테이블을 사용하여 모범 사례를 따르지 않을 것이라고 우려하고 있습니다.

감사합니다,

S 내보기 당으로

+6

SQL Server는 범위 밖일 때 자동으로 로컬 '# temp'테이블을 삭제하므로 AFAIK는 별 문제가되지 않습니다. 범위가 종료되기 전에이 자동 삭제가 동 기적으로 발생하는지 여부는 알 수 없지만 명시 적 드롭과 비교할 때 약간의 차이가있을 수 있지만 대용량 테이블의 경우 드롭은 어쨌든 지연됩니다. –

+2

하나 또는 다른 방법을 선호하는 인수의 예 (특히 명시 적 삭제가 바람직 함)도 만족 스러울 것입니다. 나는 하나를 위해 명시적인 삭제를 '모범 사례'로 정당화 할 수 없으며, 항상 * 중복 될 수 있다고 말할 수는 없습니다. 다른 한편으로, 지역의 전문 지식 수준이 높은 사람들은 정말로 당신 (또는 그 문제에 대한 의견이 어느 시점에서 당신에게 합리적인 것 같았던 다른 사람)이 왜 우리에게 정확히 말하면 우리에게 정말 좋은 대답을 줄 수 있습니다. 방법이 다른 것보다 낫다. –

답변

25

내보기는 먼저 임시 테이블이 필요한지 확인합니다. 또는 CTE로 할 수 있습니까? 둘째, 저는 항상 임시 테이블을 삭제할 것입니다. 때로는 연결 (예 : ## temp)에 범위가 지정된 임시 테이블을 가져야하므로 두 번째 쿼리를 실행하고 임시 테이블을 만들기위한 명시적인 코드가 있으면 테이블을 나타내는 오류가 발생합니다 이미 존재 함. 너 자신 후에 청소는 항상 좋은 소프트웨어 연습이다.

+1

## temp는 모든 사람 (다른 연결)에게 표시되지만 원래 세션이 끝나면 삭제됩니다. – Vedran

0

. 임시 테이블을 명시 적으로 삭제할 필요가 없습니다. SQL 서버는 쿼리를 처리하기 위해 공간을 확보해야하는 경우 temp db에 저장된 임시 테이블을 삭제합니다.

2

각 스레드가 고유 한 테이블 세트를 작성하고 스레드 수를 줄이는 다중 스레드 시나리오에서 사용자 자신의 테이블을 삭제하지 않으면 조정자가 스레드를 완료 한 것으로 간주하여 더 많은 스레드를 생성합니다 ... 그러나 임시 테이블이 여전히 주변에 있으므로 (따라서 서버와의 연결) 총재의 한계를 초과하게됩니다. 수동으로 임시 테이블을 삭제하면 스레드가 삭제되고 새 스레드가 생성되지 않으므로 조정자가 SQL 엔진을 압도하지 못하도록 유지합니다.

+2

나는 따라하기가 어렵다는 것을 알았다. – FistOfFury

+0

@FistOfFury, 조정자는 스레드 생성을 조절하는 장치입니다. 유리한 점은 데이터베이스에서 수행해야 할 작업이 있지만 서버를 압도하고 싶지 않은 경우입니다.이 경우 CPU 사용률 검색 스키마 (또는 간단한 스레드 제한) 및 그것에 따라 새 스레드를 산란 – ekkis

+0

나는 그것을 얻을 것 같아요. 그래서 임시 테이블을 반복적으로 병렬로 생성하는 프로세스가있을 때 이것은 궁극적으로 데이터베이스를 압도합니다. 그건 의미가 있습니다. – FistOfFury

6

로컬 임시 테이블 범위를 벗어나면 이름이 자동으로 삭제되므로 범위가 짧으면 (예 : 저장 프로 시저) 명시 적으로 삭제하는 것은 의미가 없습니다.

+0

풀에서 연결을 다시 사용할 때 sp_reset_connection 호출로 인해 임시 테이블이 삭제되므로 오케스트레이션 (연결 풀링) –

+0

@MeggieLuski를 제어 할 수없는 경우가 있습니다. – Vedran

+1

예,하지만 때때로 sp 재설정 연결이 실행될 때 제어 할 수 없습니다. 특히 yoru 구조에 여러 개의 레이어가있는 경우 –

관련 문제