source

임시 테이블을 명시적으로 삭제하거나 SQL Server에서 처리하도록 허용

ittop 2023. 7. 6. 22:46
반응형

임시 테이블을 명시적으로 삭제하거나 SQL Server에서 처리하도록 허용

온도 테이블의 낙하를 처리하는 가장 좋은 방법은 무엇입니까?삭제를 명시적으로 처리해야 하며 SQL 서버에서 삭제를 처리해야 한다는 내용을 읽었습니다.올바른 방법은 무엇입니까?저는 항상 저장고 등에서 생성하는 임시 테이블을 직접 정리해야 한다는 생각을 가지고 있었습니다.하지만, 다른 부분들을 발견했습니다.

어떤 식으로든 의견을 주시면 감사하겠습니다.제가 작성한 임시 테이블에 대한 모범 사례를 따르지 않는 것이 걱정됩니다.

감사해요.

S

제 견해는 먼저, 당신이 정말로 임시 테이블이 필요한지, 아니면 CTE(Common Table Expression)로 해결할 수 있는지 확인하는 것입니다.둘째, 저는 항상 제 템퍼 테이블을 떨어뜨리곤 했습니다.연결(예: ##temp)에 대한 임시 테이블의 범위를 지정해야 하는 경우가 있으므로 쿼리를 다시 실행하고 임시 테이블을 만들 수 있는 명시적 코드가 있는 경우 테이블이 이미 존재한다는 오류가 표시됩니다.사용자가 직접 정리하는 것은 항상 좋은 소프트웨어 관행입니다.

편집: 03-11월-2021

다른 대안으로는 TABLE 변수가 있으며, 쿼리가 완료되면 범위를 벗어납니다.

DECLARE @MyTable AS TABLE (
    MyID INT, 
    MyText NVARCHAR(256)
)

INSERT INTO
    @MyTable
VALUES
    (1, 'One'),
    (2, 'Two'),
    (3, 'Three')

SELECT
    *
FROM
    @MyTable

CREATE TABLE(트랜잭션-SQL)

DROP TABLE을 사용하여 명시적으로 삭제하지 않는 한 임시 테이블이 범위를 벗어나면 자동으로 삭제됩니다.

  • 저장 프로시저에서 작성된 로컬 임시 테이블은 저장 프로시저가 완료되면 자동으로 삭제됩니다.테이블을 만든 저장 프로시저에서 실행한 중첩 저장 프로시저에서 테이블을 참조할 수 있습니다.테이블을 만든 저장 프로시저를 호출한 프로세스에서 테이블을 참조할 수 없습니다.
  • 다른 모든 로컬 임시 테이블은 현재 세션이 끝나면 자동으로 삭제됩니다.
  • 글로벌 임시 테이블은 테이블을 만든 세션이 종료되고 다른 모든 작업이 테이블 참조를 중지하면 자동으로 삭제됩니다.태스크와 테이블 간의 연결은 단일 Transact-SQL 문의 수명 동안만 유지됩니다.즉, 글로벌 임시 테이블은 생성 세션이 종료되었을 때 테이블을 적극적으로 참조하던 마지막 Transact-SQL 문이 완료될 때 삭제됩니다.

이전에는 백그라운드 서버 프로세스로 개체를 정리하는 작업에 빠졌지만 최근에는 TempDB 로그 파일의 급격한 증가 문제로 인해 제 의견이 바뀌었습니다.모든 버전의 SQL Server에서 항상 그랬을지는 모르겠지만, SQL 2016으로 전환하고 드라이브를 PureStorage SSD 어레이에 배치한 이후로는 상황이 조금 다르게 진행됩니다.프로세스는 일반적으로 I/O 바인딩이 아닌 CPU 바인딩되어 있으며, 임시 개체를 명시적으로 삭제하면 로그 증가에 문제가 없습니다.그 이유에 대해 깊이 파고들지는 않았지만, 명시적으로 호출되면 동기화되고 시스템에 맡겨지면 비동기화되는 .NET 세계의 가비지 컬렉션과 다르지 않다고 생각합니다.명시적으로 삭제하면 로그 파일의 스토리지가 해제되어 다음 로그 백업 시 사용할 수 있게 되므로 문제가 되지만 개체를 명시적으로 삭제하지 않을 경우에는 그렇지 않은 것 같습니다.대부분의 시스템에서는 이 문제가 큰 문제가 되지 않지만, 대량의 ERP와 동시 트랜잭션이 많고 TempDB를 많이 사용하는 웹 상점을 지원하는 시스템에서는 큰 영향을 미쳤습니다.TempDB 개체를 생성하는 이유에 대해서는, 대부분의 쿼리에 있는 데이터의 양이 TempDB 스토리지로 흘러 들어가기 때문에 일반적으로 시스템이 자동으로 개체를 처리하도록 하는 것보다 필요한 인덱스를 사용하여 개체를 생성하는 것이 더 효율적입니다.

각 스레드가 고유한 테이블 집합을 만들고 스레드 수가 제한되는 멀티 스레드 시나리오에서는 사용자의 테이블을 삭제하지 않으면 관리자가 스레드가 완료된 것으로 간주하고 더 많은 스레드를 생성할 수 있습니다.그러나 임시 테이블은 여전히 주변에 있으므로(따라서 서버에 대한 연결) 관리자의 제한을 초과하게 됩니다.수동으로 임시 테이블을 삭제하면 스레드가 삭제되고 새 스레드가 생성되지 않을 때까지 스레드가 완료되지 않으므로 SQL 엔진에 과부하가 걸리지 않도록 관리자의 기능을 유지할 수 있습니다.

제 견해로는.명시적으로 임시 테이블을 삭제할 필요가 없습니다. SQL 서버는 쿼리를 처리할 공간이 부족할 경우 임시 DB에 저장된 임시 테이블을 삭제하도록 처리합니다.

언급URL : https://stackoverflow.com/questions/7348428/explicitly-drop-temp-table-or-let-sql-server-handle-it

반응형