2012-05-23 2 views
0

현재 작업중인 프로젝트는 Oracle DBMS를 사용하여 데이터를 저장합니다. 개발하는 동안 날짜 정보가 날짜 필드에 저장되지 않지만 VARCHAR2 열에서 이상한 서식이 발견되었습니다. 예를 들어,이 표를 보면 :날짜/시간 데이터를 숫자로 저장

CREATE TABLE "A_TABLE" 
    ( 
    "OSERC_FEC_INICIO_OS"   VARCHAR2(14 BYTE), 
    "OSERC_FEC_FIN_OS"    VARCHAR2(14 BYTE), 
    "OSERC_FEC_REGISTRO_PETICION" VARCHAR2(14 BYTE), 
    "OSERC_FEC_APROBACION_PETICION" VARCHAR2(14 BYTE), 
    "OSERC_FEC_LIQUIDACION_OS"  VARCHAR2(14 BYTE), 
    "OSERC_FEC_EJECUCION_OS"   VARCHAR2(14 BYTE), 
) 

필드 OSERC_FEC_REGISTRO_PETICION, OSERC_FEC_APROBACION_PETICION, OSERC_FEC_LIQUIDACION_OSOSERC_FEC_EJECUCION_OS 저장 정보를 날짜 만 VARCHAR2 컬럼으로 선언됩니다. 데이터를 확인하면 해당 정보를 저장하기 위해 형식이 YYYYMMDDHHMMSS임을 알 수 있습니다.

WHERE 절에서이 날짜를 사용하는 쿼리를 작성해야하기 때문에 걱정이됩니다. 그 방법으로 인덱스 성능이 무엇인지 확신 할 수 없습니다. 그래서, 제가 언급 한 디자인에 관련된 문제는 무엇입니까? VARCHAR2 대신 NUMBER를 사용하는 것이 더 좋을 것입니다.

+4

아니요 날짜가 아니었다면 더 좋을 것입니다. –

+0

테이블/뷰 등을 만들 때 명시 적으로 열을 인용하지 마십시오. 더 많은 문제가 발생합니다. 인용하지 않으면 모든 것이 대문자로 간주되지만 (아무리 입력해도) 아무 것도 할 필요가 없습니다. 또한 많은 타이핑을 절약 할 수 있습니다. – Ben

답변

5

날짜가 날짜로 저장되어 있다면 훨씬 좋을 것입니다. 문자열이 아닌 숫자로 저장하면 다른 일련의 문제가 발생합니다.

문자열로 저장된 날짜가 전혀 사용되지 않는 경우 열의 인덱스를 사용하려면 매개 변수로 사용하는 날짜를 적절한 형식의 문자열로 변환 한 다음 의존해야합니다 특정 형식의 문자열 정렬이 실제 날짜의 예상 정렬 순서와 일치한다는 사실에 유의하십시오. 문자열을 날짜 또는 숫자와 비교해 보면 암시 적 데이터 형식 변환이 발생하지만 인덱스를 사용할 수없고 최악의 경우 잘못된 결과 나 오류가 발생하기 때문에 성능상의 문제가 발생할 수 있습니다.

데이터 형식 변환을 피하면 잘못된 데이터 형식을 사용할 때 최적화 프로그램이 카디널리티를 예측하는 데 많은 어려움을 겪게되므로 성능 문제가 발생할 수 있습니다. 예를 들어, Oracle은 2012 년 1 월 1 일에서 2013 년 1 월 1 일 사이에 365 일 (또는 8760 시간 또는 525600 분)이 있음을 알고 있습니다. 반면에 '20120101000000'과 '20130101000000'사이에는 수십억 개의 가능한 문자열이 있습니다. 이로 인해 옵티마이 저가 원하는 인덱스를 사용하지 않게하거나 (또는 ​​그 반대로) 잘못된 조인 유형을 사용하게 할 수 있습니다.

+0

카디널리티 평가를 결코 고려하지 않았을 것입니다. –

+0

카디널리티 외에도 NUMBER 필드를 사용하여 날짜를 저장하는 데 다른 문제가 있습니까?몇 시간 전에 기사를 읽었습니다. 그 접근법을 추천했습니다. –

+0

@CarlosGavidia - 문자열을 날짜로 저장하는 것만으로는 1000 년 전에는 사용할 수 없었던 것으로 간주합니다 (이후 0의 앞부분이 잘 리게됩니다) . 문자열과 같은 데이터 유형 변환 및 카디널리티 문제가 있습니다. 날짜의 구성 요소를 처리하는 연산은 문자열로 변환하거나 덜 분명한 수학 연산을 사용해야합니다 (즉, trunc (dt/10000) * 10000). –

1

일반적으로 날짜로 저장하면 더 좋습니다. 당신은 사용하여 변환 할 수 있습니다

to_char(<field>, <format string>) 

그리고 형식 문자열 'YYYYMMDDHHMISS'작품을 생각하지만 난 긍정적 아니에요.

그러나이 형식을 선택한 이유가있을 수 있습니다. Oracle은 날짜/시간을 숫자로 저장합니다. 년, 월, 일, 시간 분, 초를 추출하려면 약간의 수학적 조작이 필요합니다. 처리 환경에 따라 하위 문자열 연산을 사용하여 날짜 구성 요소를 추출하는 것이 훨씬 쉬울 수 있습니다.

내 생각 엔 코드에서이 필드를 사용하는 경우 문자열 연산이 사용되는 여러 예제가 있습니다. 이는 의도적 인 설계 결정과 같아서, 변경하기 전에 사물을 신중히 확인하십시오 (더 나은 해결책이 무엇인지).