PPAS (PostgreSQL Advanced Server)에서

select - update 또는 select - delete 하는 경우 아래와 같이 트랜젝션이 겹칠 수 있다



보통 MySQL 등에선 Isolation Level 을 Serializable 로 설정 후 Select 한 대상을 Update 해서

우의 상황을 해결하는데

PPAS 에서 위와 같이 Transaction 을 처리하는 경우

could not serialize access due to concurrent update

예외가 발생할 수 있다.

 

보통 MySQL 등에서는 Serializable 상태에서 Select 하면 해당 테이블에 잠금이 생기지만

PPAS 에서는 Update 하면서 잠기기 때문인데,

1) Update 한게 다른 쓰레드(진입)에서 Select 에서 blocking 되지 않고

2) Update 된 걸 다시 Update 한 꼴이 되면서

3) 에러가 발생된다

 

PPAS 에서는 그래서

--> Isolation 설정 없이, Select ~ for update 로 데이터 추출 후, Update 를 하면 된다

--> 단 서비스의 @Transactional 이 붙은 함수 내에서 모든 처리가 끝나야 한다.

--> 단일 트랜젝션간에만 update 잠금이 발생하기 때문

 

 

추가로

PPAS 에서도 Select 에 Limit 을 사용할 수 있는데

Select * from src limit 1;

위의 경우 MySQL 에서는 src 의 clustered index, 특정 index 에 의해 일관된 순서대로 추출되지만

PPAS 에서는 order by 없이 limit 사용시 임의의 순서대로 추출된다

==> 일관된 순서가 필요시 order by 를 추가해서 사용하도록 한다

==>  order by 없을 시 랜덤하게 나오는건 버그라 아니라고 PPAS 문서에 명시돼 있음 (PPAS 뿐만 아니라 PostgreSQL 특성인듯)

 

Posted by 김모작자

댓글을 달아 주세요

Oracle 클라이언트로 많이 사용하는

SQL Developer (4.x 기준) 에서는 기본적으로 'DATE' 데이터형을 YYYY-MM-DD 등 날짜 부분만 표시한다. 그러나 Oracle 는 날짜, 시간을 Date 형식으로 표현하기에 HH:MM:SS 등을 표시해야 한다


날짜 부분을 표시하기 위해

도구 -> 환경설정 메뉴에 들어가

[데이터 베이스] 의 [NLS] 페이지에 들어가서

날짜 형식에 YYYY/MM/DD HH24:MI:SS 등 입력해 두면

시간을 볼수 있다.




Posted by 김모작자

댓글을 달아 주세요

oracle text 서비스를 만들때

CONTEXT 검색을 하기 위한 fulltext 인덱스를 만들면 주기적으로나 필요시 sync 를 맞춰줘야 하는데..

CREATE INDEX blahblah_indexing ON mytable(yourfield) INDEXTYPE IS CTXSYS.CONTEXT parameters ('Sync (on commit)') ;

위와 같이 sync (on commit) 파라미터를 전달해주면 자동으로 커밋한다.

다만, 자동으로 커밋될때마다 인덱스가 갱신되는건 좋으나, 단편화와 commit 속도 저하가 문제가 된다.. 고로 업데이트가 적은 경우에만 사용하도록 한다.

참고 : http://docs.oracle.com/cd/B28359_01/text.111/b28304/csql.htm#BJECABDI

꼭 주의해야 할 부분은

※ 테이블에 데이터가 있는 상태에서 저 파라미터를 전달하면 에러가 난다. 꼭 없는 상태에서 만들도록 한다


 

Posted by 김모작자

댓글을 달아 주세요

  1. 홍길동 2021.01.21 16:59  댓글주소  수정/삭제  댓글쓰기

    와...... 정말 감사합니다.

mysql 5.6 을 윈도우에 설치해서 사용하다가 full text 설정을 변경하려고..
정확히는 full text 검색할때 최소 단어 길이를 줄이려는데
c:\program files\mysql\mysql 5.6 폴더에 있는  my.ini , my-default.ini 파일을 아무리 고쳐도

SHOW VARIABLES LIKE 'ft_min_word_len'
이걸로 확인하면 안나왔다.
구글링해도 my.ini 에 있는걸 바꾸라고만... 헌데 포기하려다가
번들로 따라오는 MySQL Workbenth 에 Options File 에 보니!!!!
설정 파일이 무려!
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini
에 있단다 ... OTL..
윈도우 서비스 엔트리에도 그렇고 죄도 Program Files 에 있다고 하고선!!!!
썩을 놈의 오라클 이 쉐이들;;
저 폴더에 들어가서 찾아서 구글링한대로 고치면 된다...

 

Posted by 김모작자

댓글을 달아 주세요

#1.
SELECT abs(CAST(CRYPT_GEN_RANDOM(4) AS INT))

#2.
CREATE FUNCTION dbo.MyRAND(@Seed as bigint) RETURNS float(53) AS
BEGIN
   
--Sample: SELECT dbo.MyRAND(DEFAULT), dbo.MyRAND(DEFAULT), dbo.MyRAND(12345) FROM ( SELECT 1 AS ID UNION SELECT 2 UNION SELECT 3 ) as ThreeRows
   
DECLARE @Return as float(53)
   
IF @Seed = 0
       
SET @Return = (Cast(CRYPT_GEN_RANDOM(8) as bigint) + POWER(Cast(2 as float(53)), 63)) / POWER(2.0, 64)
   
ELSE
       
SET @Return = (Cast(CRYPT_GEN_RANDOM(8, CAST(@Seed AS varbinary(8))) as bigint) + POWER(Cast(2 as float(53)), 63)) / POWER(2.0, 64)
   
RETURN @Return
END

 

 

참고(original article) : http://stackoverflow.com/questions/8378587/why-is-rand-not-producing-random-numbers

Posted by 김모작자

댓글을 달아 주세요

새로운 페이징 기법

DB 2013. 10. 28. 17:17

MSSQL 에서만 되는거 같은데...
임시 테이블 없이 SET ROWCOUNT 만으로 간결하지만 엄청난 성능을 보여주는 쿼리를 찾았다

원문은 http://www.4guysfromrolla.com/webtech/042606-1.shtml
여기를 참고하면 된다. 글 하단에 벤치마킹한 데이터가 있는데 잘못 측정했나 싶을정도로 성능 차이가 난다

내가 테스트 해 본 쿼리는

alter procedure TEST_paging
 @PageNo int
as
begin
 declare @PageSize int; set @PageSize = 10;
 declare @FileNo bigint, @RowsBefore int;

 set @RowsBefore = (@PageNo - 1) * @PageSize + 1;

 -- 해당 페이지의 첫번째 레코드의 PK를 찾는다
 set rowcount @RowsBefore;
 select @FileNo = FileNo from Files;

 -- 페이지에 표시할 갯수만큼 레코드를 읽는다
 set rowcount @PageSize;
 select * from files where FileNo > @FileNo;

 set rowcount 0;
end

Files 테이블에 FileNo 가 PK 로 있고 부수적인 필드가 있다고 가정할때 위와 같은 코드로
페이징을 구현하였다.

주의해야할 점은 @FileNo 처럼 순서를 잡을 수 있는 필드가 있어야 한다

What a nice query.

 

Posted by 김모작자

댓글을 달아 주세요