Pyun's

반응형

1. 테이블에 코맨트 가져와서 셀렉트 시 주석 다는 쿼리

WITH columns AS (
    SELECT
        ps.schemaname,
        ps.relname,
        pa.attname AS column_name,
        COALESCE(pd.description, 'No Comment') AS column_comment,
        pa.attnum,
        MAX(pa.attnum) OVER () AS max_attnum
    FROM pg_stat_all_tables ps
    JOIN pg_attribute pa ON ps.relid = pa.attrelid
    LEFT JOIN pg_description pd ON pd.objoid = pa.attrelid AND pd.objsubid = pa.attnum
    WHERE ps.schemaname = 'TEST' -- 스키마명 입력
      AND ps.relname = 'TEST' -- 테이블명 입력
      AND pa.attnum > 0
      AND NOT pa.attisdropped
    ORDER BY pa.attnum
)
SELECT
    'SELECT' || E' \n\t' || -- SELECT 바로 뒤에 줄 바꿈과 탭 추가 (들여쓰기)
    STRING_AGG(
        CASE
            WHEN attnum = max_attnum THEN
                -- 마지막 컬럼은 쉼표 없음
                column_name || ' /* ' || column_comment || ' */'
            ELSE
                -- 마지막이 아닌 컬럼은 쉼표와 주석 뒤에 줄 바꿈 및 들여쓰기
                column_name || E' ,\t/* ' || column_comment || ' */' || E'\n\t'
        END,
        '' -- 각 항목 사이에 별도의 구분자 없이 CASE 문 안에서 처리
    ) || E'\n' || -- 모든 컬럼 뒤에 줄 바꿈 (FROM 앞에)
    'FROM ' || schemaname || '.' || relname || ';' AS query
FROM columns
GROUP BY schemaname, relname;

2. 조건 자동으로 생성해주는 쿼리(in)

SELECT 
STRING_AGG(
'<if test ="'
|| substr( replace( initcap( '1' || pa.attname), '_', '' ), 2) || 'List != null and ' || substr( replace( initcap( '1' || pa.attname), '_', '' ), 2) || E'List.size > 0">\n'
|| E'\t' 
|| 'AND th.' --약어
|| pa.attname || E' IN\n'
|| E'\t<foreach collection="' || substr( replace( initcap( '1' || pa.attname), '_', '' ), 2) || 'List' || E'" item="item" open="(" close=")" separator=",">\n' 
|| E'\t\t#{item}\n'
|| E'\t</foreach>\n'
|| E'</if>\n'
, ''
) as "mybatisWhere"
    FROM pg_stat_all_tables ps
    JOIN pg_attribute pa ON ps.relid = pa.attrelid
    LEFT JOIN pg_description pd ON pd.objoid = pa.attrelid AND pd.objsubid = pa.attnum
    WHERE ps.schemaname = 'test' 
      AND ps.relname = 'test' -- 테이블명 입력
      AND pa.attnum > 0
      AND NOT pa.attisdropped
    ;

3. 조건 자동으로 생성해주는 쿼리(eq ( like로변경가능))

SELECT 
STRING_AGG(
'<when test="srchKwTp == ''' 
|| substr( replace( initcap( '1' || pa.attname), '_', '' ), 2) 
|| E'''">\n' 
|| E'\t' 
|| 'tb.' --약어
|| pa.attname 
|| E'= #{srchKw}\n'
|| E'</when>\n'
, ''
) as "mybatisWhere"
    FROM pg_stat_all_tables ps
    JOIN pg_attribute pa ON ps.relid = pa.attrelid
    LEFT JOIN pg_description pd ON pd.objoid = pa.attrelid AND pd.objsubid = pa.attnum
    WHERE ps.schemaname = 'TEST' 
      AND ps.relname = 'TEST' -- 테이블명 입력
      AND pa.attnum > 0
      AND NOT pa.attisdropped
    ;

4. 슬로우 쿼리 검색

-- 오래 실행 중인 쿼리 (예: 5초 이상)
SELECT 
    pid,
    datname AS database,
    usename AS user,
    client_addr,
    state,                    -- active / idle in transaction 등
    wait_event_type,
    wait_event,
    current_timestamp - query_start AS runtime,  -- 실행 시간
    query_start,
    query                     -- 실제 실행 쿼리
FROM pg_stat_activity
WHERE state = 'active'
  AND current_timestamp - query_start > interval '5 seconds'  -- 원하는 시간으로 조정
ORDER BY runtime DESC;
반응형