AI Vector Search #2 - HNSW 벡터 인덱스
·
Oracle/Vector
AI Vector Search #1 - 기본 기능AI Vector Search #2 - HNSW 벡터 인덱스AI Vector Search #3 - IVF 벡터 인덱스 HNSW(Navigable Small World Graph) 벡터 인덱스는 계층적 탐색이 가능한 In-Memory Neighbor Graph 벡터 인덱스의 한 형태로 벡터 근사 유사도 검색에 효율적인 인덱스입니다. 이 글에서는 HNSW 벡터 인덱스의 구조와 동작에 대해 간단히 살펴보겠습니다.  테스트 버전은 아래와 같습니다.-- 1SELECT version_full FROM product_component_version;VERSION_FULL------------23.4.0.24.051 row selected. 테스트를 위해 아래와 같이 테..
AI Vector Search #1 - 기본 기능
·
Oracle/Vector
AI Vector Search #1 - 기본 기능AI Vector Search #2 - HNSW 벡터 인덱스AI Vector Search #3 - IVF 벡터 인덱스 Oracle 23ai에 AI Vector Search 기능이 추가되었습니다. AI Vector Search는 AI 워크로드를 위해 설계되었으며 키워드가 아닌 의미론에 기반하여 데이터를 조회합니다. 이 글에서는 AI Vector Search의 기본 기능에 대해 간단히 살펴보겠습니다. ML을 사용한 벡터 생성과 관련된 내용은 Oracle AI Vector Search User's Guide를 참고하세요. 테스트 버전은 아래와 같습니다.-- 1SELECT version_full FROM product_component_version;VERSION..
ALTER SYSTEM FLUSH LOCAL
·
Oracle/Administration
Oracle 23ai 문서의 ALTER SYSTEM 문 내용에 아래와 같이 RAC 환경에서 FLUSH할 대상을 LOCAL과 GLOBAL로 지정할 수 있는 구문이 추가되었습니다.ALTER SYSTEM FLUSH { BUFFER_CACHE | FLASH_CACHE } [ LOCAL | GLOBAL ]; 흥미로운 사실은 기본값이 LOCAL이 아닌 GLOBAL이라는 점입니다. 실제로 특정 노드에서 ALTER SYSTEM FLUSH BUFFER_CACHE 문을 수행하면 RAC 전체 노드의 Buffer Cache가 Flush됩니다.The FLUSH BUFFER_CACHE clause lets you clear all data from the buffer cache in the system global area (S..
ROWNUM을 사용하는 FETCH FIRST 변환
·
Oracle/Performance
Oracle 23ai(23.4)부터 ROW LIMITING 절을 사용한 쿼리가 분석 함수가 아닌 ROWNUM 슈도 칼럼을 사용하는 쿼리로 변환됩니다. 아래는 쿼리 변환과 관련된 Fix Control입니다.-- 1SELECT bugno, value, sql_feature, description, optimizer_feature_enable FROM v$system_fix_control WHERE bugno = 35915968; BUGNO VALUE SQL_FEATURE DESCRIPTION OPTIMIZER_FEATURE_ENABLE-------- ----- ----------------------------- ---..
CURSOR_SHARING_FORCE 힌트
·
Oracle/Performance
Oracle 23ai(23.4)에 CURSOR_SHARING_FORCE 힌트가 추가되었습니다. CURSOR_SHARING_FORCE 힌트를 사용하면 구문 레벨에서 Cursor Sharing 기능을 Force로 설정할 수 있습니다.-- 1SELECT name, inverse, target_level, version FROM v$sql_hint WHERE name IN ('CURSOR_SHARING_EXACT', 'CURSOR_SHARING_FORCE');NAME INVERSE TARGET_LEVEL VERSION-------------------- -------------------- ------------ -------CURSOR_SHARING_EXA..
Interval 값을 초로 변환
·
Oracle/SQL
Oracle은 Interval 값을 초로 변환할 때 아래와 같이 다소 복잡한 계산식을 사용해야 합니다.-- 1SELECT ts2 - ts1 AS int , EXTRACT (DAY FROM ts2 - ts1) * 60 * 60 * 24 + EXTRACT (HOUR FROM ts2 - ts1) * 60 * 60 + EXTRACT (MINUTE FROM ts2 - ts1) * 60 + EXTRACT (SECOND FROM ts2 - ts1) AS sec FROM (SELECT TIMESTAMP '2050-01-01 00:00:00.000000000' AS ts1 , TIMESTAMP '2050-02-01 00:00:00.123456789' AS ts..
바인드 변수 값 조회
·
Oracle/Performance
2018년 11월 19일에 작성한 "바인드 변수 값 조회" 글을 보완한 글입니다. Oracle 데이터베이스는 V$SQL_BIND_CAPTURE 뷰, V$SQL 뷰의 bind_data 칼럼, V$SQL_PLAN 뷰의 other_xml 칼럼, V$SQL_MONITOR 뷰의 binds_xml 칼럼 등에 바인드 변수 관련 데이터를 저장합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 1DROP TABLE t1 PURGE;CREATE TABLE t1 (c1, c2, c3, c4) ASSELECT 1, 'A', DATE '2050-01-01', TIMESTAMP '2050-01-01 00:00:00.123456' FROM DUAL; 아래와 같이 다양한 데이터 타입의 바인드 변수를 사용한 쿼리를 수행하..
현재 세션 SERIAL 번호 조회
·
Oracle/SQL
SYS_CONTEXT 함수는 현재 세션의 SERIAL 번호를 조회할 수 있는 파라미터를 제공하지 않습니다. 아래와 같이 DBMS_DEBUG_JDWP 패키지의 CURRENT_SESSION_SERIAL 함수를 사용하면 현재 세션의 SERIAL 번호를 조회할 수 있습니다.SELECT inst_id , sid , serial# , DBMS_DEBUG_JDWP.CURRENT_SESSION_ID AS current_session_id , DBMS_DEBUG_JDWP.CURRENT_SESSION_SERIAL AS current_session_serial FROM gv$session WHERE inst_id = SYS_CONTEXT ('USERENV', 'INSTANCE') AND s..
JSON_TRANSFORM 함수 기능 개선
·
Oracle/JSON
오라클 23ai에서 JSON_TRANSFORM 함수의 기능이 대폭 개선되었습니다. 이 글에서 여러 개선 기능 중 산술 연산(arithmetic operation)에 대해 살펴보겠습니다. 테스트 버전은 아래와 같습니다.-- 1SELECT version_full FROM product_component_version; VERSION_FULL------------23.3.0.23.09 1 row selected. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 2DROP TABLE t1 PURGE;CREATE TABLE t1 (c1 JSON); INSERT INTO t1 VALUES ('{ "instId":1, "statList":[ {"statId":1,"valueList":[..
JSON PASSING 절 개선
·
Oracle/JSON
오라클 23ai에서 다수의 바인드 변수를 사용할 수 있게  JSON PASSING 절의 기능이 개선되었습니다. 이번 글에서 관련 내용을 살펴보겠습니다. 테스트 버전은 아래와 같습니다.-- 1SELECT version_full FROM product_component_version;VERSION_FULL------------23.3.0.23.091 row selected. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다.-- 2DROP TABLE t1 PURGE;CREATE TABLE t1 (c1 JSON);INSERT INTO t1 VALUES ('{ "instId":1, "statList":[ {"statId":1,"valueList":[{"type":"MIN","value":..
DBMS_SESSION.SLEEP 프로시저 정밀도
·
Oracle/PLSQL
DBMS_SESSION.SLEEP 프로시저의 정밀도는 1/100 초입니다. 정밀도가 1/1000 초(ms)인 Thread.Sleep 메서드 (Java.Lang)의 1/10 수준으로 낮은 정밀도로 인해 정확한 스케쥴링을 구현하기 어렵습니다.Amount of time, in seconds, to suspend the session. The smallest increment can be entered in hundredths of a second; for example, 1.95 is a legal time value. 특히 주의할 점은 DBMS_SESSION.SEELP 프로시저의 입력 값을 반올림됨으로써 대기 시간이 증가할 수 있다는 것입니다. 아래는 DBMS_SESSION.SEELP 프로시저를 테스트한 결..
파티셔닝을 통한 GC 경합 해소
·
Oracle/Performance
예전에 작성한 Right Growing Index 경합 해소 글에서 인스턴스 ID의 가상 칼럼을 서브 파티션 키로 사용해 GC 경합을 해소하는 방법을 소개했습니다. 이 방법은 아래와 같이 이미 서브 파티션을 생성한 경우에는 사용할 수 없습니다. 이번 글에서 다중 칼럼 리스트 파티션을 사용해 GC 경합을 해소하는 방법을 살펴보겠습니다.-- 1CREATE TABLE t1 ( dt DATE , id NUMBER , vl NUMBER)PARTITION BY RANGE (dt)SUBPARTITION BY HASH (id) SUBPARTITION TEMPLATE ( SUBPARTITION sp_1 , SUBPARTITION sp_2) ( PARTITION p_20240101 VALUES LES..