브라우저 패턴이 너무 다양함...

하는데까지..



SELECT browser, COUNT(browser) AS cnt
FROM (
	SELECT 
		CASE
			WHEN user_agent LIKE '%Windows%Chrome%' THEN 'Chrome'
			WHEN user_agent LIKE '%iPad%Chrome%' THEN 'ChromeIPad'
			WHEN user_agent LIKE '%iPhone%Chrome%' THEN 'ChromeIPhone'
			WHEN user_agent LIKE '%Android%Chrome%' THEN 'ChromeAndroid'
			WHEN user_agent LIKE '%Mac%Chrome%' THEN 'ChromeMacOs'     
			WHEN user_agent LIKE '%Linux%Chrome%' THEN 'ChromeLinux'
			WHEN user_agent LIKE '%Chrome%' THEN 'ChromeEtc'
			
			WHEN user_agent LIKE '%Windows%Safari%' THEN 'Safari'
			WHEN user_agent LIKE '%iPad%Safari%' THEN 'SafariIPad'
			WHEN user_agent LIKE '%iPhone%Safari%' THEN 'SafariIPhone'
			WHEN user_agent LIKE '%Android%Safari%' THEN 'SafariAndroid'
			WHEN user_agent LIKE '%Mac%Safari%' THEN 'SafariMacOs'     
			WHEN user_agent LIKE '%Linux%Safari%' THEN 'SafariLinux'   
			WHEN user_agent LIKE '%Safari%' THEN 'SafariEtc'
			
			WHEN user_agent LIKE '%Windows%Firefox%' THEN 'Firefox'
			WHEN user_agent LIKE '%iPad%Firefox%' THEN 'FirefoxIPad'
			WHEN user_agent LIKE '%iPhone%Firefox%' THEN 'FirefoxIPhone'
			WHEN user_agent LIKE '%Android%Firefox%' THEN 'FirefoxAndroid'
			WHEN user_agent LIKE '%Mac%Firefox%' THEN 'FirefoxMacOs'     
			WHEN user_agent LIKE '%Linux%Firefox%' THEN 'FirefoxLinux'      
			WHEN user_agent LIKE '%Firefox%' THEN 'FirefoxEtc'
			
			WHEN user_agent LIKE '%MSIE 6%' THEN 'IE6'
			WHEN user_agent LIKE '%MSIE 7%' THEN 'IE7'
			WHEN user_agent LIKE '%MSIE 8%' THEN 'IE8'
			WHEN user_agent LIKE '%MSIE 9%' THEN 'IE9'
			WHEN user_agent LIKE '%MSIE 10%' THEN 'IE10'
			WHEN user_agent LIKE '%rv:11%' THEN 'IE11'
			
			WHEN user_agent LIKE '%iPad%' THEN 'AppIPad'
			WHEN user_agent LIKE '%iPhone%' THEN 'AppIPhone'
			WHEN user_agent LIKE '%Android%' THEN 'AppAndroid'

			WHEN user_conn_info LIKE '%Opera%' THEN 'Opera'
			ELSE 'EtcBrowser'
		END browser
		FROM USER_AGENT_HISTORY
		WHERE LOGIN_DT >= '20160517000001' AND LOGIN_DT <= '20160517999999'
	) AS browsers 
GROUP BY browser 
ORDER BY cnt DESC 

특정 테이블의 정보를 특정 데이터로 업데이트 해달라는 요청이 가끔 들어온다.

물론 그 데이터는 엑셀로 올것이고, 현재 DB데이터와 1:1 맵핑되는 상황이 아닐것이죠.

그래서 1번의 방법과 같이  임시 테이블에 넣은다음에 쿼리를 돌리겠죠.


하지만 1번과 같이 하게되면 set 절이 반복적으로 Random 액세스를 해서 부담이 발생한다는군요.

뭐 지금까지 요청받은 부분에서 부담요소가 있었던것은 아니지만 , 동료분이 2번과 같은 Oracle 문법을 사용하길래 메모해본다.


우선적으로 위와 같은 성능을 해결하기위해서 "Updatable Join View" 방식을 사용한다고 합니다.

그런데 이 방법은 제약조건이 존재하는데 꼭 UK 또는 PK 설정이 되어 있어야 한다고합니다.

하지만 그렇지 않은 경우도 있을 수 있죠.

그래서 사용하는것이 BYPASS_UJVC 힌트절이라고 합니다.


머 자세한건 잘 모릅니다.

동료분이 사용하길래 메모해둠!!!


