IT

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

lottoking 2020. 6. 14. 10:08
반응형

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


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

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


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

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


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

편집하다:

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

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

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

(심판을 찾고)


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 시간, 새로 도입 된 버그.


나는 이것을 찾고 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 바이트로 늘어났습니다.


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

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

FK_<table1>_<table2> 

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


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


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


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


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

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

Never mind SQL92, it's ODBC compliance that really matters to today's universal database, and other vendors have addressed this better than Oracle. Even Teradata, for example, which isn't seen by many as a pervasive player, caters for TWO namespaces, with and without the quotes, the former with a 30 char limit, the latter a full ODBC implementation where weird long identifiers are catered for.

Even in the traditional large database arena, 30 characters is often a problem where names are to remain meaningful, consistent and memorable. Once you start to design specialising structures with role-named inheritance you start abbreviating abbreviations, and consistency soon dies, because for example the same root identifier rendered as a table name or a column name will in one case need further abbreviation and in the other not. If real users in significant numbers are invited on to such layers the consequences are very poor usability, and fortunately for any ageing database the main drive now is to separate user from database via object layers and BI tools.

This leaves the database layer to the DBA and the data architect teams, who are perhaps not that bothered. Working out abbreviation schemes is still a job for life, it seems.

That Oracle has not addressed this old limitation perhaps reflects mostly on the fact that it is not (yet) losing much business to its competition when it can't directly port database designs built using longer identifiers.


All the above comments are right, BUT you need to keep in mind the performance cost of longer names. In the early 1990's, when Informix set up huge billboard "Informix Faster Than Oracle!" on route 101 next to Oracle headquarters, Informix allowed table names only shorter than 18 characters! The reason is obvious -- table names in their literal form (i.e. as actual names rather than 't138577321'or something like that) are stored in the Data Dictionary. Longer names equal larger Data Dictionary, and since the Data Dictionary is read each time a query requires a hard parse, a larger data dictionary equals poor performance...


ok, the limitation exists....

but do you really NEED more than to 30 character to name a table/index/column??

when writing queries, with that limitation I STILL find some column/table names annoying. If the limit were higher I might run into tables that required a query like:

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.

I apologize for the huge words :P

참고URL : https://stackoverflow.com/questions/1378133/why-are-oracle-table-column-index-names-limited-to-30-characters

반응형