Oracle의 숨겨진 기능
SQL Server의 숨겨진 기능에 대한 답변과 질문이 즐거웠습니다.
오라클에 대해 알려줄 수 있습니까?
숨겨진 테이블, 내부 작업... 비밀 저장 프로시저, 유용성이 좋은 패키지...
이제 Apex는 모든 Oracle 데이터베이스의 일부이므로 Apex를 사용하지 않는 경우에도 다음과 같은 Apex 유틸리티 기능이 유용합니다.
SQL> declare
2 v_array apex_application_global.vc_arr2;
3 v_string varchar2(2000);
4 begin
5
6 -- Convert delimited string to array
7 v_array := apex_util.string_to_table('alpha,beta,gamma,delta', ',');
8 for i in 1..v_array.count
9 loop
10 dbms_output.put_line(v_array(i));
11 end loop;
12
13 -- Convert array to delimited string
14 v_string := apex_util.table_to_string(v_array,'|');
15 dbms_output.put_line(v_string);
16 end;
17 /
alpha
beta
gamma
delta
alpha|beta|gamma|delta
PL/SQL procedure successfully completed.
"전체 테이블 스캔이 항상 나쁜 것은 아닙니다.지수가 항상 좋은 것은 아닙니다."
인덱스 기반 액세스 방법은 작업 단위(일반적으로 논리적 읽기 단위)당 액세스되는 행의 측면에서 전체 검색보다 행 읽기 효율성이 떨어집니다.그러나 많은 도구가 전체 테이블 스캔을 비효율성의 신호로 해석합니다.
송장 테이블에서 수백 개의 송장을 읽고 작은 조회 테이블에서 지불 방법을 찾는 예를 들어 보겠습니다.인덱스를 사용하여 모든 송장에 대한 조회 테이블을 조사하는 것은 송장당 3~4개의 논리적 IO를 의미합니다.그러나 송장 데이터에서 해시 조인을 준비하기 위해 룩업 테이블을 전체 검색하려면 논리적 읽기가 몇 번만 필요할 수 있으며 해시 조인 자체는 거의 비용 없이 메모리에서 복잡해집니다.
그러나 많은 도구가 이를 보고 "전체 테이블 검색"을 확인하고 인덱스를 사용하도록 지시합니다.그렇게 하면 코드가 방금 조정되지 않았을 수 있습니다.
위의 예와 같이 인덱스에 대한 의존도가 지나치게 높으면 "Buffer Cache Hit Ratio"가 증가합니다.이것이 BCHR이 시스템 효율성의 예측 변수로서 대부분 무의미한 이유입니다.
카디널리티 힌트는 대부분 문서화되어 있지 않습니다.
explain plan for
select /*+ cardinality(@inner 5000) */ *
from (select /*+ qb_name(inner) */ * from dual)
/
select * from table(dbms_xplan.display)
/
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5000 | 10000 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
버퍼 캐시 적중률은 시스템 효율성의 예측 변수로서 사실상 의미가 없습니다.
Flashback Query를 사용하면 이전 시점의 테이블 데이터를 볼 수 있지만 특정 제한이 있습니다.
Select *
from my_table as of timestamp(timestamp '2008-12-01 15:21:13')
11g는 역사적 변화를 보다 강력하게 보존하는 것에 관한 완전히 새로운 기능 세트를 가지고 있습니다.
인덱스를 자주 재구성하는 것은 거의 항상 시간 낭비입니다.
wm_concat은 MySql group_concat처럼 작동하지만 문서화되어 있지 않습니다.
데이터 포함:
-car- -maker-
Corvette Chevy
Taurus Ford
Impala Chevy
Aveo Chevy
select wm_concat(car) Cars, maker from cars
group by maker
제공:
-Cars- -maker-
Corvette, Impala, Aveo Chevy
Taurus Ford
Overlaps 서술어가 문서화되어 있지 않습니다.
http://oraclesponge.wordpress.com/2008/06/12/the-overlaps-predicate/
방금 의사 열 Ora_rowSCN에 대해 알게 되었습니다.테이블을 설정하지 않으면 이 pcolumn은 블록 SCN을 제공합니다.이것은 응급 상황에 매우 유용할 수 있습니다. "이런, 이 테이블에 감사가 없습니다. 어제부터 누군가 데이터를 변경했는지 궁금합니다."
그러나 행 종속성이 설정된 테이블을 만드는 것이 더 좋습니다.그러면 마지막 변경 사항의 SCN이 모든 행에 표시됩니다.이렇게 하면 쿼리에 모든 열을 포함할 필요 없이 "편집 손실" 문제를 방지할 수 있습니다.
IOW, 앱이 사용자 수정을 위해 행을 잡을 때 Ora_rowscn도 선택합니다.그런 다음 사용자의 편집 내용을 게시할 때 where 절에 고유 키 외에 Ora_rowscn = v_rscn을 포함합니다.사용자가 해당 행을 잡은 이후 누군가가 해당 행을 터치한 경우(편집 손실이라고도 함), ora_rowscn이 변경되었기 때문에 업데이트는 0개의 행과 일치합니다.
아주 멋지다.
만약 당신이 가치를 얻게 된다면,PASSWORD
칼럼에 열DBA_USERS
암호를 몰라도 암호를 백업/복원할 수 있습니다.
ALTER USER xxx IDENTIFIED BY VALUES 'xxxx';
버퍼 캐시를 바이패스하고 직접 경로 읽기를 사용하여 디스크에서 직접 읽습니다.
alter session set "_serial_direct_read"=true;
테이블스페이스(9i) 또는 빠른 개체(10g+) 체크포인트를 발생시키므로 사용량이 많은 OLTP 시스템에서는 주의하십시오.
더 많은 문서화되지 않은 자료는 http://awads.net/wp/tag/undocumented/ 에서 찾을 수 있습니다.
경고:사용자의 책임 하에 사용하십시오.
이것이 숨겨진 것으로 간주되는지는 모르겠지만, 조정 중인 SQL 문에서 발생한 일을 신속하게 확인할 수 있는 방법을 보았을 때 매우 기뻤습니다.
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL;
SELECT * FROM TABLE(dbms_xplan.display_cursor( NULL, NULL, 'RUNSTATS_LAST'))
;
PLAN_TABLE_OUTPUT
-----------------------------------------------------
SQL_ID 5z36y0tq909a8, child number 0
-------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL
Plan hash value: 272002086
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
---------------------------------------------------------------------------------------------
| 1 | TABLE ACCESS FULL| DUAL | 1 | 1 | 1 |00:00:00.02 | 3 | 2 |
---------------------------------------------------------------------------------------------
12 rows selected.
위치:
- E-행은 추정된 행입니다.
- A-행은 실제 행입니다.
- A-Time은 실제 시간입니다.
- 버퍼는 실제 버퍼입니다.
예상 계획이 실제 실행과 규모에 따라 차이가 나는 경우에는 문제가 있다는 것을 알 수 있습니다.
숨겨진 기능은 아니지만 행 수준 보안이라고도 하는 FGAC(Finebeared-Access-Control)는 과거에 사용한 적이 있으며 구현의 효율성에 깊은 인상을 받았습니다.데이터를 보는 데 사용되는 응용 프로그램(SQL*Plus 및 웹 앱)에 관계없이 행이 다른 권한을 가진 사용자에게 노출되는 방식의 세분화를 제어할 수 있습니다.
내장된 전체 텍스트 인덱싱은 더 광범위하게 문서화되어 있지만 안정성 때문에 여전히 두드러집니다(MS-SQL 및 Oracle에서 유사한 데이터 샘플에서 전체 텍스트 인덱싱 열의 전체 재인덱스를 실행하기만 하면 속도 차이를 알 수 있습니다).
스냅샷 테이블.Oracle Lite에서도 사용할 수 있으며 자체 복제 메커니즘을 롤링하는 데 매우 유용합니다.
실제로 TOD에서 "Cursor" 유형의 변수를 바인딩한 다음 문에 사용하면 결과가 결과 그리드에 표시됩니다.
exec open :cur for select * from dual;
Q: Toad에서 커서로 저장된 것을 호출하는 방법은 무엇입니까?
A: 예: 커서, 패키지 이름 및 저장된 프로시저 이름으로 변경
declare cursor PCK_UTILS.typ_cursor;
begin
PCK_UTILS.spc_get_encodedstring(
'U',
10000002,
null,
'none',
cursor);
end;
모델 조항(Oracle 10g 이상에서 사용 가능)
문자열 집계를 위한 WM_CONCAT
스칼라 하위 쿼리 캐싱은 Oracle에서 가장 놀라운 기능 중 하나입니다.
-- my_function is NOT deterministic but it is cached!
select t.x, t.y, (select my_function(t.x) from dual)
from t
-- logically equivalent to this, uncached
select t.x, t.y, my_function(t.x) from t
위의 "캐싱" 하위 쿼리는 다음을 평가합니다.my_function(t.x)
의 고유 값당 한 번만t.x
동일한 파티션이 큰 경우t.x
가치, 이것은 당신의 쿼리 속도를 엄청나게 높일 것입니다, 설령 그렇다 하더라도.my_function
선언되지 않음DETERMINISTIC
설령 그렇다 하더라도DETERMINISTIC
값비싼 SQL -> PL/SQL 컨텍스트 스위치를 안전하게 사용할 수 있습니다.
물론, 만약에my_function
는 결정론적 함수가 아니므로 잘못된 결과로 이어질 수 있으므로 주의하십시오!
언급URL : https://stackoverflow.com/questions/381231/hidden-features-in-oracle
'bestsource' 카테고리의 다른 글
Javascript 패키지의 하위 폴더에서 가져오기 (0) | 2023.06.08 |
---|---|
R - 두 개의 데이터 프레임을 연결합니까? (0) | 2023.06.08 |
Oracle Apex를 사용하여 버전 관리 (0) | 2023.06.08 |
엑셀에서 VBA로 한 시트에서 다른 시트로 열을 복사하려면 어떻게 해야 합니까? (0) | 2023.06.08 |
역사 속에 묻혀 있는 깃 커밋을 어떻게 나눌 수 있습니까? (0) | 2023.06.03 |