블로그 이미지
bedbmsguru

Notice

Recent Post

Recent Comment

Recent Trackback

Archive

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
  • total
  • today
  • yesterday
2021. 6. 3. 11:47 PostgreSQL

postgresql 튜닝대상 SQL 을 수집하기 위한 pg_stat_statements 

 

pg_stat_statements 설정법

https://rastalion.me/pg_stat_statements/

 

pg_stat_statements - RastaLion's IT Blog

  pg_stat_statements 란? pg_stat_statements 모듈은 서버에서 실행 되었던 쿼리들에 대한 실행 통계 정보를 보여줍니다. pg_stat_statements 모듈이 로드되면, 이 때부터 해당 서버의 모든 데이터베이스에서 일

rastalion.me

pg_stat_statements Documents

https://www.postgresql.org/docs/12/pgstatstatements.html

 

'PostgreSQL' 카테고리의 다른 글

Table Size 체크 SQL  (0) 2021.06.23
DESCRIBE TABLE (  (0) 2021.06.15
blocking 체크  (0) 2020.07.24
pg_settings 칼럼 설명  (0) 2020.05.20
postgresql.conf 파일 설정  (0) 2020.04.27
posted by bedbmsguru
2021. 6. 1. 13:37 Zabbix

https://nirsa.tistory.com/252

'Zabbix' 카테고리의 다른 글

Zabbix 3.0 Agent Repository  (0) 2023.05.09
Windows Zabbix Agent 설치  (0) 2019.05.30
Postgresql 모니터링  (0) 2019.02.19
Linux DISK IO 모니터링  (0) 2018.11.30
zabbix Agent 설치  (0) 2018.10.26
posted by bedbmsguru
2021. 5. 31. 13:57 Linux

yum 설치시 인증서 관련 오류가 나지 않도록 하기

 

인증서 체크를 하지 않도록 설정파일에 추가한다.

 

vi /etc/yum.conf

sslverify=false

 

 

https://luvunix.wordpress.com/2018/10/09/the-ssl-certificate-failed-verification-error-while-running-yum-command/

 

 

'Linux' 카테고리의 다른 글

vmstat를 사용한 모니터링  (0) 2020.04.29
yum을 이용해서 iostat 설치하기  (0) 2018.01.26
posted by bedbmsguru
2021. 5. 25. 15:23 SQL SERVER

1. 인덱스 힌트를 제거한다. 

2. NVL 함수를  ISNULL 혹은 IFNULL 함수로 변경한다. 

3. SYSDATE 함수를 NOW() 함수로 변경한다. 

4. TRUNC(SYSDATE)를 CONVERT(DATE,GETDATE(),12)로 변경한다. 
   trunc(sysdate)를 하면 시간이 잘린 연,월,일이 나온다.  예)19/05/09

   이와 같은 역할을 하는 CONVERT를 사용한다.

5. Outerjoin 변경  

[Oracle] 
left outer joing : SELECT t1.*, t2.* FROM t1, t2 where t1.i1 = t2.i2(+); 
right outer joing: SELECT t1.*, t2.* FROM t1, t2 where t1.i1(+) = t2.i2; 

[MSSQL] 
left outer joing : SELECT t1.*, t2.* FROM t1 LEFT OUTER JOIN t2 ON t1.i1 = t2.i2; 
right outer joing: SELECT t1.*, t2.* FROM t1 RIGHT OUTER JOIN t2 ON t1.i1 = t2.i2; 

!! From절에서 테이블명 중간에 , 가 없다는것과 ON 구문이 From절 바로 뒤에 오게 해야하는것에 주의  !!


6. TO_CHAR()를 CONVERT()으로 변환한다. 

    TO_CHAR(sysdate,'YYYYMMDD')의 경우 

    CONVERT(VARCHAR,GETDATE(),12)로 변환  .

 

아래는 추가로 다양한 형식에 맞게 사용

 

SELECT CONVERT(VARCHAR,getdate(),(120))   --//2019-05-09 2019-05-09 11:55:35
,CONVERT(VARCHAR,getdate(),(102))  --//2019.05.09 
,CONVERT(VARCHAR,getdate(),(12))  --//190509
,CONVERT(VARCHAR,getdate(),(23)) --//2019-05-09
,LEFT(CONVERT(VARCHAR,getdate(),(23)),7) --//2019-05
,LEFT(CONVERT(VARCHAR,getdate(),(3)),2) //09
;
  


7. TO_DATE()를 CONVERT()으로 변환한다. 
SELECT CONVERT(DATE,getdate(),(120))   --//2019-05-09 2019-05-09 11:55:35
,CONVERT(DATE,getdate(),(102))  --//2019.05.09 
,CONVERT(DATE,getdate(),(12))  --//190509
,CONVERT(DATE,getdate(),(23)) --//2019-05-09
,LEFT(CONVERT(DATE,getdate(),(23)),7) --//2019-05
,LEFT(CONVERT(DATE,getdate(),(3)),2) //09


