Archive: 2025

0

[쿠버네티스 DevOps 구축] - Prometheus 와 Grafana 설치하기

목차 [쿠버네티스 DevOps 구축] - OpenSearch 설치하기 [쿠버네티스 DevOps 구축] - Prometheus 와 Grafana 설치하기 [쿠버네티스 DevOps 구축] - Keycloak 설치하기 [쿠버네티스 DevOps 구축] - Ingress Nginx Controller 설치하기 [쿠버네티스 DevOps 구축] - Local PC 쿠버네티스 동적 프로비저닝을 위한 StorageClass 설치 [쿠버네티스 DevOps 구축] - Local PC 에 쿠버네티스 설치하기 ✅ 메트릭 수집을 위한 Prometheus서비스를 올렸다고 해서 끝이 아니다! 서비스를 운용하는 입장에서는 시스템이 안정적인지 지속적으로 확인을 해야 하는데, 운영하는 서비스의 CPU 사용률, 메모리 사용률과 같은 메트릭 정보를 지속적으로 수집하는 시스템을 구축해야 합니다. 저는 대중적으로 많이 알려진 Prometheus 를 이용해 쿠버네티스에서 운영중인 서비스에 대한 메트릭 정보를 수집하려고 합니다. Helm 을 이용한 Prometheus 설치# helm repo 추가helm repo add prometheus-community https://prometheus-community.github.io/helm-charts# prometheus 설치helm upgrade --install -f ./values-prometheus.yaml prometheus prometheus-community/prometheus -n monitoring --create-namespace Release "prometheus" does not exist. Installing it now.NAME: prometheusLAST DEPLOYED: Fri Nov 15 10:11:47 2024NAMESPACE: monitoringSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:prometheus-server.monitoring.svc.cluster.localGet the Prometheus server URL by running these commands in the same shell: export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=prometheus,app.kubernetes.io/instance=prometheus" -o jsonpath="{.items[0].metadata.name}") kubectl --namespace monitoring port-forward $POD_NAME 9090####################################################################################### WARNING: Persistence is disabled!!! You will lose your data when ########### the Server pod is terminated. ######################################################################################The Prometheus alertmanager can be accessed via port 9093 on the following DNS name from within your cluster:prometheus-alertmanager.monitoring.svc.cluster.localGet the Alertmanager URL by running these commands in the same shell: export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=alertmanager,app.kubernetes.io/instance=prometheus" -o jsonpath="{.items[0].metadata.name}") kubectl --namespace monitoring port-forward $POD_NAME 9093####################################################################################### WARNING: Persistence is disabled!!! You will lose your data when ########### the AlertManager pod is terminated. ############################################################################################################################################################################# WARNING: Pod Security Policy has been disabled by default since ########### it deprecated after k8s 1.25+. use ########### (index .Values "prometheus-node-exporter" "rbac" ########### . "pspEnabled") with (index .Values ########### "prometheus-node-exporter" "rbac" "pspAnnotations") ########### in case you still need it. ######################################################################################The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:prometheus-prometheus-pushgateway.monitoring.svc.cluster.localGet the PushGateway URL by running these commands in the same shell: export POD_NAME=$(kubectl get pods --namespace monitoring -l "app=prometheus-pushgateway,component=pushgateway" -o jsonpath="{.items[0].metadata.name}") kubectl --namespace monitoring port-forward $POD_NAME 9091For more information on running Prometheus, visit:https://prometheus.io/ ✅ 모니터링을 위한 Grafana메트릭 수집을 위한 Prometheus 를 설치 했는데! 단순 메트릭 정보만 있으면 운영하는 입장에서 가시적으로 와 닿지 않습니다.

0

[쿠버네티스 DevOps 구축] - Ingress Nginx Controller 설치하기

