'분류 전체보기'에 해당되는 글 108건
- 2014.11.17 자바스크립트에서 replace를 replaceAll 처럼 사용하기
- 2014.11.05 ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다
- 2014.10.17 [APACHE][PHP] 윈도우에 64bit 아파치 설치 및 PHP 연동
- 2014.09.25 tbadmin을 이용하여 excel 파일에 입력된 데이터를 import 해보자
- 2014.09.25 공백 구분자로 텍스트 자르기
- 2014.09.24 특수문자 기준 문자열 자르기 문의 드립니다~
- 2014.09.12 웹표준에서 table height 100% 적용 안되는 경우 해결법 입니다.
- 2014.08.27 윈도우7에 오라클 11g 클라이언트 설치
- 2014.05.29 프로시저 검색하기
- 2014.02.20 오라클 힌트 정리표
- 2014.02.20 [오라클] TABLE ANALYZE 하기
- 2014.02.18 opacity IE 6 ~ 8 대비용
- 2014.02.13 자바스크립트로 class 지정 바꾸기
- 2013.12.06 readOnly 만 스타일적용
- 2013.09.12 숫자/문자 체크
자바스크립트에서 replaceAll 은 없다.
정규식을 이용하여 대상 스트링에서 모든 부분을 수정해줄 수 있다.
ex) str.replace("#",""); -> #를 공백으로 변경한다.
하지만 첫번째 # 만 공백으로 변경하고 나머지는 변경이 되지 않는다.
str.replace(/#/gi, ""); -> #를 감싼 따옴표를 슬래시로 대체하고 뒤에 gi 를 붙이면
replaceAll 과 같은 결과를 볼 수 있다.
좋은팁^^
출처 : http://blog.naver.com/banhong?Redirect=Log&logNo=143384991
[출처] 자바스크립트에서 replace를 replaceAll 처럼 사용하기|작성자 감자
[출처] http://show.ideatree.kr/pages/index.php3?board_content_idx=1003
[해결방법] ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다
1.OJDBC 버전이 Release 2 인지 확인
2.CLOB 처리시 PreparedStatement를 사용할 경우,
2-1.
먼저 대상 clob field를 INSERT INTO TEST_TABLE(CLOBFIELD)VALUES(empty_clob()) 혹은
UPDATE TEST_TABLE SET CLOBFIELD = empty_clob WHERE idx=999 와 같이 empty_clob()으로
초기화 시킨다.
2-2.
다른 사용자가 CLOB UPDATE 중간에 변경을 못하도록
CLOB Row를 먼저 SELECT~FOR UPDATE 로 잠그고,
SELECT ~FOR UPDATE로 부터 Clob Field값을 얻어서 java.io.Writer 객체를 생성한다.
clobField = rs.getClob(0);
Writer writer = clobField.getCharacterOutputStream();
2-3.
그리고, 입력할 clob데이타로 부터 java.io.Reader 객체를 생성한다.
Reader reader = new CharArrayReader(clobInput.toCharArray());
2-4.
버퍼를 만들어서 reader를 읽어가면서 writer에 읽은만큼 써준다.
char[] buffer = new char[1024];
while( (read = reader.read(buffer, 0, 1024) ) != -1 )
{
writer.write(buffer, 0, read); //reader를 죽~ 읽어가면서 써준다.
}
reader.close();
writer.close();
참고 : http://ideaargo.phps.kr/tc/180
아래는 위의 링크를 따라하면서 필자에게 맞게 조금 수정하고 추가한것.
설치환경 - window server 2008 64bit
1. Visual C++ Redistributable for Visual Studio 2012 설치
경로 : http://www.microsoft.com/en-us/download/details.aspx?id=30679
파일 : vcredist_x64.exe
apache v11, php v11 버전들은 Visual C++ Redistributable for Visual Studio 2012 해당 프로그램 필요하니 미리 설치
2. Apache 64bit 설치
경로 : http://httpd.apache.org/download.cgi
파일 : httpd-2.4.7-win64-VC11.zip
압축을 푼후 원하는 폴더에 Apache24폴더를 복사
(보통 C:\ 나 C:\Program Files를 많이 애용)
cmd 실행시킨후
cd C:\Program Files\Apache24\bin
httpd.exe -k install
명령을 실행하여 아파치를 서비스에 등록
3. php 64bit 설치
경로 : http://windows.php.net/download/
파일 : php-5.5.9-Win32-VC11-x64.zip
VC11 x64 Non Thread Safe 방식인 php-5.5.9-nts-Win32-VC11-x64.zip 파일에는 php5apache2_4.dll 이 없습니다.
VC11 x64 버전에서 Thread Safe 방식에만 php5apache2_4.dll 파일이 있고 그외 1.x, 2.0.x, 2.2.x 버전용 dll 은 없습니다.
필요하시다면 컴파일을 하셔서 만들던지 다른 경로로 구하셔야 합니다.
Thread Safe 방식과 Non Thread Safe 방식의 차이는 다음 URL 을 참조해 주세요.
http://auctionpro.co.kr/?p=773
압축을 푼후 "C:\Program Files\php" 에 복사
php.ini-development 파일을 php.ini 복사후 설정
설치 경로의 php.ini 파일을 열어 아래의 내용을 변경해준다.
extension_dir=”./” ====> extension_dir=”C:\PHP\ext\”
수정한 php.ini 파일을 C:\Windows\ 폴더로 이동시킨다.(복사하면 안된다. 반드시 이동시켜야 한다.)
tbadmin을 이용하여 excel 파일에 입력된 데이터를 import 해보자
Posted at 2012/10/30 18:17 | Posted in 개발자 이야기/티베로 (Tibero)
개 요 |
mysql에서 tibero로 데이터를 이관해야 하는데 중간에 정제 작업을 거쳐야 했다 딱히 마땅한 수정 프로그램이 없어서 mysql에서 csv 파일로 export 하여 다시 csv 파일을 엑셀에서 열어 수정 작업을 거치고 다시 tibero로 import 해야 하는 상황이었다.
준비과정 |
먼저 mysql에서 이관할 테이블을 csv 파일로 export 하고 (아래 링크 참조)
2012/10/30 - [개발자 이야기/MYSQL] - csv 파일을 이용하여 데이터 export import 하는 방법
엑셀에서 열어 데이터 수정을 실시하고 다시 csv 파일로 저장하는게 아니라 xls(2003 버젼) 으로 저장
(절대 xlsx 파일로 저장하면 안됨 tbadmin 에서 지원하지 않음)
TbAdmin 에서 |
tbadmin 메뉴에서 tool → ExpImp 메뉴 클릭 아래와 같은 창이 뜬다
Use Excel file 체크 후 Import 텝을 클릭 하면 아래와 같은 화면이 나온다.
source file 에는 import할 excel 파일을 선택하고 Destination table 에는 import 할 테이블을 선택한다 또 ignore the first line에 체크한다(단 엑셀파일 첫줄에 항목이름이 있다면 체크 바로 데이터가 있다면 체크하지 말것) Start Importing 클릭 하면 아래와 같은 화면이 뜬다.
전체필드에 입력하지 않을경우 필요없는 필드는 삭제해도 무관하다 적당히 필드 맵핑하고 ok 클릭하면 끝
with a as (
select '제주특별자치도 서귀포시 광평로 105 ( 안덕면, 통나무힐스 )' bigo from dual
union all
select '부산광역시 강서구 대저1동 4302-22' from dual
)
select bigo
, regexp_substr(bigo, '[^ ]+',1,1) a
, regexp_substr(bigo, '[^ ]+',1,2) b
, regexp_substr(bigo, '[^ ]+',1,3) c
, regexp_substr(bigo, '[^ ]+',1,4) d
, regexp_substr(bigo, '[^ ]+',1,5) e
from a
문자열 ';' 기준으로 아래 값들을
HT1816112121400121;로스엔젤레스;부산광역시 강서구 대저1동 4302-22
HT7014021412091123;대한민국;부산광역시 강서구 대저1동 4302-22
HT1611221911240214;오스트레일리아;부산광역시 강서구 대저1동 4302-22
A컬럼에 HT1816112121400121
B컬럼에 로스엔젤레스
C컬럼에 부산광역시 강서구 대저1동 4302-22
A,B,C 컬럼에 나누어 넣으려고 합니다...
SELECT BIGO, SUBSTR(BIGO,1,INSTR(컬럼,';')-1) A, REVERSE(SUBSTR(REVERSE(BIGO), 19, INSTR(REVERSE(BIGO), ';') -1)) B, REVERSE(SUBSTR(REVERSE(BIGO), 1, INSTR(REVERSE(BIGO), ';') - 1)) C
FROM 테이블명 WHERE BIGO LIKE '%;%'; 이렇게 했더니...
B에 들어가는 값들이 '로스엔젤레스;부산광역시' 또는 '대한민국;부산광역시 강서구' 이런식으로 들어가는데요...
B컬럼 구문 어느곳이 틀린건지 문의 드립니다...
그리고 가운데 '로스엔젤레스, 대한민국, 오스트레일리아' 만 가져오려고 구문을 짜봤는데
'로스엔젤레스;부산광역시' 이렇게 나옵니다...
SELECT BIGO
, REGEXP_REPLACE(SUBSTR(BIGO, INSTR(BIGO, ';', 1) +1), '\(;*\)') T
FROM (SELECT BIGO FROM 컬럼명);
두개의 쿼리에 대해 조언 부탁드리겠습니다.....
글 등 록 | 목록보기 |
퍼옴 : http://gameqa.tistory.com/171
웹표준에 맞춰 작업을 하다가
table 에서 height 100% 적용안되는 경우가 있어 해결법을 올려둡니다.
원인은... 웹표준에서 table 사용시 height 값을 바로 가져오지 못하기 때문입니다.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
쉬운 방법은, 위 문장을 아래와 같이 변경하는 것입니다. (XHTML 1.0 을 HTML 4.01 로 변경하는게 핵심)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
그런데, 이 방법은 XHTML 1.0 을 HTML 4.01 로 바꾸는 것이기 때문에,
XHTML 을 사용하고자 하는 경우에는 다른 방법을 사용해야 합니다.
우선, CSS 에 다음 내용을 추가 합니다.
html, body, #fullheight {
height:100%;
}
그리고, table 에서 사용할 때는, 아래와 같이 div 안에 넣어주면 됩니다.
<div id="fullheight">
<table width=100% id="fullheight">
<tr><td>...</td></tr>
</table>
</div>
이렇게 하면, body 와 div 를 거쳐 height 값을 가져올 수 있기 때문에,
table 에서 height 100% 를 적용할 수 있게 됩니다.
html 4.01 관련한 설명은 아래 링크를 참고하세요. (링크에 div 관련 설명은 안나옵니다)
http://www.apptools.com/examples/tableheight.php
윈도우7에 오라클 11g 클라이언트를 설치해보겠습니다.
오라클은 서버와 클라이언트로 나뉘어지는건 다들 아시죠?
서버는 누군가 다른 사람들이 접속할 수 있는 장소를 만드는 곳이고
클라이언트는 다른 서버로 접속하기 위한 것입니다.
따라서 클라이언트를 설치한다면
데이터베이스에 접속하는 것은 가능하나
데이터베이스를 생성하는 것은 안됩니다.
데이터베이스를 생성할 목적이라면 서버를 설치하시면 되겠습니다.
설치 방법은 간단합니다.
http://www.oracle.com/technetwork/topics/winsoft-085727.html
홈페이지로 이동하여 밑에 두 파일을 다운로드 받습니다.
|
두 파일을 같은 폴더에 압축을 풀어 놓습니다.
tnsname 파일을 위치하기 위해 다운받은 폴더 밑에 network - admin 폴더를 생성하고
tnsname 파일을 위치시킵니다.
여기까지 하면 설치는 끝났습니다.
마지막으로 패스만 설정하면 설치가 완료됩니다.
<내컴퓨터> <속성> <고급 시스템 설정> <환경변수> <시스템 변수> 로 들어가
환경변수를 설정합니다.
1. ORACLE_HOME -> 다운받은 오라클 폴더(ex. C:\instantclient_11_2)
2. TNS_ADMIN -> tnsname파일이 위치한 폴더
3. path -> 다운받은 오라클 폴더(ex. C:\instantclient_11_2)
원격 접속지로 접속이 되는지 확인합니다.
시작프로그램 - 실행 - cmd 입력하여 cmd창으로 이동합니다.
sqlplus 아이디/패스워드@원격지tnsname
정상적으로 접속이 되면 설치가 완료되었습니다.
접속이 되지 않으면 tnsname 파일을 확인하여 정보가 맞는지 확인합니다.
윈도우 환경변수 등록 (시스템 환경변수)
변수명 - NLS_LANG
변수값 - KOREAN_KOREA.KO16MSWIN949
[출처] 윈도우7 오라클 11g 클라이언트 설치하기, 다운받기|작성자 여행하면 성공한다
http://blog.naver.com/itough2323?Redirect=Log&logNo=80125972268
http://blog.naver.com/explojh?Redirect=Log&logNo=60036603826
◆ 개요
힌트는 SQL 튜닝의 핵심부분으로 일종의 지시구문이다.
SQL에 포함되어 쓰여져 Optimizer의 실행 계획을 원하는 대로 바꿀 수 있게 해준다.
오라클 Optimizer라고 해서 항상 최선의 실행 계획을 수립할 수는 없으므로
테이블이나 인덱스의 잘못된 실행 계획을 개발자가 직접 바꿀 수 있도록 도와주는 것이다.
사용자는 특정 SQL 문장에서 어떤 인덱스가 선택도가 높은지에 대해 알고 있는데
이 경우 오라클 서버의 Optimizer에 의존하여 나온 실행 계획보다 훨씬 효율적인 실행 계획을 사용자가 구사할 수 있다.
◆ 사용
힌트를 사용하여 아래와 같은 것들을 할 수 있다.
액세스 경로, 조인 순서, 병렬 및 직렬 처리, Optimizer의 목표(Goal)를 변경 가능하다.
◆ 오라클 힌트 사용예
SELECT /*+ INDEX(idx_col1) */ |
SELECT /*+ ORDERED INDEX(b idx_col1) */ |
※ 주의! 주석 표시 뒤에 '+' 기호가 있다.
◆ INDEX Access Operation 관련 HINT
HINT |
내용 |
사용법 |
INDEX |
INDEX를 순차적으로 스캔 |
INDEX(TABLE_name, INDEX_name) |
INDEX_ASC |
INDEX를 내림차순으로 스캔. |
|
INDEX_DESC |
INDEX를 오름차순으로 스캔. |
INDEX_DESC(TABLE_name, INDEX_name) |
INDEX_FFS |
INDEX FAST FULL SCAN |
INDEX_FFS(TABLE_name, INDEX_name) |
PARALLEL_INDEX |
INDEX PARALLEL SCAN |
PARALLEL_INDEX(TABLE_name, INDEX_name) |
NOPARALLEL_INDEX |
INDEX PARALLEL SCAN 제한 |
NOPARALLEL_INDEX(TABLE_name, INDEX_name) |
AND_EQUALS |
여러개의 INDEX MARGE 수행 |
AND_EQUALS(INDEX_name, INDEX_name) |
FULL |
FULL SCAN 지정된 테이블에 대한 전체 스캔. |
FULL(TABLE_name) |
◆ JOIN Access Operator 관련 HINT
HINT |
내용 |
사용법 |
USE_NL |
NESTED LOOP JOIN 옵티마이저가 NESTED LOOP JOIN을 사용하도록 한다. 먼저 특정 TABLE의 ROW에 액세스하고 그 값에 해당하는 다른 TABLE의 ROW를 찾는 작업을 해당범위까지 실행하는 조인. |
USE_NL(TABLE1, TABLE2) |
USE_NL_WITH_INDEX |
INDEX를 사용해서 NESTED LOOP JOIN을 사용하도록 한다. |
USE_NL_WITH_INDEX(TABLE INDEX) |
USE_MERGE |
SORT MERGE JOIN 옵티마이저가 SORT MERGE JOIN을 사용하도록 한다. 먼저 각각의 TABLE의 처리 범위를 스캔하여 SORT한 후, 서로 MERGE하면서 JOIN하는 방식. |
USE_MERGE(TABLE1, TABLE2) |
USE_HASH |
HASH JOIN 옵티마이저가 HASH JOIN을 사용하도록 한다. |
USE_HASH(TABLE1, TABLE2) |
HASH_AJ |
HASH ANTIJOIN |
HASH_AJ(TABLE1, TABLE2) |
HASH_SJ |
HASH SEMIJOIN |
HASH_SJ(TABLE1, TABLE2) |
NL_AJ |
NESTED LOOP ANTIJOIN |
NL_AJ(TABLE1, TABLE2) |
NL_SJ |
NESTED LOOP SEMIJOIN |
NL_SJ(TABLE1, TABLE2) |
MERGE_AJ |
SORT MERGE ANTIJOIN |
MERGE_AJ(TABLE1, TABLE2) |
MERGE_SJ |
SORT MERGE SEMIJOIN |
MERGE_SJ(TABLE1, TABLE2) |
◆ JOIN시 DRIVING 순서 결정 HINT
HINT |
내용 |
사용법 |
ORDERED |
FROM절에 명시된 테이블의 순서대로 DRIVING |
|
LEADING |
파라미터에 명시된 테이블의 순서대로 JOIN |
LEAING(TABLE_name1, TABLE_name2, ...) |
DRIVING |
해당 테이블을 먼저 DRIVING |
DRIVING(TABLE) |
◆ 기타 HINT
HINT |
내용 |
사용법 |
APPEND |
INSERT시 DIRECT LOADING |
|
PARALLEL |
SELECT, INSERT시 여러개의 프로세스로 수행 |
PARALLEL(TABLE, 개수) |
CACHE |
데이터를 메모리에 CACHING |
|
NOCACHE |
데이터를 메모리에 CACHING하지 않음 |
|
PUSH_SUBQ |
SUBQUERY를 먼저 수행 |
|
REWRITE |
QUERY REWRITE 수행 |
|
NOREWIRTE |
QUERY REWRITE를 수행 못함 |
|
USE_CONCAT |
IN절을 CONCATENATION ACCESS OPERATION으로 수행 |
|
USE_EXPAND |
IN절을 CONCATENATION ACCESS OPERATION으로 수행못하게 함 |
|
MERGE |
VIEW MERGING 수행 |
|
NO_MERGE |
VIEW MERGING 수행못하게 함 |
|
※ 추가
ALL_ROWS : 가장 좋은 단위 처리량의 목표로 문 블록을 최적화하기 위해 cost-based 접근 방법을 선택합니다. (즉, 전체적인 최소의 자원 소비, 모든 레코드의 처리하는 시간의 최소화를 목적으로 최적화)
FIRST_ROWS : 가장 좋은 응답 시간의 목표로 문 블록을 최적화하기 위해 cost-based 접근 방법을 선택합니다. (첫번째 레코드의 추출 시간을 최소화할 목적으로 최적화)
CHOOSE : 최적자(optimizer)가 그 문에 의해 접근된 테이블을 위해 통계의 존재에 근거를 두는 SQL문을 위해 rule-based 접근 방법과 cost-based 접근 방법 사이에 선택하게 됩니다.
CLUSTER : 지정된 테이블에 대한 클러스터 스캔.
HASH : 지정된 테이블에 대한 해쉬 스캔.
ROWID : 지정된 테이블에 대한 ROWID에 의한 테이블 스캔.
RULE : explicitlly chooses rule-based optimization for a statement block. rule-base Optimizer를 사용.
◆ 주의
SELECT /*+ ORDERED USE_NL(A B C) INDEX(B ITOREDRETL1) */ FROM TORDERDTL B, TORDER A, TITEM C WHERE ... |
1. ORDERED : FROM 절에 기술한 테이블 순(B → A → C 순)으로 조인함. USE_NL에 사용한 순서가 아님.
※ 참고) LEADING, 예) LEADING(B) : FROM 절의 기술 순서와 상관없이 B테이블이 가장 먼저 선행됨.
2. USE_NL : 조인방법을 Nested Loops방식으로 선택.
예) USE_NL(A B), 테이블명이 아닌 테이블에 대한 Alias명
참고) USE_HASH, USE_MERGE
3. INDEX : 특정 인덱스를 오름차순으로 읽음.
예) INDEX(B ITORDERDTL1) : B는 TORDERDTL 테이블의 Alias명, 사용할 인덱스명 기술
참고) USE_DESC(B ITORDERDTL1) : ITORDERDTL1 인덱스를 내림차순으로 읽음
◆ 실행계획 살펴보기 1
SELECT * FROM ( ==> 인라인뷰 3 ( ==> 인라인뷰 2 ( ==> 인라인뷰 1 ) ) ) |
과 같이 되어 있다고 하자.
이럴 경우 실행계획을 보면, 우리가 예상했던대로 인라인뷰1 ==> 인라인뷰2 ==> 인라인뷰3 순서로 드라이빙 되지 않는 경우가 있다.
이런 경우 강제로 위 순서대로 실행계획을 수립하도록 하는 힌트
SELECT /*+ ORDERED */
*
FROM ( .....
위 힌트를 사용하면 맨 깊숙한 인라인뷰부터 실행된다.
◆ 힌트 사용하기
1. /*+ USE_CONCAT */
USE_CONCAT : 조건절에 있는 OR 연산자조건 (또는 IN 연산자 조건)을 별도의 실행단위로 분리하여 각각의 최적의 액세스 경로를 수립하여 이를 연결(Concatenation)하는 실행계획을 수립하도록 유도하는 힌트.
반드시 처리주관 조건이 OR로 나누어졌을 때 적용해야 하며, 잘못 사용하면 비효율이 발생할 수 있으므로 주의해야 함.
예>
SELECT /*+ USE_CONCAT */
FROM employees
WHERE job = &job
OR dept_no = &deptno;
풀어쓰자면
SELECT *
FROM employees
WHERE job = &job
UNION ALL
SELECT *
FROM employees
WHERER dept_no = &deptno;
WHERE 절 이후에 나오는 컬럼에 맞게 인덱스를 탄다.
2. /*+ NO_EXPAND */
조건절에 있는 OR 연산자 조건 또는 IN 연산자 조건을 연결 실행계획으로 처리되지 않도록 할 때 사용하는 힌트.
USE_CONCAT의 반대 개념.
예>
SELECT /*+ NO_EXPAND */
FROM customer
WHERE cust_type in ('A','B');
참고 : http://blog.naver.com/hkjhc107?Redirect=Log&logNo=130035827974
◆ 참고
1. Nested Loop
- 테이블의 인덱스끼리 inner-outer 루프를 형성하여 결과를 쿼리하는 방식입니다.
- 제일 많은 유형의 실행계획입니다.
2. Sort Merge
- 쿼리의 결과가 많은 양의 데이터를 읽는 경우, 테이블들을 각각 full-scan하여 같은 키값을 갖는 데이터끼리 조인하여 실행합니다.
- Sort-Merge 방식은 많은 메모리와 디스크 I/O를 필요로 하기 때문에, sqlplus를 실행하는 주체의 메모리/CPU/디스크 스펙에 많은 영향을 받습니다.
3. Hash Join
- 한 테이블은 매우 많은 Row를 갖고, 다른 한 테이블은 매우 적은 Row를 가질 때, 해쉬 알고리즘에 의해 큰 테이블을 여러개의 버켓으로 나누어 쿼리를 수행하는 방식입니다. 작은 테이블은 인덱스를 태우는 것보다 full-scan을 하는 것이 유리할 때 사용됩니다.
[출처] [본문스크랩] 오라클 힌트 정리표|작성자 귀차니즘극복
얼마전에 있었던 경험을 바탕으로 내용을 적어 본다.
갑자기 DBA의 실수로 운영DB의 테이블이 DROP 되었다.
신속한 시스템 복구를 위해 운 좋게 직전에 백업해두었던 테이블이 있어서 임시로 복구를 했다.
그냥 저냥 업무시간대를 잘 넘기고 있어서 별 문제 없이 지나가나 했었다.
갑자기 퇴근시간이 다되어 DB의 CPU 사용률이 높아지더니 떨어질 기미가 보이지 않는다.
여러 쿼리들의 수행시간이 엄청 길어졌고 계속 부하가 걸려온다.
느려진 쿼리의 PLAN을 떠봤다. 갑자기 타지 않던 FULL SCAN 플랜이 자꾸 뜬다.
분명히 DROP된 테이블과 관련이 있는듯 했으나, 새로 생성된 INDEX를 봐도 기존과 동일하게 문제가 없었다.
암만 봐도 인덱스의 문제가 없다.. 이거 왜이러지 하는 순간... 번뜩 생각이 났다.
보통 DB의 옵티마이져는 COST 베이스 방식으로 운영이 되고, 옵티마이저에 따라 DB가 플랜을 만들어서 돌린다.
이때 통계정보를 활용한다.... 바로 이거인듯 했다.
그래서 ANALYZE 된 정보를 확인해 보았다.
SELECT TABLE_NAME,
NUM_ROWS,
BLOCKS,
EMPTY_BLOCKS,
AVG_SPACE,
CHAIN_CNT,
AVG_ROW_LEN,
SAMPLE_SIZE,
LAST_ANALYZED
FROM USER_TABLES
WHERE TABLE_NAME = 'SAMPLE_TABLE'
;
역시나 TABLE이 DROP되면서 통계정보도 날아갔던 것이다.
즉, 아무리 인덱스가 생성되어 있어도 데이터의 형태에 따라 만들어진 통계정보가 없으면 FULL_SCAN이 발생한다.
DROP된 테이블이 시스템 사용시 무조건 사용되는 테이블이라 그 영향력은 크다.
그럼 통계정보를 생성해 본다.
ANALYZE TABLE SAMPLE_TABLE
COMPUTE STATISTICS
;
[문법 설명]
ANALYZE object_name operation STATISTICS
[VALIDATE STRUCTURE[CASCADE]]
[LIST CHAINED ROWS[INTO tables]]
* object는 TABLE, INDEX, CLUSTER 중에 해당하는 오브젝트 기술
* operation
- COMPUTE : 각각의 값등을 정확하게 계산한다. 가장 정확한 통계를 얻을 수 있지만 처리속도가 가장 느리다.
- ESTIMATE : 자료사전의 값과 데이터 견본을 가지고 통계를 예상한다. 덜정확하지만 처리속도가 훨씬 빠르다.
- DELETE : 테이블의 모든 통계정보를 삭제한다.
수행하고 나서 상단의 조회 쿼리를 다시 조회하면 결과가 나온다.
자 이제 느린 쿼리를 다시 수행해 본다... 음 역시 예전의 상태를 되찾았다!
[출처] [오라클] TABLE ANALYZE 하기|작성자 귀차니즘극복
<!--[if lte IE 8]>
.target {background:transparent; filter: progid:DXImageTransform.Microsoft.gradient(starColorstr=#80FFFFFF,endColorstr=#80FFFFFF); zoom:1;}
<![endif]-->
*opacity 는 IE 9, 크롬, 사파리, 오페라, 파이어폭스에서 적용 가능하다.
IE6~8버전에서는 이를 지원하지 않으나 filter를 통해서 비슷한 스타일 적용이 가능하다.
transparent8{zoom:1; /* ie 6,7,8 bug fix */ filter:alpha(opacity=80); opacity:0.8; }
filter의 값은 0 ~ 100 값을 가지며 opacity는 0 ~ 1 까지의 값을 가진다.
[출처] opacity IE 6 ~ 8 대비용 |작성자 써니
document.all.Divsubmenu[i].className='menuclick';
숫자만 -> trim(translate(cmp_user_id,'1234567890',' ')) is null
문자만 -> trim(translate(cmp_user_id,'1234567890',' ')) is not null
-- 1. 어차피 a 는 고정 자리수일텐데 Instr 은 뭐하러 하나요?
-- 2. Why Reverse?
-- 3. 정규식 패턴 사용이 적절하지 않고요...
WITH
t
AS
(
SELECT
'HT1816112121400121;로스엔젤레스;부산광역시 강서구 대저1동 4302-22'
bigo
FROM
dual
UNION
ALL
SELECT
'HT7014021412091123;대한민국;부산광역시 강서구 대저1동 4302-22'
FROM
dual
UNION
ALL
SELECT
'HT1611221911240214;오스트레일리아;부산광역시 강서구 대저1동 4302-22'
FROM
dual
)
SELECT
bigo
-- 1. a 가 자리수 고정인 경우
, SUBSTR(bigo, 1, 18) a1
, SUBSTR(bigo, 20, INSTR(bigo,
';'
, 1, 2)-20) b1
, SUBSTR(bigo, INSTR(bigo,
';'
, 1, 2)+1) c1
-- 2. 자리수와 상관 없이
, SUBSTR(bigo, 1, INSTR(bigo,
';'
)-1) a2
, SUBSTR(bigo, INSTR(bigo,
';'
)+1, INSTR(bigo,
';'
, -1)-INSTR(bigo,
';'
)-1) b2
, SUBSTR(bigo, INSTR(bigo,
';'
, -1)+1) c2
-- 3. 정규식 이용
, REGEXP_SUBSTR(bigo,
'[^;]+'
, 1, 1) a3
, REGEXP_SUBSTR(bigo,
'[^;]+'
, 1, 2) b3
, REGEXP_SUBSTR(bigo,
'[^;]+'
, 1, 3) c3
FROM
t
;