일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- jsp
- ReactJS
- IntelliJ
- 맛집
- it
- Git
- devops
- linux
- ubuntu
- Spring Boot
- Web Server
- springboot
- tool
- elasticsearch
- javascript
- jenkins
- AWS
- Spring Batch
- Design Patterns
- Spring
- php
- laravel
- Oracle
- JVM
- MySQL
- db
- Gradle
- java
- redis
- 요리
- Today
- Total
목록Data Store (72)
아무거나
Redis 관련 내용 정리대표적인 구조Look Aside Cache (보편적으로 사용)Client -> Application -> Cache 에 데이터가 있으면 Cache 에서 가져옴 만약 없으면 DB 에서 데이터를 읽어오고 해당 데이터를 Cache 에 저장Write BackClient -> Application -> Cache 에 먼저 데이터를 저장하고 특정 시점마다 DB 에 저장이렇게 하면 DB 에 저장될 때 건별로 Insert 쿼리를 날리는 것 보다 한 번에 쿼리를 날리다보니 성능에 용이사용사례여러 서버들이 데이터를 공유할 때인증 토큰 등을 저장Ranking(Sorted Set)APIQueueRedis CollectionsStrings단일 KeyGET SET 멀티 KeyMSET ....MG..
Cache 적용 패턴 및 관리 전략 읽기 캐시 전략 Cache-Aside 캐시는 데이터베이스와 직접 연결되지 않고, 애플리케이션이 주체가 되며 보편적으로 많이 사용되는 캐시 전략, 읽기 요청에 적합 방식 (1) 캐시에 데이터가 존재하는지 확인 (2) 데이터가 존재하면 캐시 데이터 반환 (3) 데이터가 존재하지 않으면 애플리케이션에서 DB 에 데이터 요청 후 캐시에 저장하고 데이터를 반환 Read-Through 애플리케이션이 캐시를 직접 바라본다. 즉, 캐시가 주 데이터스토어로 인식되며 데이터베이스로 동기화하는 몫은 캐시에 위임, 읽기 요청에 적합 최초 호출 시 캐시에 데이터가 없으므로 첫 요청시 캐시가 갱신되게 대응 (Ex: Cache Warm up 스케쥴 작업 등..) 방식 (1) 캐시에 데이터 요청 ..
파티션 (partition) 대량의 데이터를 테이블에 저장할 때, 물리적으로 별도의 테이블로 분리해서 저장시키는 기법 (단, mysql 내부적으로 분리되어 처리되기 때문에, 파티션이 얼마나 있든 사용자는 하나의 테이블로 보인다.) 특정 DML과 Query의 성능을 향상시키고, 주로 데이터가 실시간으로 쌓이는 데이터베이스 환경에서 효율적이다. 특히 Full Scan에서 데이터의 접근 범위를 줄여 성능 향상을 가져올 수 있습니다. 물리적인 파티셔닝으로 인해 전체 데이터의 훼손 가능성이 줄어들며, 각 파티션 별로 독립적으로 백업하고 복구할 수 있다. 다만, 테이블 간 Join이 일어날 경우 비용이 증가 하며 테이블과 인덱스를 별도로 파티셔닝 할 수는 없다. 파티션 종류 기본적으로 파티셔닝은 수평 분할과 수직 ..
ORA-01795 항목의 수가 1,000개 넘어갈 경우 발생하는 에러 IN 구문 사용시 항목의 수가 1,000개가 넘어가면 에러가 발생한다. 해결1: 복수 컬럼 SubQuery 사용 WHERE (0, 비교컬럼) IN ((0, 조건1), (0, 조건2), (0, 조건3), ...) 해결2: Mybatis 기준 foreach 구문을 사용하는 경우 WHERE (1, A1.PROD_NO) IN (1, #{prodNo})
1. 12g 이전 버전 SELECT ROW_NUM, LOG_NO, SVC_NM, DB_NM, TBL_NM, PROCDR_NM, CALL_URL, CALL_MTHD_SP_VAL, CALL_PARA_VAL, EXEC_TME, LOG_DESC, INPT_DM FROM ( SELECT ROW_NUMBER () OVER (ORDER BY INPT_DM DESC) AS ROW_NUM, LOG_NO, SVC_NM, DB_NM, TBL_NM, PROCDR_NM, CALL_URL, CALL_MTHD_SP_VAL, CALL_PARA_VAL, EXEC_TME, LOG_DESC, INPT_DM FROM TB_CM_OP_L ) WHERE ROW_NUM BETWEEN ((NVL(1, 0)-1) * 10 + 1) AND (NVL(..
MySQL에서의 인덱스: insert, update, delete의 성능을 희생하고 select의 성능을 향상(update, delete, insert의 행위가 느린것이며 해당 쿼리를 실행하기 위해 데이터를 조회하는 것은 인덱스가 존재하면 빠름) B-Tree Index(=Balanced Tree) 설계기준 개수는 3~4개가 적당 인덱스의 키는 길면 길수록 성능이 저하(인덱스 키란 데이터타입(ex: varchar, int ..)의 크기로 이해하면 되고, InnoDB Storage Engine에서 전체 인덱스 키 크기는 767byte이다.) 1개의 컬럼만 Index를 적용시 카디널리티(=Cardinality)가 가장 높은 것으로 잡는게 좋음(인덱스로 최대한 효율을 내기 위해서는 많은 부분을 걸러내야 한다. ..
OVER 함수 및 PARTITION BY 사용법 예제 데이터 예제 쿼리 반환되는 행의 수를 계산하여 줄인다. (GROUP BY) SELECT EXEC_TME, COUNT(*) AS LOG_CNT FROM TB_CM_OP_L GROUP BY EXEC_TME; 모든 행을 분할, 반환 된 행의 수에 영향을 미치지 않고 결과가 누적되어 계산되는 방식 주로 누적집계나 누적합계에 많이 사용됨 -> 1번 row에 3이 1개, 3번 row에 3이 또 있으므로 2개로 표시 즉, 값이 누적되어 계산됨 (PARTITION BY) SELECT ROW_NUMBER() OVER (PARTITION BY EXEC_TME ORDER BY INPT_DM DESC) AS ORDER_INPT_DM_LOG FROM TB_CM_OP_L; 5..
실행계획(SQLDeveloper 툴에서는 단축키 F10) -- 1. 실행계획에 대한 정보를 저장 (실제 조회 쿼리가 실행되는게 아님) EXPLAIN PLAN SET STATEMENT_ID = 'EXPLAIN_TEST' INTO PLAN_TABLE FOR SELECT * FROM TEST_TABLE; -- 2. 실행계획 테이블에 저장된 정보를 조회하여 해당 정보를 확인 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'EXPLAIN_GDS', 'ALL'))
테이블 복사 복사할 테이블이 존재하지 않을경우 CREATE TABLE [대상 테이블명] SELECT * FROM [원본 테이블명] 복사할 테이블이 존재하는 경우 INSERT INTO [대상 테이블명] SELECT * FROM [원본 테이블명] 다른 데이터베이스 간의 테이블 값 복사 INSERT INTO [대상 데이터베이스명].[대상 테이블명] SELECT * FROM [원본 데이터베이스명].[원본테이블명] 중복 레코드 에러가 생길 겨우 예외처리 방법 // ignore 처리 INSERT ignore INTO .....
스칼라 서브쿼리 SQL에서 단일 값을 스칼라(=Scala)값 이라고 표현한다. 즉, 스칼라 서브쿼리(=Scala Subquery)는 SELECT절에 오는 서브쿼리로 결과값으로 1행만 반환하는것을 말한다. -- SELECT문 안에 SELECT문으로 스칼라 서브쿼리 사용 SELECT board_title, ( SELECT board_contents FROM tb_board AS a WHERE a.board_no = b.board_no ) AS board_contents, board_no FROM tb_board AS b WHERE board_contents like '%contents%';