본문 바로가기

Database/MSSQL work

(47)
한번 썼던 PLAN CACHE 쿼리들을 삭제하는 명령어 주기적으로 유지보수 할 때 싹 삭제함... DECLARE @MB decimal(19,3) , @Count bigint, @StrMB nvarchar(20) SELECT @MB = sum(cast((CASE WHEN usecounts = 1 AND objtype IN ('Adhoc', 'Prepared') THEN-- 범위를 정해줌 size_in_bytes ELSE 0 END) as decimal(12,2)))/1024/1024 ,@Count = sum(CASE WHEN usecounts = 1 AND objtype IN ('Adhoc', 'Prepared') THEN 1 ELSE 0 END) ,@StrMB = convert(nvarchar(20), @MB) FROM sys.dm_exec_cached_pl..
PLAN CACHE에서 단일 사용계획에 사용되는 메모리양을 확인 할 때 사용하는 쿼리 SELECT objtype AS [CacheType] , count_big(*) AS [Total Plans] , sum(cast(size_in_bytes as decimal(18,2)))/1024/1024 AS [Total MBs] , avg(usecounts) AS [Avg Use Count] , sum(cast((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END) as decimal(18,2)))/1024/1024 AS [Total MBs - USE Count 1] , sum(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [Total Plans - USE Count 1] FROM sys.dm_exec_cached_pl..
PLAN CACHE에서 단일 실행계획을 찾고, 또 삭제하는 캐시 쿼리 명령어 -- 현재 캐시된것들 확인하기 SELECT * FROM SYS.dm_exec_cached_plans GO -- PLAN CACHE에서 단일 실행계획을 찾는 쿼리문(PLAN CACHE사이즈를 최적화하기위함) 아래 출력되는 것들을 재 컴파일하면 속도를 줄일 수 있음 --> 한번만 쓰고 버리는 쿼리들 위주로 재컴파일 필요,,,,, 해당 쿼리문은 재활용 하자!!!! SELECT TEXT, CP.OBJTYPE, CP.SIZE_IN_BYTES FROM SYS.dm_exec_cached_plans AS cp CROSS APPLY SYS.dm_exec_sql_text(CP.PLAN_HANDLE) ST WHERE CP.cacheobjtype = 'Compiled Plan' AND -- Adhoc은 쿼리를 한번 던지는것,..
CLUSTERED/ NONCLUSTERED 예상실행계획 비교 CLUSTERED/ NONCLUSTERED INDEX를 각각 하나씩 생성한다 CREATE CLUSTERED INDEX PK_COLUM_IDX ON COLUMTABLE(IDX) CREATE NONCLUSTERED INDEX PK_COLUM_IDX ON COLUMTABLE(IDX) NONCLUSTERED 에서 범위를 하나로 지정하여 할 경우 CLUSTERED 에서 범위를 하나로 지정하여 할 경우 NONCLUSTERED 범위를 크게 정할 경우 CLUSTERED 범위를 크게 정할 경우
[COLUMNSTORE INDEX] SQL 프로파일러 이용하여 성능 테스트 테이블 생성하고 CREATE TABLE COLUMTABLE( IDX INT NOT NULL, CDATA INT NULL, ODATA INT NOT NULL, DATA1 VARCHAR(20) NULL, DATA2 VARCHAR(20) NULL, DATA3 VARCHAR(20) NULL, DATA4 VARCHAR(20) NULL, DATA5 VARCHAR(20) NULL, DATA6 INT NULL, DATA7 INT NULL, DATA8 INT NULL, DATA9 INT NULL, DATA10 INT NULL, DATA11 INT NULL, DATA12 INT NULL, DATA13 INT NULL, DATA14 INT NULL, DATA15 INT NULL, DATA16 FLOAT NULL, DATA1..
DB 쿼리로 분리/연결하는 명령문 -- 분리 exec sp_detach_db -- 연결 exec sp_attach_db -- AdventureWorks 연결하기 exec sp_attach_db 'AdcentureWorks2019', 'K:\Data\AdventureWorks2019.mdf', 'L:\Log\AdventureWorks2019_log.ldf' 연결 명령문이 실행이 안될 때에는, 해당 파일을 마우스 우클릭하여 권한을 확인해보고 로그인 한 계정에 모든 권한을 준다.
NOLOCK, 격리수준, 프로파일러로 추적! MSSQL의 경우,기본적으로 제공하는 격리수준은 READ_COMMITED 입니다. 즉, AUTO COMMIT 라고 생각하시면 되십니다. 설정 변경은 가능합니다. 하지만 기본적으로는 저렇게 되고 있습니다. 그렇다보니 UPDATE, INSERT 등을 하면서 테이블이 잠기게 되었을 때, SELECT를 하게 된다면 블락이 걸리게 됩니다. 이럴 때는 DB의 성능이 떨어지고, 데드락이 걸리게 되어 결과가 안나오는 경우가 발생할 수도 있습니다. 이럴 때를 피하기 위해 사용할 수 있는 방법이 WITH (NOLOCK) 입니다. 목적 : 잠금(lock)이 되어있는 Table의 정보를 가져올 때 사용 잠금(lock)이란 ? 현재 테이블에 어떤 작업이 실행되고 있다고 가정할수 있음 해당된작업(트랜젝선)안에서 데이터는 변경된 ..
구매 고객별 등급 나누기? select select C.custId, case when sum(sales) >= 10000 then 'A' when sum(sales) >= 5000 then 'B' when sum(sales) >= 10 then 'C' else 'D' end as grade from customersTbl C left join salesTbl S ON C.custId = S.custId group by c.custId 테이블 update update customersTbl set customersTbl.grade = S.grade from customersTbl as C, ( select C.custId, case when sum(sales) >= 10000 then 'A' when sum(sales) >= 50..