목차 [쿠버네티스 DevOps 구축] - OpenSearch 설치하기 [쿠버네티스 DevOps 구축] - Prometheus 와 Grafana 설치하기 [쿠버네티스 DevOps 구축] - Keycloak 설치하기 [쿠버네티스 DevOps 구축] - Ingress Nginx Controller 설치하기 [쿠버네티스 DevOps 구축] - Local PC 쿠버네티스 동적 프로비저닝을 위한 StorageClass 설치 [쿠버네티스 DevOps 구축] - Local PC 에 쿠버네티스 설치하기 참고 https://kubernetes.github.io/ingress-nginx/ https://github.com/nginxinc/kubernetes-ingress https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx https://www.nginx.com/blog/guide-to-choosing-ingress-controller-part-4-nginx-ingress-controller-options/ https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters Ingress Controller 설치현재 설치된 쿠버네티스에서는 Ingress 를 생성 하더라도 외부 요청을 Ingress 설정에 맞게 외부 요청을 내부 서비스로 전달해주는 Controller 가 따로 없습니다. 다시 말해, 규칙을 생성하더라도 규칙을 읽어서 적용시켜주는 모듈이 없는 상태입니다. 보통, 클라우스 서비스에서는 ALB 나 NLB 와 같은 서비스를 이용해 Ingress 정책을 읽어 Load Balancing 규칙을 적용해주는데, 개인 쿠버네티스 서비스에서는 저런 시스템을 기대하기 힘듦으로 저는 Nginx 에서 제공해주는 Ingress Controller 를 이용하려고 합니다. Helm 설치helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx --create-namespace

0

[쿠버네티스 DevOps 구축] - Keycloak 설치하기

목차 [쿠버네티스 DevOps 구축] - OpenSearch 설치하기 [쿠버네티스 DevOps 구축] - Prometheus 와 Grafana 설치하기 [쿠버네티스 DevOps 구축] - Keycloak 설치하기 [쿠버네티스 DevOps 구축] - Ingress Nginx Controller 설치하기 [쿠버네티스 DevOps 구축] - Local PC 쿠버네티스 동적 프로비저닝을 위한 StorageClass 설치 [쿠버네티스 DevOps 구축] - Local PC 에 쿠버네티스 설치하기 🔎 SSO 를 위한 Keycloak보통 DevOps 시스템을 구축하게 되면 각 시스템 마다 접근을 위한 계정 관리를 해줘야 합니다. 즉, N 개의 관리 시스템을 설치하게 되면 N 개의 계정이 필요합니다. 계정이 너무 많아지면 사용하는 입장에서도 관리하는 입장에서도 너무 복잡해져서 보통, 한 서비스 가입을 통해 모든 시스템에 접근할 수 있는 SSO 를 많이들 구축합니다. 저는 일반적으로 많이 사용하는 OpenSource 인 KeyCloak 을 이용해 쿠버네티스 위에 올라가는 서비스에 대한 SSO 를 구축하려고 합니다. ✅ Helm 을 이용한 KeyCloak 설치 참고 https://artifacthub.io/packages/helm/bitnami/keycloak # Helm Repo 추가helm repo add keycloak https://charts.bitnami.com/bitnami# Helm Default Chart 내려받기helm show values keycloak/keycloak >> values-keycloak.yaml# Keycloak 설치 helm upgrade --install -f ./values-keycloak.yaml keycloak keycloak/keycloak -n auth --create-namespace

0

[쿠버네티스 DevOps 구축] - Local PC 쿠버네티스 동적 프로비저닝을 위한 StorageClass 설치

목차 [쿠버네티스 DevOps 구축] - OpenSearch 설치하기 [쿠버네티스 DevOps 구축] - Prometheus 와 Grafana 설치하기 [쿠버네티스 DevOps 구축] - Keycloak 설치하기 [쿠버네티스 DevOps 구축] - Ingress Nginx Controller 설치하기 [쿠버네티스 DevOps 구축] - Local PC 쿠버네티스 동적 프로비저닝을 위한 StorageClass 설치 [쿠버네티스 DevOps 구축] - Local PC 에 쿠버네티스 설치하기 참고 https://github.com/rancher/local-path-provisioner 🔎 로컬 쿠버네티스 동적 프로비저닝로컬 쿠버네티스 환경에서는 기본적으로 동적 PV 프로비저닝을 지원하지 않습니다. 다시 말해, 사용자가 직접 PV 를 생성한 후 PVC 에 수동으로 PV 를 연결해야 합니다. EKS 에서는 CSI 드라이버를 통해 동적 프로비저닝을 제공하는데, 로컬 환경에서 동일한 기능을 제공해주는 플러그인을 찾다가 local-path-provisioner 를 발견했습니다. 1. local-path-provisioner 설치아래 명령어를 사용해 local-path-provisioner를 설치합니다.

0

[쿠버네티스 DevOps 구축] - Local PC 에 쿠버네티스 설치하기

