본문 바로가기

Develop/MSSQL28

로컬 바인드 변수 사용 경우 실행계획이 이상할 떄가 있다! 1) Store Procedure에서 바인드 변수 사용 경우 2) 스칼라 변수 사용 경우 3) 로컬 바인드 변수 사용 경우 위와 같은 3가지 경우 1),2)는 올바른 실행계획을 사용하는데, 3)은 부적절한 실행계획을 사용할 수 있다. 왜? * 3가지 경우 모두 실행 계획이 캐싱된다. SGA(System Global Area) > Shared Pool > Library Cache > Shared SQL Area에 실행 계획이 캐싱된다. (하드파싱 횟수 감소로 CPU 자원 효율 증대) * 1)경우, 최초 파싱시 사용했던 변수의 분포도 사용(Prameter Sniffing) * 2)경우, 최초 파싱시 사용했던 변수의 분포도 사용 * 3)경우, 최초 파싱시 변수의 분포도 사용 불가(Prameter Sniffin.. 2023. 10. 18.
2023.10.18 1. 조인하고 그룹핑 ->그룹핑하고 조인 불필요한 rows만큼 JOIN 조건을 체크하지 않기 위해서 접기 /***** 조인하고 그룹핑 *****/ SELECT COUNT(*) AS totalCnt , SUM(IIF(resultStatusCode = 'S1', 1, 0)) AS completeCnt , SUM(IIF(resultStatusCode = 'S2', 1, 0)) AS ingCnt , SUM(IIF(resultStatusCode = 'S-1', 1, 0)) AS absentCnt FROM ( SELECT RS.NEISCode, RS.IpsiYear, RS.IpsiGubun, RS.ExamSetNo, RS.SuhumNo, MAX(RR.StatusCode) AS resultStatusCode FROM.. 2023. 10. 18.
테이블 Random 액세스 최소화 튜닝 방법 1. 인덱스 컬럼 추가 SELECT /*+ index(emp emp_x01) */ * FROM emp WHERE depno = 30 AND sal >= 2000 emp 테이블에 현재 PK 이외에 [depno + job] 순으로 구성된 emp_x01 인덱스 하나만 있는 상태다. 테이블 액세스가 발생하게 된다. 인덱스 구성을 [depno + sal] 순으로 바꿔주면 좋겠지만 실 운영 환경에서는 인덱스 구성을 함부로 바꾸기가 쉽지 않다. 인덱스를 새로 만들어야겠지만 인덱스를 추가해 나가다 보면 테이블마다 인덱스가 수십 개씩 달려 배보다 배꼽이 더 커지게 된다. 인덱스 관리 비용이 증가함은 물론 DML 부하에 따른 트랜잭션 성능 저하가 생길 수 있음을 예상할 수 있다. 이럴 때 기존 인덱스에 sal 컬럼을 추가.. 2022. 12. 25.
MAX() 함수의 성능 개선 -2 1. 사전구성 SELECT CASE WHEN a.number < 10 THEN '가' ELSE '나' END AS A , ROW_NUMBER() OVER(ORDER BY a.number) AS B INTO TB_TOP FROM master..spt_values a JOIN master..spt_values b ON a.type = 'P' AND a.number 2022. 12. 19.
COUNT 함수의 OVER 절 성능 이슈 - 2 1. 사전구성 CREATE TABLE TB_Std02 ( std_no INT NOT NULL , class_cd VARCHAR(2) NOT NULL , code NVARCHAR(36) NOT NULL , CONSTRAINT PK_Std02 PRIMARY KEY NONCLUSTERED (std_no) ); CREATE TABLE TB_Point02 ( std_no INT NOT NULL , sbjt_cd VARCHAR(2) NOT NULL , point INT NOT NULL ); INSERT INTO TB_Std02 SELECT std_no , CASE WHEN std_no 2022. 12. 15.
COUNT 함수의 OVER 절 성능 이슈 - 1 1. 사전구성 SELECT NEWID() AS code , CAST(rownum%12 AS INT) AS value INTO TB_OVER FROM ( SELECT ROW_NUMBER() OVER (ORDER BY a.number) AS rownum , a.number FROM master..spt_values a JOIN master..spt_values b ON a.type = 'P' AND b.type = 'P' AND a.number 2022. 12. 14.
변수 사용에 따른 카디널리티 추정 이슈 1. 사전구성 SELECT CASE WHEN seq = 1 THEN 1 WHEN seq 2022. 12. 12.
변수 테이블의 통계 개선 - 1 1. 사전구성 SELECT ROW_NUMBER() OVER (ORDER BY a.number) seq , NEWID() main_code INTO TB_Main01 FROM master..spt_values a , (SELECT number FROM master..spt_values WHERE type = 'P' AND number < 10) b WHERE a.type = 'P' AND a.number BETWEEN 1 AND 1000; SELECT c.sub_code , ASCII(SUBSTRING(sub_code, 1, 1)) * c.number value INTO TB_Sub01 FROM ( SELECT b.number, CONVERT(NVARCHAR(36), main_code) sub_code F.. 2022. 12. 8.
EXCEPT 구문 성능 이슈 1. 사전구성 SELECT number custid , NEWID() code , CASE WHEN number 2022. 12. 7.
스칼라 서브 쿼리 성능 이슈 1. 사전구성 SELECT rownum AS seq , NEWID() AS sub_code , DATEADD(ss, rownum, '2020-01-01 00:00:00.000') AS date INTO TB_Sub05 FROM (SELECT ROW_NUMBER() OVER (ORDER BY a.number) AS rownum , a.number FROM master..spt_values a JOIN master..spt_values b ON a.type = 'P' AND b.type = 'P' AND a.number 2022. 12. 1.