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.