Oracle varchar2에 정의 매개 변수로 필수 크기가 있는 이유는 무엇입니까?
이 Oracle의 .VARCHAR2.
저는 그것이 구속을 위한 것이라고 생각합니다.에서 이 를 선택적으로 사용하는 이 더 나은 옵션입니까?NUMBER데이터 유형?
조정하는 데 , 그 이 전테이크더큰조데크종정의 때문입니다. 때때로 값이 크기 정의보다 크기 때문입니다.VARCHAR2기둥.
유을정는것동다니일합은의하형의 하는 것도 VARCHAR2(10) 또는VARCHAR2(1000).
제 생각에는, 그것은 불필요한 제약인 것 같습니다.그렇지 않다면, 이 제약이 유용한 결과를 가져온 실제 사례를 알고 계십니까?그리고 왜 그런 선언을 하지 않습니까?NUMBER ?type ?type
varchar2(10) 또는 varchar2(1000)의 유형을 정의하는 것은 동일합니다.
아니요, 그것은 전혀 같은 것이 아닙니다.
- 열의 길이는 개발자가 화면을 작성하는 데 유용한 메타데이터입니다.
- 마찬가지로 Toad 및 SQL Developer와 같은 자동 쿼리 도구는 결과를 렌더링할 때 열의 길이를 사용합니다.
- 데이터베이스는 PL/SQL 컬렉션에 메모리를 할당할 때 변수의 길이를 사용합니다.메모리가 PGA에서 슈퍼사이즈로 나오기 때문에 서버의 메모리가 부족하여 가변 선언으로 인해 프로그램이 실패할 수 있습니다.
- PL/SQL 프로그램의 단일 변수 선언과 유사한 문제가 있는데, 컬렉션이 문제를 증가시키는 경향이 있을 뿐입니다.
- 크기가 큰 열은 복합 인덱스에 문제를 일으킵니다.다음은 8K 블록이 있는 데이터베이스에 있습니다.
....
SQL> create table t23 (col1 varchar2(4000), col2 varchar2(4000))
2 /
Table created.
SQL> create index t23_i on t23(col1,col2)
2 /
create index t23_i on t23(col1,col2)
*
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded
SQL>
그러나 무엇보다도 열 크기는 오류 검사의 한 형태입니다.열 길이가 10자여야 하는데 일부 자율 프로세스에서 1000자를 로드하려고 하면 잘못된 것입니다.프로세스가 실패해야 하므로 더프 데이터를 로드하는 이유를 조사할 수 있습니다.대안은 쓰레기로 가득 찬 데이터베이스이며, 만약 그것이 필요했다면 우리는 모든 사람에게 엑셀을 주고 그것을 끝냈어야 했습니다.
우리가 과소평가한 것으로 밝혀졌을 때 열 크기를 변경하는 것은 피곤할 수 있는 것이 사실입니다.그러나 이러한 문제는 자주 발생하지 않으며 가변 길이를 하드 코딩하는 대신 PL/SQL에서 %TYPE 및 SUBTYPE 선언을 사용하여 많은 문제를 완화할 수 있습니다.
"숫자 유형에 해당 선언이 없는 이유"
숫자가 다릅니다.우선 숫자의 최대 크기가 텍스트에 해당하는 크기(보증 정확도 38자리)보다 훨씬 작습니다.
그러나 중요한 차이점은 Oracle이 숫자 값을 과학적 표기법으로 저장하기 때문에 숫자의 산술적 크기와 사용하는 스토리지 공간 사이에 직접적인 관계가 없다는 것입니다.
SQL> select vsize(123456789012345678901) n1
2 , vsize(999999999999999999999999999999) n2
3 , vsize(0.000000000000000000001) n3
4 , vsize(1000000000000000000000000) n4
5 from dual
6 /
N1 N2 N3 N4
---------- ---------- ---------- ----------
12 16 2 2
SQL>
그럼에도 불구하고, 특히 정수, 예를 들어, 돈을 다룰 때 가능한 한 규모와 정밀도를 지정하는 것이 좋은 관행으로 남아 있습니다.
관계형 데이터베이스가 개발된 역사적 맥락을 기억하는 것이 중요하다고 생각합니다.개발 당시(70년대 후반~80년대 초반) 일반적으로 사용 가능한 컴퓨터는 현재보다 훨씬 작고(메모리 및 디스크 공간 측면에서) 성능이 떨어졌으며(CPU 측면에서) 이러한 리소스를 관리하는 것은 필연적으로 중요한 문제였습니다. COBOL은 비즈니스 컴퓨팅의 공통 언어였으며, 지금도 널리 사용되고 있습니다.그리고 스몰토크와 C++와 같은 객체 지향 언어는 모든 실용적인 목적으로 알려져 있지 않았습니다.그 당시 프로그램은 각 데이터 요소에 필요한 스토리지 양을 정확하게 선언할 것으로 예상되었습니다. 예를 들어 문자열은 10바이트, 짧은 정수는 2바이트, 플로트는 4바이트 등입니다. 그래서 이 선언 스타일은 당시 새로 개발된 관계형 데이터베이스에서 사용되었습니다.더 중요한 것은 각 데이터 요소가 필요한 스토리지 양을 (암묵적으로 또는 명시적으로) 선언한다고 가정하고 이를 매우 기본적인 수준에서 관계형 엔진에 코드화했다는 것입니다.
이제 이러한 요구사항은 시간이 지나면서 다소 완화되었습니다. 적어도 디스크에 데이터를 저장하는 데 있어서는 그렇습니다.Oracle에서 NUMBER 데이터 유형은 공간을 유연하게 할당하여 값을 저장하는 데 필요한 최소 공간만 실제로 사용하고 VARCHAR2 열은 후행 공백을 저장하지 않고 실제 데이터를 저장할 수 있는 충분한 디스크 공간만 사용할 것이라고 생각합니다.VARCHAR2에 필요한 최대 스토리지 용량을 선언해야 합니다.
SYS.STANDAR 패키지를 보면 VARCHAR2 하위 유형을 선언하는 방법에 대한 아이디어를 얻을 수 있습니다.예를 들어, 길이 사양을 태킹하지 않고 사용할 수 있는 고유한 '문자열' 유형을 원하는 경우 다음을 시도할 수 있습니다.
SUBTYPE MY_STRING IS VARCHAR2(4000);
그러나 앞에서 @APC가 지적한 것처럼 문제의 열을 색인화하려면 이 점을 주의해야 합니다.
길이를 선언할 필요 없이 문자열(즉, BTW, SYS.STANDAR에 정의된 VARCHAR2의 하위 유형으로 정의됨)을 선언할 수 있다는 것에 동의합니다. 하지만 Oracle은 그렇게 작동하지 않습니다. 그리고 제가 직접 관계형 데이터베이스를 작성하기 시작할 준비가 되지 않았기 때문입니다(저는 기울어질 수 있는 풍차를 가지고 있습니다).감사합니다 :-) 저는 현상 유지에 따르겠습니다.
이것이 도움이 되길 바랍니다.
모든 데이터베이스 테이블의 모든 열을 CLOB로 지정하는 것은 어떻습니까?그렇게 하면 최대 길이에 대해 걱정할 필요가 없습니다.
하지만, 진지하게:
데이터 유형 길이 제약 조건은 다른 제약 조건과 동일한 이유로 존재합니다. 테이블에 성공적으로 저장된 데이터가 사용자가 정의한 제약 조건을 준수하는지 확인하여 모든 응용 프로그램 코드에 뿌려야 하는 오류 검사의 양을 줄입니다.
char 필드처럼 디스크에 설정된 바이트 수를 할당하지는 않지만 크기 조정에는 다음과 같은 상당한 이유가 있습니다.
- 데이터 판독기의 메모리 할당(최대 행 크기 기준)
- 큰 열을 인덱싱하면 블록 크기가 실행됩니다.
- 기타...
다른 사람이 생각할 수 있는 더 많은 이유가 있겠지만, 그것들은 누군가가 선택한 과거 프로젝트에서 본 적이 있는 것들입니다.varchar2(4000)전부다.
정보를 추출하는 관점에서, 그 분야가 얼마나 큰지 아는 것은 매우 유용합니다.예를 들어, 주소를 봉투에 인쇄하거나 화면에 표시해야 하는 경우 필드의 크기를 알고자 합니다.
아니면 아주 큰 봉투를 사세요.
성능에 영향을 미칠 수 있습니다. MySQL에서는temporary tables그리고.MEMORY tables을 저장합니다.VARCHAR최대 길이까지 패딩 처리된 고정 길이 열입니다.
설계하는 경우VARCHAR필요한 최대 크기보다 훨씬 큰 열을 사용하면 필요한 것보다 더 많은 메모리를 사용할 수 있습니다.영향을 미칩니다.cache efficiency, sorting speed, etc.
그래서 당신은 당신의 현 아래에 있는 최대 길이를 줍니다.예를 들어 캐릭터 10의 최대 길이를 100 이상으로 지정하지 않도록 합니다.
언급URL : https://stackoverflow.com/questions/2241238/why-does-oracle-varchar2-have-a-mandatory-size-as-a-definition-parameter
'programing' 카테고리의 다른 글
| 단일 커밋을 여러 개발자에게 귀속시키는 방법은 무엇입니까? (0) | 2023.07.04 |
|---|---|
| 유형 스크립트에서 고유한 항목으로 배열 유형을 정의하는 방법이 있습니까? (0) | 2023.07.04 |
| LFol igit repo 및 작업 복사본 강제 적용 (0) | 2023.07.04 |
| WooCommerce 제품 검색을 사용하여 특정 post_type 양식 post_type 열을 검색하는 중 오류 발생 (0) | 2023.07.04 |
| Git'fatal:새 인덱스 파일을 쓸 수 없습니다.' (0) | 2023.07.04 |