yous3163

yous3163

PHPJavaJavascriptAjax
yous3163yous3163· 6년

질문오라클 대량 insert시 속도향상 방법이 궁금합니다.

한번에 데이터를 대략 3000건 insert시 2.2초가 되는데 좀 더 빠른속도로 insert 하고싶습니다. mybatis로 직접쿼리를 작성하여 돌리고있습니다. 방법이없나요???
4.4K
1
0
아마야
아마야·2021-01-31
먼저 FORALL이 들어간 PL/SQL을 작성하는 방법이 있습니다. FORALL을 사용하면 하나씩 insert하는 것보다 속도가 빨라집니다. 아래는 FORALL을 사용하는 예입니다. SQL> DECLARE 2 TYPE mozi_ins IS TABLE OF MOZI%ROWTYPE INDEX BY BINARY_INTEGER; 3 ...
yous3163yous3163· 6년

질문인덱스를 타지않는 쿼리

인덱스를 타지 않는 쿼리로 다음과 같은 경우가 있는데  테스트결과 빨간색의 경우에는 확인을 하였습니다. 하지만 초록색의 결과는 실행계획을 확인해보았을 때 인덱스를 타는걸로 보여지는데 왜 그럴까요..?   -LIKE ‘%문자열%’로 검색하는 경우 SELECT * FROM TGOLFZON WHERE UserName = ‘%곽%’ -> UserName = ‘곽%’   -조건 절에 IS NULL , IS NOT NULL 구문을 사용하는 경우   -부정 연산자(!=,<>,NOT IN, NOT EXISTS)를 사용하는 경우 NOT일 경우 무조건 인덱스를 안타는 것이 아니라 타지만 일반적으로 NOT에 사용된 값이 아닌 데이터 비율이 높은 경우가 많기 때문에 인덱스를 타지 않는다.   -내부적인 데이터 형이 변경될 경우 SELECT * FROM TGOLFZON WHERE UserNo = ’33’ -> UserNo= 33   -OR 구문을 사용하는 경우 INDEX FULL SCAN 을 타게 됨   -인덱스 컬럼 절이 변경될 경우 SELECT * FROM TGOLFZON WHERE CashAmt * 100 > 10000 -> CashAmt = 10000/100
3.0K
1
0
kimho
kimho·2019-05-10
MS SQL에서는 NULL도 인덱싱이 될 수 있습니다.  
yous3163yous3163· 6년

질문클러스터드, 논클러스터드 인덱스 생성 순서