8. Where rownum <= 10 을 ROW_NUMBER()OVER() 로 변환 
  이때 주의 할 점은 SELECT 절에 TOP 100 PERCENT 붙여주어야 누락없이 다 뽑음


9. Subquery에서 alias가 없다면 붙인다. 
   예를 들면 
    select a, b from ( select a, b from ttt)  
--> select t.a, t.b from ( select a, b from ttt) t 

  

10. DELETE 테이블명 쿼리문을 DELETE FROM 테이블명 쿼리문으로 바꾸어준다. 

11. Merge into의 경우는 쿼리문을 분리하여 DAO단에서 처리로직으로 변경해준다. 

     변경방법은 아래 두가지중에 하나를 선택해도 되고 다른 방법을 써도 된다. 


  

      (1) 조건이 맞는지(MATCHED)에 대한 SELECT문을 실행시켜서 결과값이 

           있으면 UPDATE문을 실행시켜 주고 결과값이 없으면 INSERT문을 

           실행시켜준다. 

           % rs.next()로 결과값이 있는지 판단 

  

      (2) UPDATE문을 실행해서 UPDATE가 일어나면 그대로 가고 UPDATE가 

           일어나지 않으면 INSERT문을 실행시킨다. 

           % ps.executeUpdate() > 0으로 UPDATE 판단 



o 오라클 MergeInto 구문 

MERGE INTO SERVICE_LOG FSL1 
USING 
(SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') AS DAYS, 'LS003' AS SERVICE_TYPE FROM DUAL ) FSL2 
ON (FSL1.DAYS = FSL2.DAYS AND FSL1.SERVICE_TYPE = FSL2.SERVICE_TYPE) 
WHEN MATCHED THEN 
UPDATE SET FSL1.AGE_10_CNT = FSL1.AGE_10_CNT + 1 
WHEN NOT MATCHED THEN 
INSERT (FSL1.DAYS, FSL1.SERVICE_TYPE, FSL1.AGE_10_CNT) 
VALUES (FSL2.DAYS, FSL2.SERVICE_TYPE, 1) 

-------------------------------------------------------------------------------------- 

o MySQL 구문으로 변환처리 1 
  - DAO처리에서 조건이 맞는지(MATCHED) 안맞는지(NOT MATCHED) 비교하는 SELECT 쿼리문을 실행하고 
    그 결과에 따라서 업데이트와 인서트 처리를 해준다. SELECT 결과값이 있다면 업데이트, 
    SELECT 결과값이 없다면 인서트(rs.next()로 결과값이 있는지 판단) 
  
if(getDAO().existServiceLog(conn, serviceType)) { 
    return getDAO().updateServiceLog(conn, memberInfo, serviceType); 
}else{ 
    return getDAO().insertServiceLog(conn, memberInfo, serviceType); 


1) public boolean existServiceLog(Connection conn, String serviceType) 

   SELECT SERVICE_TYPE 
   FROM SERVICE_LOG USE INDEX(PRIMARY) 
   WHERE SERVICE_TYPE='LS003' AND DAYS=DATE_FORMAT(NOW(), '%Y%m%d') 

2) public boolean updateServiceLog(Connection conn, Member memberInfo, String serviceType) 

   UPDATE SERVICE_LOG 
   SET AGE_10_CNT = AGE_10_CNT+1 
   WHERE SERVICE_TYPE='LS003' AND DAYS=DATE_FORMAT(NOW(), '%Y%m%d') 

3) public boolean insertServiceLog(Connection conn, Member memberInfo, String serviceType) 

 



   INSERT SERVICE_LOG(DAYS, SERVICE_TYPE, AGE_10_CNT, AGE_20_CNT, AGE_30_CNT, AGE_40_CNT, AGE_50_CNT) 

 


   VALUES(DATE_FORMAT(NOW(), '%Y%m%d'), 'LS003', 1, 0, 0, 0, 0) 

--------------------------------------------------------------------------------------------------------- 
o MySQL 구문으로 변환처리 2 
  - DAO처리에서 업데이트가 되었는지를 비교하는 구문을 실행해서 업데이트가 일어나면 그대로 진행되고 
    업데이트 일어나지 않으면 인서트를 실행해 준다(ps.executeUpdate() > 0으로 UPDATE 판단) 

 



if(!getDAO.updateServiceLog(conn, memberInfo, serviceType)){ 

 


    getDAO.insertServiceLog(conn, memberInfo, serviceType); 



1) public boolean updateServiceLog(Connection conn, Member memberInfo, String serviceType) 

   UPDATE SERVICE_LOG 
   SET AGE_10_CNT = AGE_10_CNT+1 
   WHERE SERVICE_TYPE='LS003' AND DAYS=DATE_FORMAT(NOW(), '%Y%m%d') 
   을 실행해서  ps.executeUpdate() > 0;을 결과로 리턴한다. 업데이트가 
   일어나지 않으면 false를 반환하고 insert가 일어난다. 