-- 1번
update test_a1 a 
set b = (
    select b
    from test_b1
    where a = a.a
)
where exists (select 1 from test_b1 where a = a.a);

-- 2번
update /*+ BYPASS_UJVC */
(
    select a.b a_b, b.b b_b
    from test_a1 a, test_b1 b
    where a.a = b.a
)
set a_b = b_b;

/*  
drop table test_a1;
drop table test_b1;
create table test_a1
(
    a number,
    b varchar2(10)
);
create table test_b1
(
    a number,
    b varchar2(10)
);
insert into test_a1 values(1, 'a1');
insert into test_a1 values(2, 'a2');
insert into test_b1 values(2, 'a2222');
*/


create database aaa default character set utf8;

SET storage_engine=INNODB;

create or replace procedure sp_config_setting2
is   
    menuCd  varchar(4);
    menuUrl varchar(200);
    
    cursor curTb    
    is
    select menu_cd, menu_url from menu where menu_ctg = 'A' and use_yn = 'Y' and menu_view_yn = 'Y';
begin
    
    open curTb;
    
    loop
        fetch curTb 
        into menuCd, menuUrl;
        EXIT  WHEN  curTb%NOTFOUND; 
        
        if menuUrl is not null then
            
            if instr(menuUrl, '냠냠냨') = '0' then
                dbms_output.put_line(menuCd || '=' || menuUrl || '-' || instr(menuUrl, '냠냠냠'));
                
                update menu set menu_url = '냠냠냠' where menu_cd = menuCd;
            end if;
        end if;
    end loop;    
    
    close curTb;
end;

--execute sp_config_setting2();
--DROP PROCEDURE sp_config_setting2;

Oracle 10g Client 다운로드 받아 설치 중간에 설치유형으로 "관리자" 를 선택 후 진행한다.

..Disk1\stage\prereq\client\refhost.xml
..Disk1\stage\prereq\client_prereqs\client\refhost.xml

해당 파일을  열어서
<CERTIFIED_SYSTEMS>자식노드로 아래와 같이 추가
<OPERATING_SYSTEM> 
 <VERSION VALUE="6.1"/> 
</OPERATING_SYSTEM> 

..Disk1\install\oraparam.ini 파일을 열어서 아래와 같이 수정
 #Windows=5.0,5.1,5.2,6.0,6.1

Ps. Orange 를 사용할 경우 Instant Client 를 이용할 경우 몇가지 문제가 생긴다. 우선 sqlplus 를 받아야 하고 ORACLE_HOME관련 문제도 생긴다.
인터넷상에 해결 방법이 있는것 같기도 하다. 

DROP PROCEDURE IF EXISTS `test_db`.`usp_test`;
CREATE PROCEDURE `test_db`.`usp_test`(in p_b varchar(50))
    READS SQL DATA
BEGIN   
	select * from test where b = p_b;    
END


MERGE INTO SEARCH_DATA SD
    USING (SELECT COUNT(DATA) AS C FROM SEARCH_DATA WHERE DATA = 'B') S 
    ON (S.C > 0)
 WHEN MATCHED THEN 
    UPDATE SET SD.CNT = SD.CNT + 1
 WHEN NOT MATCHED THEN 
    INSERT VALUES ('B', 1)

CREATE TABLE ADM_HISTORY (
  SEQ		NUMBER NOT NULL,
  USER_ID     VARCHAR2(20)      NOT NULL,
  CUD		VARCHAR2(1) CHECK( CUD IN('C', 'U', 'D')) NOT NULL, 
  TITLE		VARCHAR2(2000) NOT NULL,
  URL		VARCHAR2(500) NULL,
  REGDATE	DATE DEFAULT SYSDATE,
  PRIMARY KEY ( SEQ ),
  FOREIGN KEY ( USER_ID ) REFERENCES ADM_USERS ( USER_ID )
);




	String jdbcDriver = "cubrid.jdbc.driver.CUBRIDDriver";
	String jdbcURL 	  = "jdbc:cubrid:localhost:30000:testdb:dba::";
	String jdbcID  	  = "dba";
	String jdbcPWD 	  = "pwd";

	Class.forName(jdbcDriver);
	Connection c = DriverManager.getConnection(jdbcURL, jdbcID, jdbcPWD);

JDK 1.4, 1.5 일 경우
sqljdbc.jar JDBC 3.0 지원

JDK 1.6 일 경우
sqljdbc4.jar JDBC 4.0 지원


ㅓㅇ[출처] sqljdbc.jar 와 sqljdbc4.jar 의 차이점|작성자 



+ Recent posts