Oracle 테이블 / 열 / 인덱스 이름이 30 자로 제한되는 이유는 무엇입니까?


149

몇 년 전에 이런 종류의 한계가있을 것이지만 요즘에는이 한계를 쉽게 높일 수 있습니다. 우리는 객체에 대한 명명 규칙을 가지고 있지만, 특히 외래 키의 이름을 지정할 때이 한계에 도달하는 경우가 항상 있습니다.

왜 이것이 이것이 더 큰 크기가 아닌지 또는 11g에서 더 큰지 알고 있습니까?


분명히 대답은 방어 적으로 코딩되지 않은 현재 스크립트를 중단한다는 것입니다. 나는 이것이 매우 걱정스러운 일이라고 말합니다. 오라클은 데이터베이스 가 되려고 노력하고 있습니다 . 확실히 이것은 반드시 개선 해야하는 종류입니다. 그렇지 않으면 제품이 수천 컷으로 죽을 것입니다.

사내에서 이런 종류의 이의를 볼 때마다 총알을 물고 정리해야 할 때라고 생각합니다. 사람들이 Oracle 버전을 업그레이드 할 때 확인하거나 유지 관리하지 않는 스크립트를 실행하는 경우 해당 결과로 인해 결과를 겪게합니다. 호환성 플래그를 제공하고 크기를 4000으로 늘린 다음 이름을 확인하기 위해 끊임없이 30으로 계산 해야하는 객체를 만들 때 낭비되는 시간을 절약하십시오.


3
한계가 있어야합니까? 그것을 64 문자로 만들면 아마도 128이 아닌 이유를 묻는 사람을 찾을 수있을 것입니다. 문자열의 길이는 얼마입니까?
의장

45
사실이지만 30은 매우 짧은 문자열입니다. 왜 Varchar2의 크기 인 4000이 될 수 없습니까? 오라클은 일단 쿼리를 파싱 한 후에 얼마나 오래 신경을 쓰나요?
Chris Gill

22
@ TheChairman PostgreSQL은 나를 63 자로 제한하며 그 길이 제한에 문제가 없었습니다. 내 이름이 잘 맞을만큼 충분히 크며 더 긴 이름을 고려하고 있다면 가독성에 대한 부정적인 영향에 대해 생각할 때입니다. 반대로, 나는 종종 Oracle에서 이름 길이 제한에 빠지고 30 자 제한으로 인해 내 이름의 가독성 을 줄 이도록 강요 받습니다. 몇몇 사람들은 64 글자 제한에 대해 불평하지만 많은 사람들은 이미 30 글자 제한 때문에 문제가 있습니다. 유스 케이스의 99 %를 충족시키는 데 관한 것이며 Oracle은 여기서 실패합니다.
jpmc26

1
오라클, 넌 공룡이 되었어! Microsoft는 SQL 서버를보다 친숙하게 만들기 위해 좋은 일을하고 있습니다. 이제 이름 길이 제한을 완화하십시오.
user3454439

1
Oracle 12cR2로 빨리 넘어 가면 이제 30이 아니라 128 바이트 입니다.
Stefan L

답변:


71

나는 그것이 ANSI 표준이라고 생각합니다.

편집하다:

실제로 SQL-92 표준이라고 생각합니다.

이후 버전의 표준은 선택적으로 128 개의 문자 이름을 허용하는 것으로 보이지만 Oracle은 아직이 문자를 지원하지 않습니다 (또는 30자를 허용하는 한 부분적으로 지원합니다).

이 페이지에서 "F391, 긴 식별자"를 검색하십시오 ... http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/ap_standard_sql001.htm

(심판을 찾고)


1
흠, 그것은 내가 그 문서를 읽는 방법이 아닙니다. F391은 SQL / Foundation 스펙의 항목이며 무엇이든 30 자 제한으로 Oracle이 부분적으로 지원한다고 말합니다.
skaffman

21
부분적 준수. 좋은 농담 이었어. "나사의 나사는 미터법이 아닌 것을 제외하고는 미터법 표준을 부분적으로 준수합니다."
Jens Schauder

