SQL Server-임시 테이블과 실제 테이블


14

#temp 테이블을 사용하지 않고 대신 SPID가있는 영구 물리적 테이블을 사용하기 위해 제 자리에 이동했습니다. 이전에 #temp 테이블에 삽입했을 때마다 저장 프로 시저의 시작 부분에 INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)많은 DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPID명령문 과 함께 이제는 # 이 필요 합니다. 또한, 이러한 '임시 데이터를 저장하기위한 영구 테이블'이 사용되는 곳이라면 어디에서나를 포함하도록주의해야합니다 WHERE SPID = @@SPID.

이 관행을 향한 진전의 논리는 쿼리가 실행되는 서버의 전반적인 성능을 향상시키는 것입니다 (tempdb의 I / O 및 경합 감소). 여러 가지 이유로이 방법에 관심이 없습니다. 추악하고 잠재적으로 위험하며 새로운 체계를 사용하는 쿼리의 성능을 저하시킬 수 있습니다.

누구든지 #temp 테이블을 제거하는 이와 비슷한 방법에 대한 경험이 있습니까?

답변:


18

IO 나 경합을 줄이지 않고 대신 두 가지를 모두 증가 시킨다는 것을 쉽게 알 수 있습니다 .

  • IO : #temp 테이블에서 삽입, 읽기 또는 삭제 된 모든 행이 이제 @@ SPID 테이블에서 삽입, 읽기 또는 삭제됩니다. 그러나 추가 @@ SPID 열을 사용하면 모든 행이 더 넓어 지므로 필요한 페이지 수가 약간 증가하고 IO가 너무 커집니다. 그러나 더 중요한 것은 #temp 테이블의 삭제 와 세션에 의한 새로운 세션의 #temp 테이블의 초기화를 이제로 시뮬레이션해야 DELETE FROM @@spidTable WHERE spid = @@SPID하므로 잘라 내기 / 만들기 작업 (예 : 페이지 범위 관리 작업)이 변환됩니다. 행 작업에서 비교할 수 없을 정도로 느립니다.
  • 경합 : #temp 테이블에서 페이지 잠금을 사용하는 모든 스캔은 이제 관련되지 않은 spid 행이있는 페이지를 잠글 수 있으므로 이전에 존재하지 않는 경합이 발생합니다. 잠금 에스컬레이션 임계 값에 도달하는 모든 업데이트는 잠금을 테이블 잠금으로 에스컬레이션하여 다른 모든 spid 를 차단할 수 있습니다.

따라서 tempdb에서 신화적인 IAM / SGAM / GAM 경합에 부딪치지 않는 것이 사실이지만, 이것이 일어나는 유일한 이유는 일반적인 추가 IO 및 추가 경합으로 인해 작업이 훨씬 느려지기 때문입니다.


위의 Remus에 전적으로 동의하며 훌륭한 답변을 보내 주셔서 감사합니다. 문제는 타사 응용 프로그램 (우리 자신의 데이터베이스가있는 서버에 여러 데이터베이스가 있음)으로 인해 성능이 저하된다는 것입니다. 데이터와 쿼리를 수행해야합니다. 나는 여전히 당신이 옳다고 생각합니다-I / O 현명한 새로운 접근 방식이 이전보다 상당히 나빠질 것으로 기대합니다.
Will A

얼마나 많은 tempdb 파일이 있습니까? 표준 설정은 실제로 전혀 확장되지 않습니다. 보이는 프로세서 코어 당 하나씩 여러 개의 tempdb 파일과 로그 파일이 있어야합니다 (각각 hyper-v 인 경우 2 개).
TomTom

1
가장 일반적인 tempdb 확장 성 문제를 해결하기 위해 sqlskills.com/BLOGS/PAUL/post/…sqlskills.com/BLOGS/PAUL/post/… 라는 두 기사를 읽어야 합니다.
Remus Rusanu

@TomTom 우와, 우와. 여러 개의 로그 파일? 정말?
Aaron Bertrand

5

+1 완전히 동의-tempdb를 최적화하고 구현이 나빠질 수 있으므로 바퀴를 다시 발명하지 마십시오. :)

이 경로가 타당하지 않다면이 길을 따르지 않기 위해 최선을 다하고 있습니다. Ben의 정보 덕분에 DBA를 조사하고 적절하게 제안 할 것입니다.
Will A

2

tempDB 내에서 성능 문제를 해결 해야하는 것처럼 들리지만 여기에 몇 가지 제안이 있습니다.


유용하게 보입니다. SPE109 덕분에이를 확인하고 DBA에 적절하게 권장 할 것입니다.
Will A
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.