pandas로 조회 결과 처리
DataFrame 구성, 결측값을 지원하는 정수형과 출력 변환, 수집기의 실제 판정 구현과 추가 표 출력은 확인 불가
#핵심 요약
실습 모니터에서 수집기(collector.py)와 화면(app.py) 사이에 오가는 것은 DataFrame 표 하나임
실습 3초 루프는 SQL 실행 결과를 DataFrame으로 만든 뒤 "10초 넘게 실행 중" 같은 기준과 비교해 악성 여부를 판정함
빈 칸이 섞인 숫자 열은 pandas가 실수로 바꿔, 진단 문구에 "SID 149.0"처럼 소수점이 붙었음
실습에서는 진단 문구의 SID를 정수로 표시하도록 고쳤음
이행 점검에서 두 드라이버가 돌려준 값을 비교할 때는 CHAR 뒷공백 제거, 숫자 Decimal 정규화, 날짜 ISO 문자열로 모양을 맞춘 뒤 비교했음
#개념과 동작 원리
| 실습 도구 | pandas가 맡은 일 |
|---|---|
| 미니 오라클 게이지, PG 게이지 | V$ 뷰, 통계 뷰 조회 결과를 표로 만들고 판정 기준과 비교 |
| 세션 상세, 진단 | SQL 전문과 실행계획을 꺼내 진단 문장 생성 |
| 미니 마이그레이터 | 분석, 검증, 점검 결과 표(화면 표시) |
실습 확인 스크립트에서 ts.to_string(index=False)로 테이블스페이스 결과를 인덱스 없이 출력한 예만 있음
#판정 기준
| 기준 | 값 |
|---|---|
| 실행 시간 | 10초 이상 |
| 세션 논리 읽기 | 100만 블록 이상 |
| 블로킹 | 다른 세션을 막고 있음 |
기준은 사이드바에서 바꿈
판정 결과가 화면에 어떻게 이어지는지는 문제 SQL 탐지와 세션 진단에 있음
#주요 용어와 구성 요소
| 구문 | 의미 |
|---|---|
| DataFrame | 행 레코드와 열 이름을 결합한 표이며 DB 열 순서와 이름을 맞춰야 함 |
| Int64와 int64 | 대문자 Int64는 결측값을 지원하는 확장 정수형임 |
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | 이미 조회한 레코드의 DataFrame 구성과 문자열 표시 |
| 필요 권한 | 준비된 조회 레코드 접근 권한, DB 조회 단계는 별도 계정 권한 필요 |
| 바꿀 입력값 | rows, columns, coerce_float, index, na_rep 표시 옵션 |
| 결과 해석 | DataFrame 구성과 문자열 표시 예제임 실제 표와 진단 결과는 기재 없음 |
import pandas as pd
df = pd.DataFrame.from_records(rows, columns=columns, coerce_float=False)
text = df.to_string(index=False)결과 해석: 조회 레코드를 표로 만들고 행 인덱스 없는 문자열로 표현하는 형태이며 실제 표, 판정 출력은 기재 없음
#구문과 옵션 설명
from_records의 columns는 열 이름과 순서를 정하며 coerce_float=True는 Decimal 같은 객체의 부동소수점 변환을 시도함
to_string의 index=False는 인덱스 표시만 숨기며 데이터 열을 제거하지 않음
na_rep는 문자열 출력의 결측 표기 옵션이며 저장된 결측을 실제 값으로 채우는 기능이 아님
#사용 조건과 주의사항
실습 7단계는 "SID 149.0" 문제를 표의 빈 칸 때문에 pandas가 숫자를 실수로 바꾼 것이라고 설명했음
NaN을 사용하는 정수 배열은 실수형으로 바뀔 수 있음
nullable 정수형 Int64는 pandas.NA로 결측을 표현하는 별도 타입임
같은 이유로 SQL 문장이 빈 세션의 sql_text가 문자열이 아닌 값으로 들어와 앞 60글자를 자르다 TypeError가 났음
실습에서는 문자열이 아니면 빈 칸으로 보여 주도록 고쳤음
이행 검증의 표본 비교에서 같은 값도 다르게 나올 수 있는 원인은 CHAR 뒷공백, 숫자 자릿수(10과 10.00), 날짜 타입임
세부는 이행 검증과 점검 리포트에 있음
식별자, 정밀 숫자의 표시 변환과 데이터 변환을 구분함
Int64 지정은 정수로 표현할 수 있는 값에 한해 검토하며 실습 수집기의 실제 변환 코드는 확인 불가