2) public boolean insertServiceLog(Connection conn, Member memberInfo, String serviceType) 

   INSERT SERVICE_LOG(DAYS, SERVICE_TYPE, AGE_10_CNT, AGE_20_CNT, AGE_30_CNT, AGE_40_CNT, AGE_50_CNT) 

 


   VALUES(DATE_FORMAT(NOW(), '%Y%m%d'), 'LS003', 1, 0, 0, 0, 0) 



출처: https://limeeyojung.tistory.com/29 [초보개발자의 코딩기록]

 

posted by bedbmsguru
2021. 4. 26. 09:26 SQL SERVER

ALTER DATABASE [DB명] SET ENCRYPTION OFF;
GO

use DB명
DROP DATABASE ENCRYPTION KEY

 


-- 4. 암호화 상태 확인

SELECT DB_NAME(e.database_id) AS DatabaseName, 
            e.database_id, 
            e.encryption_state, 
    CASE e.encryption_state 

     WHEN 0 THEN 'No database encryption key present, no encryption' 
                WHEN 1 THEN 'Unencrypted' 
                WHEN 2 THEN 'Encryption in progress' 
                WHEN 3 THEN 'Encrypted' 
                WHEN 4 THEN 'Key change in progress' 
                WHEN 5 THEN 'Decryption in progress' 
    END AS encryption_state_desc, 
            c.name, 

     e.percent_complete 
    FROM sys.dm_database_encryption_keys AS e 

   LEFT JOIN master.sys.certificates AS c

    ON e.encryptor_thumbprint = c.thumbprint 

posted by bedbmsguru
2021. 4. 22. 15:54 SQL SERVER