목차 [쿠버네티스 DevOps 구축] - OpenSearch 설치하기 [쿠버네티스 DevOps 구축] - Prometheus 와 Grafana 설치하기 [쿠버네티스 DevOps 구축] - Keycloak 설치하기 [쿠버네티스 DevOps 구축] - Ingress Nginx Controller 설치하기 [쿠버네티스 DevOps 구축] - Local PC 쿠버네티스 동적 프로비저닝을 위한 StorageClass 설치 [쿠버네티스 DevOps 구축] - Local PC 에 쿠버네티스 설치하기 참고 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ https://cocococo.tistory.com/entry/k8s-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-kubeadm-kubelet-%EB%B0%8F-kubectl-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95 https://jongsky.tistory.com/112 https://www.youtube.com/watch?v=Wr6nrBRqYYE 📝 회고Vitality 팀에 있을때 EKS 로 구축된 시스템을 운영했었습니다. 지금은 해당 팀이 해체 되면서 운영하고 있지는 않지만 그때 내부적으로 진행했던 프로젝트들의 기억을 되살리고자 포스트로 남기려고 합니다. 🤔 쿠버네티스 운영환경 선택지속적으로 쿠버네티스 환경을 운영도 하면서 공부도 하고 싶어 여러가지 환경을 검토해봤는데, EKS 는 일단 컨트롤 플레인 자체만으로도 한달에 7만원 정도가 나와 Pass (너무 비싸 😭), 로컬 PC 에 Minikube 를 이용하는 방법은 노트북을 너무 핫하게 만드는 방법이라 Pass 요즘 알리에서 미니 PC 가 싸게 풀리고 있고 시스템 초기 구입 비용 빼면 운용하는데는 매월 전기세만 내면 돼 크게 부담이 안될 것 같아 미니 PC 를 이용한 서버를 구축하기로 했습니다.

0

Oracle - 파티셔닝 활용

Oracle 파티셔닝 활용 오라클 파티셔닝을 활용하여 대용량 테이블의 성능과 관리 효율성을 향상시키는 방법을 다룹니다. 파티셔닝은 대용량 테이블과 인덱스를 더 작고 관리하기 쉬운 조각으로 나누는 기법입니다. 쿼리 성능 향상, 데이터 관리 개선, 가용성 향상 등 다양한 이점을 제공합니다. Range 파티션날짜나 숫자 범위로 파티션을 나눕니다. -- Range 파티션 생성CREATE TABLE sales ( sale_id NUMBER, sale_date DATE, customer_id NUMBER, amount NUMBER)PARTITION BY RANGE (sale_date) ( PARTITION p_2024_q1 VALUES LESS THAN (TO_DATE('2024-04-01', 'YYYY-MM-DD')), PARTITION p_2024_q2 VALUES LESS THAN (TO_DATE('2024-07-01', 'YYYY-MM-DD')), PARTITION p_2024_q3 VALUES LESS THAN (TO_DATE('2024-10-01', 'YYYY-MM-DD')), PARTITION p_2024_q4 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')), PARTITION p_max VALUES LESS THAN (MAXVALUE));-- 월별 파티션CREATE TABLE orders ( order_id NUMBER, order_date DATE, customer_id NUMBER)PARTITION BY RANGE (order_date)INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))( PARTITION p_initial VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))); List 파티션특정 값 목록으로 파티션을 나눕니다. -- List 파티션CREATE TABLE employees_regional ( employee_id NUMBER, first_name VARCHAR2(50), last_name VARCHAR2(50), country_code VARCHAR2(2))PARTITION BY LIST (country_code) ( PARTITION p_asia VALUES ('KR', 'JP', 'CN', 'TH'), PARTITION p_europe VALUES ('UK', 'FR', 'DE', 'IT'), PARTITION p_america VALUES ('US', 'CA', 'MX', 'BR'), PARTITION p_other VALUES (DEFAULT));

0

Oracle - 힌트 사용 전략

Oracle 힌트 사용 전략 오라클 힌트를 효과적으로 사용하여 쿼리 실행 계획을 제어하는 방법을 다룹니다. 힌트는 옵티마이저에게 특정 실행 방법을 지시하는 강력한 도구입니다. 하지만 잘못 사용하면 오히려 성능을 저하시킬 수 있으므로 신중하게 사용해야 합니다. 자주 사용하는 힌트PARALLEL 힌트대용량 데이터 처리에 효과적입니다. -- PARALLEL 힌트 (대용량 처리)SELECT /*+ PARALLEL(e, 4) */ *FROM employees eWHERE hire_date >= DATE '2020-01-01';-- 테이블별 병렬도 지정SELECT /*+ PARALLEL(e, 4) PARALLEL(d, 2) */ e.employee_id, d.department_nameFROM employees e, departments dWHERE e.department_id = d.department_id;-- AUTO 병렬도SELECT /*+ PARALLEL(e, AUTO) */ *FROM employees e;-- 주의사항:-- - CPU 리소스 집약적-- - 배치 작업에 적합-- - OLTP 환경에서는 신중하게 사용 APPEND 힌트Direct Path Insert로 성능 향상.

0

Oracle - 성능 모니터링

Oracle 성능 모니터링 오라클 데이터베이스의 성능을 모니터링하고 문제를 진단하는 방법을 다룹니다. 성능 모니터링은 데이터베이스의 현재 상태를 파악하고 병목 지점을 찾아 개선하는 데 필수적입니다. 다양한 모니터링 도구와 기법을 활용하여 시스템 성능을 지속적으로 관리할 수 있습니다. AWR (Automatic Workload Repository)AWR 스냅샷 관리-- 수동 스냅샷 생성EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;-- 스냅샷 목록 확인SELECT snap_id, begin_interval_time, end_interval_timeFROM dba_hist_snapshotORDER BY snap_id DESCFETCH FIRST 10 ROWS ONLY;-- AWR 리포트 생성 (SQL*Plus)@$ORACLE_HOME/rdbms/admin/awrrpt.sql-- AWR 리포트 생성 (PL/SQL)SELECT outputFROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT( l_dbid => (SELECT dbid FROM v$database), l_inst_num => 1, l_bid => 100, -- 시작 스냅샷 ID l_eid => 110 -- 종료 스냅샷 ID)); AWR 설정 변경-- AWR 수집 간격 및 보관 기간 변경EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS( retention => 43200, -- 30일 (분 단위) interval => 30 -- 30분 간격);-- 현재 설정 확인SELECT snap_interval, retentionFROM dba_hist_wr_control; 대기 이벤트 분석