5
F391 사양을 자세히 읽지는 않았지만 "긴 식별자"는 식별자 길이가 30에서 128로 증가했음을 의미한다고 가정합니다. 약간 건방진. 당신은 새로운 표준을 지원하지 않습니다, 당신은 여전히 ​​이전 표준을 지원합니다 (새로운 표준으로가는 길의 25 %이지만) 이해가 되셨습니까? !!?
cagcowboy

7
SQL-92 표준은 여기 contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt 이지만 "17.1 SQL 항목 디스크립터 영역 설명"섹션을 읽으면 이름 및 스키마와 같은 식별자는 최소한 128을 허용해야합니다. 문자.
Rick

46
Oracle 팬보이가 30 개 이상의 문자 식별자의 유용성을 보지 못한다는 사실은 혼란 스럽습니다. "이름을 의미 있고 설명하기 쉽게하고 낙타 문자 대신 밑줄을 사용하고 30 자 미만으로 유지하십시오." 그것은 30자를 넘지 않을 것입니다. 아미 라이트? 약어를 약어처럼 사용하고 이름이 의미가 없을 경우 하루 종일 문서를 읽거나 업데이트하십시오.
Adam Jones

45

SQL 표준에서 파생되었다는 cagcowboy의 관점 외에도 (역사적으로, Oracle이 SQL의 표준화를 앞당기 고 나서 오라클의 결정이 SQL 표준으로 이어질 것이라고 생각합니다.) 더 긴 식별자를 허용하지 않으려는 많은 부분이 식별자가 30 자라고 가정하는 수백만 개의 사용자 지정 스크립트가있는 수백만 개의 DBA가 있다는 사실을 인식합니다. 다음과 같은 코드 행을 모두 허용

  l_table_name VARCHAR2(30);
BEGIN
  SELECT table_name
    INTO l_table_name
    FROM dba_tables
   WHERE ...

15 년 전에 DBA DBA_TABLES.TABLE_NAME%TYPE가 스크립트 대신 VARCHAR2 (30)를 사용했기 때문에 갑자기 깨 졌습니다. 오라클 만이 다양한 패키지와 구성 요소에서 수년에 걸쳐 이러한 종류의 작업을 수행 한 수천 곳의 장소에 베팅하고 싶습니다. 모두를 개조하는 것은 더 이상 식별자를 지원하기 위해 기존 코드를 거의 확실하게 생성 할 엄청난 프로젝트가 될 것이라고 방법 은 이익을 생성하는 것보다 더 많은 개발 시간 비용, QA 시간, 새로 도입 된 버그.


13
+1 이것은 오라클의 많은 레거시 디자인 문제 중 하나 일 것입니다.
skaffman

43
DBA가 30으로 다시 세분화 할 수 있도록 플래그를 추가하십시오. 이와 같은 레거시 문제는 항상 직면하고 정렬되어야합니다. 그렇지 않으면 전체 코드베이스를 무너 뜨리게됩니다. 다른 것에
Chris Gill

6
수백만 줄의 DBA 작성 코드뿐만 아니라 많은 오라클 내부 코드도 의심의 여지가 없습니다. 이 주제는 스티븐 페 이어 슈타인 (Steven Feuerstein)과의 세션에서 나 왔으며, 그는 그들이 그것을 바꿀 것이라고 생각하지 않았다고 말했다.
Matthew Watson

10
그들은 그것을 새로운 기능으로 정확하게 나눌 수 없었습니다. 그들은 한도를 연장하는 데 많은 시간을 할애하고 "지금 30 자 이상의 이름을 사용할 수 있습니다!"라고 발표했습니다. 그들은 웃고있는 주식 일 것이다.
skaffman

9
여전히 15 살짜리 스크립트를 사용하고 있다면, 뭔가 잘못되었습니다 . 또한, 그것들을 고치는 것은 한 번의 비용이 될 것입니다 (지속적인 유지 보수를 위해 더 많은 비용이들 것입니다). @skaffman 그들은 걱정 하지 않는 한 이미 그것을 고치지 않고 (부울이나 자동 증가 유형이없는 것과 같이 현대 시대에 한심한 다른 디자인 결정의 여지가 많은) 웃고있는 주식입니다 .
jpmc26

11