아래 참조

 

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED GO WITH DB_CPU_Stats AS ( SELECT DatabaseID, isnull(DB_Name(DatabaseID),case DatabaseID when 32767 then 'Internal ResourceDB' else CONVERT(varchar(255),DatabaseID)end) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms], SUM(total_logical_reads) AS [Logical_Reads], SUM(total_logical_writes) AS [Logical_Writes], SUM(total_logical_reads+total_logical_writes) AS [Logical_IO], SUM(total_physical_reads) AS [Physical_Reads], SUM(total_elapsed_time) AS [Duration_MicroSec], SUM(total_clr_time) AS [CLR_Time_MicroSec], SUM(total_rows) AS [Rows_Returned], SUM(execution_count) AS [Execution_Count], count(*) 'Plan_Count' FROM sys.dm_exec_query_stats AS qs CROSS APPLY ( SELECT CONVERT(int, value) AS [DatabaseID] FROM sys.dm_exec_plan_attributes(qs.plan_handle) WHERE attribute = N'dbid') AS F_DB GROUP BY DatabaseID ) SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [Rank_CPU], DatabaseName, [CPU_Time_Hr] = convert(decimal(15,2),([CPU_Time_Ms]/1000.0)/3600) , CAST([CPU_Time_Ms] * 1.0 / SUM(case [CPU_Time_Ms] when 0 then 1 else [CPU_Time_Ms] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPU_Percent], [Duration_Hr] = convert(decimal(15,2),([Duration_MicroSec]/1000000.0)/3600) , CAST([Duration_MicroSec] * 1.0 / SUM(case [Duration_MicroSec] when 0 then 1 else [Duration_MicroSec] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Duration_Percent], [Logical_Reads], CAST([Logical_Reads] * 1.0 / SUM(case [Logical_Reads] when 0 then 1 else [Logical_Reads] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical_Reads_Percent], [Rows_Returned], CAST([Rows_Returned] * 1.0 / SUM(case [Rows_Returned] when 0 then 1 else [Rows_Returned] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Rows_Returned_Percent], [Reads_Per_Row_Returned] = [Logical_Reads]/(case [Rows_Returned] when 0 then 1 else [Rows_Returned] end), [Execution_Count], CAST([Execution_Count] * 1.0 / SUM(case [Execution_Count] when 0 then 1 else [Execution_Count] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Execution_Count_Percent], [Physical_Reads], CAST([Physical_Reads] * 1.0 / SUM(case [Physical_Reads] when 0 then 1 else [Physical_Reads] end ) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Physcal_Reads_Percent], [Logical_Writes], CAST([Logical_Writes] * 1.0 / SUM(case [Logical_Writes] when 0 then 1 else [Logical_Writes] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical_Writes_Percent], [Logical_IO], CAST([Logical_IO] * 1.0 / SUM(case [Logical_IO] when 0 then 1 else [Logical_IO] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical_IO_Percent], [CLR_Time_MicroSec], CAST([CLR_Time_MicroSec] * 1.0 / SUM(case [CLR_Time_MicroSec] when 0 then 1 else [CLR_Time_MicroSec] end ) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CLR_Time_Percent], [CPU_Time_Ms],[CPU_Time_Ms]/1000 [CPU_Time_Sec], [Duration_MicroSec],[Duration_MicroSec]/1000000 [Duration_Sec] FROM DB_CPU_Stats WHERE DatabaseID > 4 -- system databases AND DatabaseID <> 32767 -- ResourceDB ORDER BY [Rank_CPU] OPTION (RECOMPILE);

 

dba.stackexchange.com/questions/83058/how-to-get-cpu-usage-by-database-for-particular-instance

posted by bedbmsguru
2021. 4. 6. 14:43 SQL SERVER

USE msdb

GO

ALTER TABLE [dbo].[sysmaintplan_log] DROP CONSTRAINT [FK_sysmaintplan_log_subplan_id];

GO

ALTER TABLE [dbo].[sysmaintplan_logdetail] DROP CONSTRAINT [FK_sysmaintplan_log_detail_task_id];

GO

TRUNCATE TABLE msdb.dbo.sysmaintplan_logdetail;

GO

TRUNCATE TABLE msdb.dbo.sysmaintplan_log;

GO

ALTER TABLE [dbo].[sysmaintplan_log] WITH CHECK ADD CONSTRAINT [FK_sysmaintplan_log_subplan_id] FOREIGN KEY([subplan_id])

REFERENCES [dbo].[sysmaintplan_subplans] ([subplan_id]);

GO

ALTER TABLE [dbo].[sysmaintplan_logdetail] WITH CHECK ADD CONSTRAINT [FK_sysmaintplan_log_detail_task_id] FOREIGN KEY([task_detail_id])

REFERENCES [dbo].[sysmaintplan_log] ([task_detail_id]) ON DELETE CASCADE;

GO

 

www.sqlrx.com/large-msdb-database-from-sysmaintplan_logdetail-table/

posted by bedbmsguru
2020. 12. 28. 17:11 maridb&mysql

mariadb DDL작업시 Online 가능 여부 확인

 

myinfrabox.tistory.com/61

 

[MySQL][InnoDB] Online DDL

온라인 DDL 기능은 전체 테이블 변경 및 동시 DML을 지원합니다. 이 기능의 장점은 다음과 같습니다. + 몇 분 또는 몇 시간 동안 테이블을 사용할 수 없는 바쁜 생산 환경에서 응답 성과 가용성이

myinfrabox.tistory.com

 

'maridb&mysql' 카테고리의 다른 글

slow query log 설정  (0) 2020.08.21
mysql root 패스워드 분실 대처방법  (0) 2020.07.30
mysql status 확인하기  (0) 2020.07.30
mariabackup 을 이용한 mariadb 백업  (0) 2018.12.12
mariadb 계정, 권한 관련  (0) 2018.10.27
posted by bedbmsguru
2020. 12. 24. 13:17 오라클

pangate.com/647

 

오라클 LOCK 조회 및 KILL 방법

프로젝트에서 LOCK 이 자주 걸리는 문제가 발생하여 연구하던 중에 아래의 sql 문을 이용하여 lock 세션을 찾아서 관리할 수 있다는 것을 알았다. 그러나 이 SQL 은 System 유저만이 사용할 수 있다는

pangate.com

 

 

'오라클' 카테고리의 다른 글

실행중인 Job 모니터링 Query  (0) 2020.06.30
오랫동안 실행중인 SQL(Find Long Run SQL )  (0) 2020.04.28
Temp TableSpace 사용량 확인  (0) 2020.04.10
lock tree 형식으로 조회  (0) 2020.04.09
Undo 사용량 확인  (0) 2020.03.24
posted by bedbmsguru
2020. 12. 9. 16:32 SQL SERVER

1.  sp_lock 실행
  Lock 내용 확인. Mode가 X 인 것들을 확인하고, spid 를 기억해 둔다.

  보통 spid 가 여러개 중복되어 출력되는 경우가 많다.
  예) exec sp_lock


2. dbcc inputbuffer(spid)
  클라이언트에서 MSSQL로 보낸 최종 명령문을 표시한다.

  1번에서 Mode 가 X 인 것의 spid를 입력하면 해당 내용이 출력된다.
  예) dbcc iniputbuffer(60)

 

3. sp_who spid

  1번에서 확인된 spid 를 입력하면 관련 정보를 표시해 준다.

  예) exec sp_who 60

 

4. kill spid

  Lock을 확인했으면 해당 spid 를 입력하여 해당 프로세스를 끝낸다.

  예) kill 60

 

 



출처: https://walkingfox.tistory.com/27 [걸어가는 여우]

posted by bedbmsguru