0

Oracle - SQL 재작성 기법

Oracle SQL 재작성 기법 비효율적인 SQL을 효율적으로 재작성하여 성능을 개선하는 다양한 기법을 다룹니다. SQL 재작성은 동일한 결과를 얻으면서도 더 빠르게 실행되도록 쿼리를 변경하는 기법입니다. 옵티마이저가 최적화하기 어려운 경우 직접 SQL을 개선할 수 있습니다. UNION ALL vs UNION-- UNION ALL (중복 제거 불필요시)SELECT employee_id, last_name FROM employees WHERE department_id = 10UNION ALLSELECT employee_id, last_name FROM employees WHERE department_id = 20;-- UNION (중복 제거 필요시만)SELECT employee_id FROM employees WHERE department_id = 10UNIONSELECT employee_id FROM employees WHERE department_id = 20;-- 성능 차이:-- UNION ALL: 정렬 없음, 빠름-- UNION: 정렬 + 중복 제거, 느림 COUNT 최적화-- 나쁜 예: COUNT(*)에 불필요한 조건SELECT COUNT(*) FROM employees WHERE salary > 0;-- 문제: salary는 NOT NULL이므로 불필요한 조건-- 좋은 예: 필요한 조건만SELECT COUNT(*) FROM employees WHERE department_id = 10;-- 인덱스 활용SELECT COUNT(*) FROM employees;-- 인덱스가 있으면 테이블 스캔 없이 빠르게 계산-- 존재 여부만 확인할 때-- 나쁜 예SELECT COUNT(*) FROM employees WHERE department_id = 10;-- 좋은 예SELECT CASE WHEN EXISTS ( SELECT 1 FROM employees WHERE department_id = 10) THEN 1 ELSE 0 END FROM DUAL; DISTINCT 최적화-- 나쁜 예: 불필요한 DISTINCTSELECT DISTINCT e.employee_id, e.last_nameFROM employees e, departments dWHERE e.department_id = d.department_id;-- 문제: employee_id는 PK이므로 DISTINCT 불필요-- 좋은 예: DISTINCT 제거SELECT e.employee_id, e.last_nameFROM employees e, departments dWHERE e.department_id = d.department_id;-- EXISTS로 대체-- 나쁜 예: DISTINCT로 중복 제거SELECT DISTINCT e.employee_id, e.last_nameFROM employees e, job_history jhWHERE e.employee_id = jh.employee_id;-- 좋은 예: EXISTS 사용SELECT e.employee_id, e.last_nameFROM employees eWHERE EXISTS ( SELECT 1 FROM job_history jh WHERE jh.employee_id = e.employee_id);