어떤 것을 먼저 생성해야하고, 이유에 대해 아시는분 계신가요?
1.9K
2
0
yous3163
yous3163·2019-05-08
자문자답이 된거 같지만 찾아서 공유드립니다. 결과론 적으론 두 개의 인덱스를 혼합할 경우 구조는 같다. 클러스터드와 넌클러스터드 인덱스를 같이 사용할 경우에는 넌클러스터드 인덱스가 가리키는 위치가 클러스터드 인덱스의 키 값을 가지게 된다. (만약 클러스터드형 인덱스가 없었다면 넌클러스터드 인덱스가 가리키는 위치는 ‘데이터페이지번호 + #...
·2019-05-08
yous3163yous3163· 6년

DB Isolation

답변을 받아 답변내용을 뒤에 추가하였습니다.    트랜잭션의  4가지 특성중 하나인 격리성(Isolation)은   동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 독립적으로 실행 혹은 격리해야하는 특성을 가지고 있습니다.   이러한 특징을 가진 격리성은 대해서 이슈가 있는데   격리성을 완벽히 보장하기 위해 모든 트랜잭션을 순차적으로 실행한다면 동시성 처리 이슈가 발생하게 되고, 반대로 동시성을 높이기 위해 여러 트랜잭션을 병렬방식으로 처리하게 되면 데이터의 무결성이 깨질 수 있습니다.   격리성,동시성에 관련 이슈로는 3개가 있습니다. Dirty Read Non-repeatable Read Phantom Read   Dirty Read  하나의 트랜잭션(TX1)이 데이터에 접근하여 어떠한 값을 변경하고 커밋을 하지 않았을 때, 다른  트랜잭션(TX2)이 해당 데이터를 Read하게 되면 TX2가 읽은 데이터는 이미 변경된값이 될  것입니다. 하지만 TX1이 최종 커밋을 하지않고 종료한다면, TX2가 읽은 데이터는 올바른 데이터가 아니게 되는 문제점입니다.   Non-Repeatable Read  하나의 트랜잭션(TX1)이 데이터를 Read하고 있을때, 다른 트랜잭션(TX2)가 데이터에 접근하여 어떠한 값을  변경 혹은 삭제하고 커밋을 하고, 그 후 TX1이 다시 해당 데이터를 Read하고자 하면 변경된 데이터 혹은 삭제된 데이터를 찾게되는 문제점입니다.   Phantom Read 하나의 트랜잭션(TX1) 중에 특정 조건으로 데이터를 검색하여 결과를 얻고, 이때 다른 트랜잭션(TX2)가 접근하여 해당 조건의 데이터 일부를 삭제/추가 하였을때, 아직 끝나지 않은 TX1이 다시 한번 해당 조건으로 데이터를 검색하면 TX2에서 삭제/추가된 데이터가 함께 조회/누락 되어서 혼란을 주는 문제점 입니다.   다음과 같은 문제점으로 트랜잭션 격리수준이라는 것이 있는데 이것은 총 4개의 단계로 나누어져있습니다. 단계에 따라 위에 나오는 격리성 관련 이슈를 해결할 수 있습니다.   Isolation Level Dirty Read Non-repeatable Read Phantom Read Read Uncommitted 0단계 O O O Read Committed 1단계 X O O Repeatable Read 2단계 X X O Serializable Read 3단계 X X X 단계가 올라갈수록 위의 3개의 이슈는 적게 발생하는 장점이있으면서 동시 처리 성능을 떨어지는 단점이 있습니다.     SELECT CASE transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL FROM sys.dm_exec_sessions where session_id = @@SPID   위의 쿼리를 돌려서 확인해보았을때  제가 사용하는 Mssql에서는 ReadCommitted가 default로 설정되어있어 Dirty Read이슈는 차단이 가능합니다. Read Committed는 데이터가 Committed(변경 작업 완료) 된 경우에만 조회를 할 수 있도록 하고 그렇지 않으면 Committed되기 전까지 접속에 Lock을 걸어서 기다리게 만듭니다. 즉, 공유잠금인 Shared Lock이 걸리는 레벨입니다. 하지만 때로는 데이터의 일관성과 관계없이 기다리지 않고 빨리 데이터를 읽어오기를 원하는 경우가 있는데 이때 사용되는 옵션이 NOLOCK입니다. 사용법은 SELECT * FROM TABLE WITH(NOLOCK) 입니다.
1.8K
0
yous3163yous3163· 6년

질문isolation 과 with nolock 관계

nolock 이라는 락힌트를 공부하다가 DB isolation 라는 부분을 공부하고있는데 이 둘의 관계를 이해하기 쉽게 설명해주실 분을 찾고있습니다 ㅠㅠ
2.0K
1
0
kimho
kimho·2019-04-15
DB를 통해서 데이터를 조회하거나(SELECT), 저장/변경/삭제(INSERT,UPDATE,DELETE)를 할 수 있는데 하나의 DB에 여러 사람들이 접속해서 데이터를 조회하거나 변경할 수 있습니다.   그런데 동시에 여러 사람이 하나의 DB에 접속하다보면 동시성의 문제가 발생합니다. 예를 들면, 어떤 접속에 의해 데이터가 변경되고 있는데 ...
yous3163yous3163· 7년

추상메소드 선언

인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행된다.그렇게 때문에 인터페이스의 메소드는 실행 블록이 필요없는 추상 메소드로 선언한다.추상메소드는 리턴타입, 메소드명, 매개변수만 기술되고 중괄호{ } 는 붙이지 않는 메소드를 말한다.[RemoteControl.java] 메소드 선언public interface RemoteControl {//상수public int MAX_VOLUME=10;public int MIN_VOLUME=0;//추상메소드public void turnOn();public void turnOff();public void setVolume(int volume);}//메소드 선언부만 작성(추상메소드)디폴트 메소드 선언디폴트 메소드는 자바 8에서 추가된 인터페이스의 새로운 멤버이다.형태는 클래스의 인스턴스 메소드와 동일하지만 default 키워드가 리턴 타입 앞에 붙는다.[public] default 리턴타입 메소드명(매개변수,...){ ... }위에 RemoteControl.java 에 이어서//디폴트 메소드default void setMute(boolean mute){if(mute){System.out.println( "무음 처리합니다.");} else {System.out.println( "무음 해제합니다.");}}정적 메소드 선언정적 메소드는 public 특성을 갖기 때문에 public 을 생략하더라도 가능하다.//정적 메소드static void changeBattery(){System.out.println( "건전지를 교환합니다.");다음은 인터페이스 구현에 대해서 설명하도록 하겠습니다.
1.6K
1
2
0
히정
히정·2018-08-03
인터페이스 구현에 대해 언제올려주시나요ㅠㅠ
yous3163yous3163· 7년

호빗

1.4K
2
0
yous3163yous3163· 7년

인터페이스

자바에서 인터페이스는 객체의 사용 방법을 정의한 타입이다.인터페이스는 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.개발코드가 직접 객체의 메소드를 호출하면 간단한데, 왜 중간에 인터페이스를 두는지 의문점이 생길수도있다. 그 이유는 개발코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기위해서이다.인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다. (메소드호출) (메소드호출)개발코드 ------------------------> 인터페이스 -------------------------> 객체1 (리턴값1) <------------------------- 인터페이스 <------------------------- 객체2 (리턴값1 또는 리턴값2) (리턴값2) 인터페이스 선언[public] interface 인터페이스명 {....}Class는 필드,생성자,메소드를 구성 멤버로 가지는데 비해 , 인터페이스는 상수와 메소드만을 구성 멤버로 가진다.interface 인터페이스명 {//상수타입 상수명 = 값;//추상메소드타입 메소드명(매개변수,...);//디폴트 메소드default 타입 메소드명(매개변수,...){...}//정적메소드static 타입 메소드명(매개변수){...}}상수 필드인터페이스는 객체 사용 설명서이므로 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수 없다.그러나 상수 필드는 선언이 가능하다. 상수는 인터페이스에 고정된 값으로 런타임 시에 데이터를 바꿀 수 없다. 상수를 선언할 때에는 반드시 초기값을 대입해야 한다.추상메소드추상 메소드는 객체가 가지고 있는 메소드를 설명한 것으로 호출할 때 어떤 매개값이 필요하고, 리턴 타입이 무엇인지만 알려준다. 실제 실행부는 객체(구현 객체)가 가지고 있다.디폴트 메소드디폴트 메소드는 인터페이스에 선언되지만 사실은 객체(구현객체)가 가지고 있는 인스턴스 메소드라고 생각해야한다. 자바 8버전부터 사용할 수 있다.정적 메소드정적 메소드도 역시 자바 8부터 작성할 수 있는데, 디폴트 메소드와는 달리 객체가 없어도 인터페이스만으로 호출이 가능하다.상수 필드 선언인터페이스는 데이터를 저장 할 수 없기 때문에 데이터를 저장할 인스턴스 또는 정적 필드를 선언할 수 없다. 대신 상수 필드만 선언할 수 있다. 상수는 public static final로 선언하는데 클래스에서 이미 학습한 바 있다. 따라서 인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다. public,static,final 을 생략하더라도 자동적으로 컴파일 과정에서 붙게된다.[public static final] 타입 상수명 = 값;[RemoteController.java] 상수 필드 선언public interface RemoteController {public int MAX_VOLUME=10;public int MIN_VOLUME=0;}다음은 추상메소드 선언에 대해 글을 올리겠습니다.
1.5K
1
0
yous3163yous3163· 7년

AWS

원더우먼은 아마존에 산다고합니다 ㅋㅋㅋㅋㅋ
1.4K
0
yous3163yous3163· 7년

추상 메소드와 오버라이딩

추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해 놓은 추상적인 클래스이므로 실체 클래스의 멤버 (필드,메소드)를 통일화 하는데 목적이 있다.메소드의 선언만 통일화하고 , 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다. 예를들어 모든 동물은 소리를 내기 때문에 Animal 추상 클래스에서 sound()라는 메소드를 정의했다고 하자.추상메소드를 선언하는 방법은[pulic | protected ] abstract 리턴타입 메소드명(매개변수,...); 밑에서는 void라는 리턴타입과 sound라는 메소드 명을 이용하였다.[Animal.java]public abstract class Animal{public String kind;public void breathe(){System.out.println("숨을 쉽니다.");}public abstract void sound();{ //추상메소드} 추상메소드는 추상클래스에서만 선언할 수 있는데 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를 말한다. 추상클래스를 설계할 때, 하위 클래스가 반드시 실행 내용을 채우도록 강요하고 싶은 메소드가 있을 경우, 해당 메소드를 추상 메소드로 선언하면 된다. 자식 클래스는 반드시 추상 메소드를 재정의(@Ovrride)해서 실행 내용을 작성해야 한다.[Dog.java] 추상 메소드 오버라이딩public class Dog extends Animal{ //추상클래스를 상속받아야한다.public Dog(){this.kind="포유류";}@Overridepublic void sound(){System.out.prinfln("멍멍");} //추상메소드 재정의[Cat.java] 추상 메소드 오버라이딩public class Cat extends Animal{ //추상클래스를 상속받아야한다.public Cat(){this.kind="포유류";}@Overridepublic void sound(){System.out.prinfln("야옹");} //추상메소드 재정의이제 이것을 실행시켜야한다 . 실행시키기 위해 AnimalExample.java 만들어서 실행 해 보겠다.[AnimalExample.java]public class AnimalExample{public static void main(String[] args){//sound()메소드를 호출하는 방법 1번째Dog dog=new Dog();Cat cat=new Cat();dog.sound();cat.sound();System.out.println("-----------");//2번째Animal animal=null;animal=new Dog();animal.sound();animal=new Cat();animal.sound();System.out.println("-----------");//3번째animalSound(new Dog());animalSound(new Cat());}public static void animalSound(Animal animal){animal.sound();}}첫번째는 가장 일반적인 방식으로 Dog.Cat변수를 호출했고두번째는 Animal변수로 타입 변환해서 sound()메소드를 호출했다.자식타입은 부모타입으로 자동 타입변환이 될 수 있고, 메소드가 재정의되어 있을경우 재정의된 자식 메소드가 호출되는 상속의 특징이 그대로 적용된다.세번째는 부모타입의 매개 변수에 자식 객체를 대입해서 메소드의 다형성을 적용했다. 매개 변수의 다형성에 대한 설명은 앞으로 포스팅하도록 하겠습니다.
2.9K
2
0