나는 이것을 찾고 Google을 통해이 질문을 찾았지만 Oracle 12c Release 2 (12.2)부터는 더 이상 엄격하게 적용되지 않는다는 것을 알았습니다. ( https://oracle-base.com/articles/12c/long-identifiers-12cr2 )

어느 시점에서 모든 DBA 또는 개발자는 오브젝트 이름의 30 자 제한으로 인해 문제점이 발생하는 지점에 도달했습니다. 이 제한은 SQL Server 또는 MySQL에서 Oracle로 마이그레이션 프로젝트를 수행 할 때 매우 고통 스러울 수 있습니다. Oracle Database 12cR2에서 대부분의 식별자의 최대 길이는 이제 128 자입니다.

( http://blog.dbi-services.com/oracle-12cr2-long-identifiers/ ) 에 따르면 12.2의 새로운 기능입니다 . 그 게시물에 따르면 12.1은 여전히 ​​30 자로 제한되어있었습니다.


편집 : 변경 사항을 설명하는 공식 Oracle 문서에 대한 링크가 있습니다. ( https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C )

Oracle Database 12c Release 2 (12.2)부터는 대부분의 데이터베이스 객체 유형에 대한 식별자 이름의 최대 길이가 128 바이트로 늘어났습니다.


128 바이트 / 4 바이트 (유니 코드) = 32 자 적어도 내 이해는 유니 코드가 아닌 문자의 경우 4 바이트가 드물지 않다는 것입니다. 그것이 그들이 유니 코드를 지원한다는 것을 의미하는지 궁금해야합니다. 마찬가지로 VARCHAR2(2)2 문자가 아니라 2 바이트를 의미합니다.
Seth

1
요점을 알지만 문자 대 바이트는 데이터베이스 문자 세트에 따라 다릅니다. 이 설정에 따라 char 데이터 유형 (예 : varchar2)의 인코딩과 db 식별자의 인코딩이 결정됩니다. 이는 nchar 데이터 유형에 사용되는 자국 문자 세트와 대조됩니다. 예, 식별자가 문자 당 4 바이트를 사용하는 인코딩을 사용하는 경우 (DB 문자 세트로 사용할 수 있다고 가정) 이제 7 대신 32가됩니다. 그러나 대부분의 유스 케이스의 경우 식별자는 다음과 같습니다. 1 바이트 문자
칸 무리

6

식별자 길이 제한의 실제 필요성을 감안할 때, 좋은 디자인은 이름이 서로 접두어 및 접미사로 결합 될 때 실제 이름의 길이를 제한하여 상한선에 닿지 않도록합니다.

예를 들어 외래 키 제약 조건의 명명 규칙

FK_<table1>_<table2> 

테이블 이름을 13 자 이하로 제한합니다. 대부분의 데이터베이스에는 더 많은 접두사와 접미사가 필요하므로 테이블 이름의 길이가 더 제한됩니다.


5

제한 조건 위반은 255 자로 제한되며 대부분의 클라이언트가 오류를 표시하기 위해 사용하는 SQLERRM으로보고됩니다. 허용 가능한 제약 조건 이름의 크기를 늘리면 위반에 대해보고하는 기능 (특히 PL / SQL 코드의 여러 계층을 통해 제약 조건 위반이 발생한 경우)에 큰 영향을 줄 것으로 생각됩니다.


그럼 테이블을 넓게 만드시겠습니까?
skaffman

2
테이블이 아니지만 클라이언트 소프트웨어가 실제로 데이터베이스에서 오류를 얻는 방법.
Gary Myers

@skaffman SQLERRM 길이는 API / ABI 사양입니다. 이를 변경하면 지구상의 모든 OCI 드라이버를 패치해야합니다 (다른 버퍼 오버런). OCI 13에서 buflen을 먼저 늘리고 OCI 10 클라이언트가 더 이상 지원되지 않는 Oracle 15와 같은 서버에서 변경 사항을 슬롯에 넣을 수 있다고 생각합니다. (아마도 지금도 고려하고 있지만 oracle 메이저 버전은 몇 년마다 릴리스됩니다. 그런 다음 앱이 다른 서버 / 클라이언트로 마이그레이션 될 때 스크립트 / 애플리케이션 업그레이드 문제가 발생할 수 있습니다).
cowbert

4

30 자 식별자 길이는 1950 년대 후반에 표준화 된 COBOL에서 온 것으로 생각합니다. COBOL 프로그램은 SQL의 주 사용자 (및 그 이전의 SEQUEL (및 그 이전의 QUEL))이므로 ID 길이에 대한 적절한 숫자처럼 보였어 야합니다.


5
Oracle의 첫 번째 버전은 Fortran으로 작성되었으며 ID 길이 제한이 31이라고 생각합니다. 아마도 관련이있을 것입니다.
David Aldridge

4

이러한 '제약'은 모두 70 년대의 프로세서 아키텍처에 의해 부과 된 제한 사항에 대한 응답보다 남았습니다. 그 이후로 프로세서는 이러한 제한이 더 이상 필요하지 않은 수준으로 발전했습니다. 그들은 그냥 남았습니다. 그러나 그것들을 바꾸는 것은 RDBMS의 작가들에게 큰 거래입니다. 이러한 길이 제한은 모든 다운 스트림 변경에 영향을 미치므로 더 긴 프로 시저 이름이 더 긴 프로 시저 이름으로 인해 예외보고, 데이터 사전 등과 같은 다른 많은 것들을 깰 수 있다고 말할 수는 없습니다. Oracle RDBMS를 크게 다시 작성해야합니다.


2

이 질문에 대한 직접적인 대답은 Oracle 스타일은 30 개가 많은 것처럼 보이는 오래된 아이디어에서 물려 받았으며, 일반적인 데이터베이스의 실제 메모리에서 딕셔너리 캐시를 고정 해제 할 위험이 훨씬 커졌을 것입니다.

반대로 ODBC 네임 스페이스는 Excel 시트의 테이블을 구문 분석하여 데이터 세트를 빠르게 추출하고 시트 테이블 표제에서 가져온 열 이름으로 데이터베이스 테이블을 자동으로 빌드하는 매우 다른 위치에서 제공됩니다. 그렇게 생각하면 임베디드 캐리지 리턴과 특수 문자 및 대소 문자를 포함하는 식별자도 허용됩니다. 오늘날의 데이터 분석가들이 생각하는 방식을 모델링하기 때문에 합리적인 추상화입니다.

오늘날의 범용 데이터베이스에 중요한 것은 ODBC 규정 준수 인 SQL92를 염두에 두지 말고 다른 공급 업체는 Oracle보다이 문제를 더 잘 해결했습니다. 예를 들어, 많은 사람들에게 널리 퍼져 있지 않은 Teradata조차도 인용 부호가 있거나없는 TWO 네임 스페이스를 제공하고 전자는 30 자 제한을 사용하고 전자는 이상한 긴 식별자가 제공되는 전체 ODBC 구현을 제공합니다. .

기존의 대형 데이터베이스 분야에서도 30 개의 문자는 종종 이름이 의미 있고 일관성 있고 기억에 남는 문제입니다. 역할 이름 상속을 사용하여 특수 구조를 설계하기 시작하면 약어가 시작되고 곧 테이블 이름이나 열 이름으로 렌더링 된 동일한 루트 식별자가 추가 약어가 필요하고 다른 경우가 아니기 때문에 일관성이 곧 사라집니다. . 상당한 수의 실제 사용자가 이러한 계층에 초대되면 결과는 사용성이 매우 좋지 않으며 다행히 모든 노후화 데이터베이스의 경우 이제 주 드라이브는 개체 계층과 BI 도구를 통해 사용자를 데이터베이스와 분리하는 것입니다.

이로 인해 데이터베이스 계층은 DBA와 데이터 아키텍트 팀에게 맡겨져있을 것입니다. 약어 체계를 개발하는 것은 여전히 ​​삶의 일입니다.

오라클이이 오래된 한계를 해결하지 못했다는 것은 아마도 더 긴 식별자를 사용하여 구축 된 데이터베이스 설계를 직접 이식 할 수 없을 때 경쟁에서 많은 비즈니스를 잃지 않고 있다는 사실에 주로 반영된 것입니다.


오라클이 아닙니다. ODBC는 Java가 아닌 Microsoft 아기입니다. 그것은 여전히 OCI와 연결된 별도의 헬퍼 라이브러리입니다 (instantclient가 어떻게 배포되는지 살펴보십시오-ODBC가 instantclient와 작동하게하려면 OCI 드라이버와 ODBC instantclient zip이 모두 필요합니다). Oracle의 기본 클라이언트 플랫폼 (레거시 Pro * C / C / C ++ 제외)은 JDBC가 아니라 ODBC가 아닌 OCI에 직접 연결됩니다.
cowbert

1

위의 모든 의견이 맞지만 더 긴 이름의 성능 비용을 명심해야합니다. 1990 년대 초 Informix가 "Informix Faster보다 Oracle보다 빠른 광고판"을 설립했을 때 Oracle 본사 옆의 루트 101에서 Informix는 18 자 미만의 테이블 이름 만 허용했습니다! 그 이유는 명백합니다. 리터럴 형식의 테이블 이름 (예 : 't138577321'이 아닌 실제 이름 또는 이와 유사한 이름)이 데이터 사전에 저장됩니다. 긴 이름은 더 큰 데이터 사전과 동일하며 쿼리에 하드 구문 분석이 필요할 때마다 데이터 사전을 읽으므로 더 큰 데이터 사전은 성능이 저하됩니다.


7
쿼리 구문 분석의 경우와 달리 수십만 번 수행하지 않는 한 현대적인 소프트웨어에서 짧은 문자열을 정확하게 일치시키는 데 병목 현상이 발생하는 이유는 없습니다. Oracle의이 부분이 처음 설계 될 때 크기 성능 고려 사항이 중요했을 수도 있지만 요즘에는 실제로 관련이 없습니다.
Sarah G

-7

좋아, 한계가 존재합니다 ....

그러나 테이블 / 인덱스 / 열의 이름을 지정하려면 실제로 30 자 이상이 필요합니까?

쿼리를 작성할 때이 제한으로 인해 일부 열 / 테이블 이름이 성가 시게됩니다. 제한이 더 높으면 다음과 같은 쿼리가 필요한 테이블이 발생할 수 있습니다.

select unique_identifier_column, 
time_when_the_user_remembered_to_change_the_row_in_the_receipt_table, 
foreign_key_to_the_ap_invoice_distributions_history_table_related_to_the_all_rows_table 
from ap_invoices_really_really_all_all_rows_present_in_this_ebs_table.

나는 거대한 단어에 대해 사과한다 : P


29
외래 키 이름을 조인하는 테이블과 열의 이름으로 이름을 지정할 수 있으면 좋을 것입니다. 따라서 외래 키 예외가 발생하면 오류를 일으킨 열을 찾을 필요가 없습니다. 오라클은 다시 그 정보를 알려줄 수 있습니다.
Chris Gill

10
일반적으로 30 자이면 충분하지만 30 자 이상이 필요한 이유는 여러 가지가 있습니다. 때때로 테이블 이름은 의미가있을 정도로 상세해야합니다. 예를 들어,이 테이블 호출 sch_PatternRunTimeException이 있으며 정확히 30 자입니다. 이제 미러링 테이블 호출 sch_DevPatternRunTimeException을 추가해야합니다. 이 추가 3 문자 명명 표준은 Oracle에서 작동하지 않으며 MSSQL에는 아무런 문제가 없습니다. 이로 인해 새로운 이름이 나옵니다. 이름 바꾸기 테이블은 가능하지만 고객 운영에 영향을 미치므로 피하려고합니다.
23

6
가능한 경우 99.9 %에서 +30자가 성가 신다고해서 다른 0.1 %가 편리하다는 의미는 아닙니다.
René Nyffenegger

14
미끄러운 경사 논쟁. 영숫자 4 자 제한으로 인해 100 만 개 이상의 테이블 조합을 얻을 수 있으므로 아무도 4를 초과하여 실제로 "필요"하지 않습니다. 그리고 실제로 30자가 아니며 30 자 미만입니다. 파스칼 케이스 이름 지정 규칙은 대소 문자를 구분하지 않고 밑줄로 구분 된 이름으로 대체해야하기 때문에 30 자 미만입니다. 다양한 접두사 / 접미사와 결합하면 20 자까지 가능합니다. 탄탄한 색인 이름이 약어와 밑줄로 가득 찬 위반 오류로 반향되지 않는 사람은 누구입니까?
b_levitt

이 문제를 해결하지 않는 데 동의했습니다. 일반적으로 사람은 더 긴 열 이름이 필요하지 않지만 개체 이름이 자동으로 생성되는 경우가 많이 있습니다.
fool4jesus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.