0

Oracle - 통계 정보 관리

Oracle 통계 정보 관리 오라클 옵티마이저가 최적의 실행 계획을 수립할 수 있도록 통계 정보를 관리하는 방법을 다룹니다. 통계 정보는 옵티마이저가 실행 계획을 결정하는 데 사용하는 핵심 데이터입니다. 정확하고 최신의 통계 정보를 유지하는 것이 쿼리 성능 최적화의 기본입니다. 통계 수집테이블 통계 수집-- 테이블 통계 수집EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => 'HR', tabname => 'EMPLOYEES', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE);-- 파라미터 설명:-- ownname: 스키마 이름-- tabname: 테이블 이름-- estimate_percent: 샘플링 비율 (AUTO_SAMPLE_SIZE 권장)-- method_opt: 히스토그램 수집 방법-- cascade: 인덱스 통계도 함께 수집 스키마 전체 통계 수집-- 스키마 전체 통계 수집EXEC DBMS_STATS.GATHER_SCHEMA_STATS( ownname => 'HR', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, cascade => TRUE, degree => 4 -- 병렬도);-- 데이터베이스 전체 통계 수집EXEC DBMS_STATS.GATHER_DATABASE_STATS( estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, cascade => TRUE, degree => DBMS_STATS.DEFAULT_DEGREE); 시스템 통계 수집

0

Oracle - 서브쿼리 최적화

Oracle 서브쿼리 최적화 오라클에서 서브쿼리를 효율적으로 작성하고 최적화하는 방법을 다룹니다. 서브쿼리는 SQL의 강력한 기능이지만, 잘못 사용하면 성능 문제를 일으킬 수 있습니다. 적절한 서브쿼리 유형과 최적화 기법을 선택하는 것이 중요합니다. EXISTS vs INEXISTS 사용외부 쿼리가 큰 경우 효과적입니다. -- EXISTS 사용 (외부 쿼리가 큰 경우)SELECT * FROM employees eWHERE EXISTS ( SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.location_id = 1700);-- 특징:-- - 첫 번째 일치하는 행을 찾으면 즉시 반환-- - NULL 값 처리에 안전-- - Correlated 서브쿼리로 실행 IN 사용서브쿼리 결과가 작은 경우 효과적입니다.

0

Oracle - 조인 최적화

Oracle 조인 최적화 오라클에서 효율적인 조인 방법을 선택하고 최적화하는 방법을 다룹니다. 조인은 여러 테이블의 데이터를 결합하는 중요한 연산입니다. 적절한 조인 방식과 순서를 선택하면 쿼리 성능을 크게 향상시킬 수 있습니다. 조인 방식 선택Nested Loop Join작은 테이블과 인덱스가 있을 때 효과적입니다. -- NESTED LOOP JOIN (작은 테이블 + 인덱스)SELECT /*+ USE_NL(e d) */ e.*, d.department_nameFROM employees e, departments dWHERE e.department_id = d.department_id AND e.employee_id = 100;-- 특징:-- - 작은 결과 집합에 유리-- - 선행 테이블의 각 행마다 후행 테이블 인덱스 검색-- - OLTP 환경에 적합 Hash Join큰 테이블 간 조인에 효과적입니다.

0

Oracle - 인덱스 힌트 사용법

Oracle 인덱스 힌트 사용법 오라클 옵티마이저가 최적의 인덱스를 선택하지 못할 때, 힌트를 사용하여 특정 인덱스 사용을 유도하는 방법을 다룹니다. 인덱스 힌트는 옵티마이저에게 특정 인덱스를 사용하도록 지시하는 강력한 도구입니다. 하지만 남용하면 오히려 성능을 저하시킬 수 있으므로 신중하게 사용해야 합니다. INDEX 힌트 - 특정 인덱스 사용 강제-- 기본 INDEX 힌트 사용SELECT /*+ INDEX(e idx_emp_dept) */ *FROM employees eWHERE department_id = 10;-- 여러 테이블에 각각 인덱스 힌트 적용SELECT /*+ INDEX(e idx_emp_dept) INDEX(d idx_dept_loc) */ e.employee_id, e.last_name, d.department_nameFROM employees e, departments dWHERE e.department_id = d.department_id AND d.location_id = 1700;-- 복합 인덱스 사용 강제SELECT /*+ INDEX(e idx_emp_dept_sal) */ *FROM employees eWHERE department_id = 10 AND salary > 5000; INDEX_DESC 힌트 - 인덱스 역순 스캔-- 인덱스를 역순으로 스캔 (내림차순 정렬 효과)SELECT /*+ INDEX_DESC(e idx_emp_salary) */ *FROM employees eWHERE salary > 5000ORDER BY salary DESC;-- 최근 데이터 조회 시 유용SELECT /*+ INDEX_DESC(o idx_order_date) */ *FROM orders oWHERE order_date >= TRUNC(SYSDATE) - 30ORDER BY order_date DESC; INDEX_FFS 힌트 - Fast Full Index Scan-- 테이블 액세스 없이 인덱스만으로 데이터 조회SELECT /*+ INDEX_FFS(e idx_emp_dept_sal) */ department_id, salaryFROM employees eWHERE department_id IS NOT NULL;-- COUNT 연산에 효과적SELECT /*+ INDEX_FFS(e idx_emp_dept) */ COUNT(*)FROM employees eWHERE department_id > 0;

0

Oracle - 인덱스 최적화

Oracle 인덱스 최적화 오라클 데이터베이스에서 인덱스를 효과적으로 생성하고 활용하는 방법을 다룹니다. 인덱스는 쿼리 성능을 크게 향상시킬 수 있는 중요한 데이터베이스 객체입니다. 적절한 인덱스 선택과 활용은 쿼리 튜닝의 핵심입니다. 적절한 인덱스 생성-- 단일 컬럼 인덱스CREATE INDEX idx_emp_dept ON employees(department_id);-- 복합 인덱스 (선택도가 높은 컬럼을 앞에)CREATE INDEX idx_emp_dept_sal ON employees(department_id, salary);-- 함수 기반 인덱스CREATE INDEX idx_upper_name ON employees(UPPER(last_name));-- 비트맵 인덱스 (Cardinality가 낮은 컬럼)CREATE BITMAP INDEX idx_gender ON employees(gender); 인덱스 사용 유도-- 나쁜 예: 인덱스 컬럼에 함수 사용SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';-- 좋은 예: 함수 기반 인덱스 사용 또는 검색값 변환SELECT * FROM employees WHERE last_name = UPPER('Smith');-- 나쁜 예: 인덱스 컬럼 변형SELECT * FROM employees WHERE salary * 12 > 100000;-- 좋은 예: 조건 값 변형SELECT * FROM employees WHERE salary > 100000 / 12; 인덱스 종류별 특징B-Tree 인덱스 (기본)

0

Oracle - 실행 계획 분석

Oracle 실행 계획 분석 오라클 쿼리의 실행 계획을 확인하고 분석하는 다양한 방법을 다룹니다. 실행 계획은 오라클 옵티마이저가 SQL 문을 실행하기 위해 선택한 작업 순서와 방법입니다. 효과적인 쿼리 튜닝을 위해서는 실행 계획을 정확히 읽고 분석할 수 있어야 합니다. EXPLAIN PLAN 사용-- 실행 계획 생성EXPLAIN PLAN FORSELECT * FROM employees WHERE department_id = 10;-- 실행 계획 확인SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);-- 상세 실행 계획 확인SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'ALLSTATS LAST')); AUTOTRACE 활용-- AUTOTRACE 활성화SET AUTOTRACE ON EXPLAIN;SET AUTOTRACE ON STATISTICS;SET AUTOTRACE TRACEONLY;-- 쿼리 실행SELECT * FROM employees WHERE salary > 10000;-- AUTOTRACE 비활성화SET AUTOTRACE OFF; SQL 모니터링-- SQL 모니터링 활성화 (11g 이상)SELECT /*+ MONITOR */ * FROM large_table WHERE condition = 'value';-- SQL 모니터 레포트 확인SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR( sql_id => 'sql_id_here', type => 'TEXT') FROM DUAL;