Oracleのテーブル/列/インデックス名が30文字に制限されているのはなぜですか?


149

何年も前にこのような制限があったことは理解できますが、今日では確かにこの制限を簡単に増やすことができます。オブジェクトには命名規則がありますが、特に外部キーの命名では、この制限に達した場合に必ず発生する場合があります。

これがそれほど大きくない理由を誰かが実際に知っていますか?それとも11gでもっと大きいのですか?


どうやら答えは、防御的にコーディングされていない現在のスクリプトを壊すということです。これは非常に心配なことだと私は言います、Oracleはデータベースます、確かにこれはあなたが絶えず改善しなければならない種類のことです。

社内でこの種の異議を目にするときはいつでも、弾丸を噛んで整理する時がきたと思います。Oracleのバージョンをアップグレードするときにチェックも保守もしないスクリプトを実行している場合は、その選択の結果に苦しむことになります。サイズが4000までの互換性フラグを提供すると、名前が「OK」であることを確認するために常に30まで数える必要があるオブジェクトを作成する際の無駄な時間を節約できます。


3
限界がある必要があるので?64文字にすると、128でない理由をたずねられる人がいるかもしれません。文字列の長さはどれくらいですか?
会長、

45
真ですが、30は非常に短い文字列です。なぜそれが4000(Varchar2のサイズ)にならないのですか?Oracleは、クエリを解析した後の時間を本当に気にしているのですか?
クリス・ギル

22
@TheChairman PostgreSQLでは63文字に制限されており、その長さの制限に問題があったことはありません。私の名前が収まるのに十分な大きさです。長い名前を検討している場合は、読みやすさへの悪影響について考え始める時間です。反対に、私はOracleで名前の長さの制限に遭遇することが多く、30文字の制限のために自分の名前を読みにくくすることを余儀なくされています。64 文字の制限について文句を言う人もいますが、30文字の制限のため、多くの人がすでに問題を抱えています。それはユースケースの99%を満たすことであり、Oracleはここで失敗します。
jpmc26 2015年

1
さあ、オラクル、あなたは恐竜になりました!マイクロソフトはSQLサーバーをより使いやすくするために良い仕事をしています。名前の長さの制限を緩和します。
user3454439 2018年

1
早送りオラクル12cR2に、それは128バイトの代わりに、30 :-)今だdocs.oracle.com/en/database/oracle/oracle-database/12.2/newft/...
ステファン・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仕様の項目であり、Oracleは30文字の制限でそれを部分的にサポートしていると私に言っています。
skaffman

21
部分的にコンプライアンス。なんて冗談でしょう。「当社のネジは、メートル法ではないことを除いて、メートル法の基準に部分的に準拠しています。」
Jens Schauder

5
私はF391仕様を詳しくは読んでいませんが、「長い識別子」は識別子の長さが30から128に増加することを意味すると(おそらく誤って)想定しています。少し生意気。あなたは新しい標準をサポートしていませんが、古い標準をサポートしています(ただし、新しい標準への道の25%はあります)。
cagcowboy 2009

7
SQL-92標準はここにcontrib.andrew.cmu.edu/~shadow/sql/sql1992.txtですが、セクション「17.1 SQLアイテム記述子領域の説明」を読んだ場合、名前やスキーマなどの識別子は少なくとも128を許可する必要があると述べています文字。
リック

46
オラクルのファンが30文字以上の識別子の有用性を認識していないという事実自体が不安になっています。「あなたの名前を意味のある/説明的なものにし、キャメルケースの代わりにアンダースコアを使用し、30文字未満にしてください。」30文字を超えることはありません。アミライト?略語を略記するのと同じで、名前が意味をなさない場合は、ドキュメントを読んだり更新したりして一日中過ごします。
アダムジョーンズ

45

cagcowboyがSQL標準から派生しているという点に加えて(歴史的には、Oracleの決定はSQL標準に先行していたため、Oracleの決定はSQL標準につながると思います)、より長い識別子を許可することへの抵抗の大部分は、何百万ものDBAが何百万ものカスタムスクリプトを持ち、すべて識別子が30文字であると想定しているという認識。次のようなコードのすべての行を許可する

  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)を使用していたため、突然中断しました。Oracleだけでも、この種のことがさまざまなパッケージやコンポーネントで何年にもわたって行われている何千もの場所があることに賭けたいと思います。長い識別子をサポートするためのコードを既存のほぼ確実に生成する驚異的なプロジェクトであろうと、すべての改造方法、それが利益を生成するよりも、より多くの開発者の時間のコスト、QA時間、および新たに導入されたバグを。


13
+1これはほぼ間違いなく、オラクルの多くのレガシー設計の障害の1つです。
skaffman 2009

43
確かに、ペアを増やして増やすときがきました。フラグを追加して、DBAが30に絞り込めるようにしてください。このようなレガシー問題は常に直面し、ソートされている必要があります。何か他のものに
クリスギル

6
何百万行ものDBAが作成したコードだけでなく、多くのOracle内部コードも間違いなくあります。この話題はスティーブン・フォイアースタインとのセッションで出てきたもので、彼らがそれを変えるとは思っていなかったと彼は言った。
マシューワトソン

10
彼らはそれを新機能として正確にトランペットすることもできませんでした...彼らは制限を延長するのに多くの時間を費やして、「30文字を超える名前を使用できるようになりました!」と発表しました。彼らは笑い株になるだろう。
skaffman 2009

9
それでも15年前のスクリプトを使用している場合何かが非常に間違っています。また、それらを修正するのは1回限りのコストになります(おそらく、継続的なメンテナンスのためにさらにいくらか必要になります)。一方、開発者は不必要に省略された名前を無期限に作成することで、時間を無駄に使い続けます。@skaffmanそれらは、私が関係している限り、それを修正しなかった(そして、ブールや自動インクリメントタイプがないなど、現代において哀れな他の多くの設計決定)ためにすでに笑い株です。
jpmc26

11

私はこれを調べていて、Google経由でこの質問を見つけましたが、Oracle 12cリリース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文字に制限されていました。


編集:これは、変更を説明するオラクルの公式ドキュメントへのリンクです。(https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C

Oracle Database 12cリリース2(12.2)以降、ほとんどのタイプのデータベースオブジェクトの識別子名の最大長が128バイトに増えました。


128バイト/ 4バイト(Unicode)= 32文字。少なくとも私の理解では、非Unicode文字の4バイトはそれほど珍しいことではありませんか?それが単にUnicodeをサポートしているというだけのことなのかどうか疑問に思う必要があります。同様にVARCHAR2(2)、2文字ではなく2バイトを意味します。
セス

1
ポイントはわかりますが、文字とバイトの違いはデータベースの文字セットによって異なります。この設定により、charデータ型(varchar2など)のエンコーディングと、db識別子のエンコーディングが決まります。これは、ncharデータ型に使用される国別文字セットとは対照的です。したがって、はい、識別子が1文字あたり4バイトを使用するようなエンコーディングを使用している場合(DB文字セットとして使用できると仮定すると)、7ではなく32になります。しかし、ほとんどのユースケースで識別子はシングルバイト文字。
Kanmuri 2017年

6

識別子の長さ制限の実用的な必要性を考えると、優れた設計は実際の名前の長さを制限して、名前が互いに、また接頭辞と接尾辞と組み合わされたときに上限に達しないようにします。

たとえば、外部キー制約の命名規則

FK_<table1>_<table2> 

テーブル名を13文字以下に制限します。ほとんどのデータベースでは、より多くの接頭辞と接尾辞が必要になるため、テーブル名の長さがさらに制限されます。


5

制約違反はSQLERRMで報告されます。SQLERRMは255文字に制限されており、ほとんどのクライアントがエラーを表示するために使用します。制約名の許容サイズを大幅に増やすと、違反について報告する機能に大きな影響を与えると思われます(特に、制約違反がPL / SQLコードのいくつかのレイヤーでバブルアップされている場合)。


それで、ええと、そのテーブルをもっと広くしますか?
skaffman 2009

2
これはテーブルではありませんが、クライアントソフトウェアが実際にデータベースからエラーを取得する方法です。
ゲーリーマイヤーズ

@skaffman SQLERRMの長さは、API / ABI仕様です。これを変更することは、地球上のすべてのOCIドライバーにパッチを適用する必要があることを意味します(他のバッファーオーバーラン)。最初にOCI 13のbuflenを増やし、サーバーをOracle 15のようなものに増やして、OCI 10クライアントがサポートされなくなるような変更をクライアントにスロットすることができます。(たぶん彼らは今それを検討しているかもしれませんが、オラクルのメジャーバージョンは数年ごとにしかリリースされません。その後、アプリが別のサーバー/クライアントに移行されたときに、スクリプト/アプリケーションのアップグレードの問題が発生する可能性があります)。
カウベルト2017

4

30文字の識別子の長さは、1950年代後半に標準化されたCOBOLに由来すると思います。COBOLプログラムはSQL(およびその前のSEQUEL(およびその前のQUEL))の主なユーザーであったため、これは識別子の長さとしては妥当な数値のように思われたに違いありません。


5
Oracleの最初のバージョンはFortranで書かれたものだと思います。これには、識別子の長さの制限が31だと思います。多分それは関係があるかもしれません。
David Aldridge、

4

これらの「制約」はすべて、70年代に生まれたプロセッサアーキテクチャによって課された制限への対応に残されています。それ以来、プロセッサは進化して、これらの制限は不要になりました。彼らは残っているだけです。ただし、それらを変更することは、RDBMSの作成者にとって大きな契約です。これらの長さ制限は下流のすべての変更に影響を与えるため、長いプロシージャ名は例外レポートやデータディクショナリなど、他の多くのものを壊す可能性があり、おそらく壊れると言って間違いなく対応します。Oracle RDBMSを大幅に書き直す必要があります。


2

この質問への直接の答えは、Oracleスタイルは30が多かった古いアイデアから継承されたものであり、さらに多くのものが典型的なデータベースの実際のメモリからディクショナリキャッシュを固定解除するリスクを増大させたということです。

対照的に、ODBC名前空間は、Excelシートのテーブルを解析してデータセットをすばやく抽出し、シートテーブルの見出しから取得した列名を使用してデータベーステーブルを自動的に構築する、非常に異なる場所に由来します。そのように考えると、埋め込まれたキャリッジリターン、さらには特殊文字と大文字と小文字が混在する識別子も許可されるようになります。これは、今日のデータアナリストが考える方法をモデル化しているため、賢明な抽象化です。

SQL92を気にしないでください。今日のユニバーサルデータベースにとって本当に重要なのはODBCへの準拠であり、他のベンダーはOracleよりもこれに対処しています。たとえば、普及しているプレーヤーとしてはあまり見られないTeradataでさえ、引用符の有無にかかわらず2つの名前空間に対応します。前者は30文字の制限があり、後者は奇妙な長い識別子が提供される完全なODBC実装です。

従来の大規模なデータベース分野でも、名前が意味のある一貫した覚えやすいものであり続けるには、30文字が問題になることがよくあります。ロール名付き継承を使用して特殊化構造の設計を開始すると、略語の省略を開始し、すぐに一貫性が失われます。たとえば、同じルート識別子がテーブル名または列名としてレンダリングされる場合、ある省略形でさらに省略形が必要になり、他の省略形では不要になるためです。 。かなりの数の実際のユーザーがそのようなレイヤーに招待されると、その結果は使い勝手が非常に悪くなります。幸いなことに、古くなったデータベースの主な目的は、オブジェクトレイヤーとBIツールを介してユーザーをデータベースから分離することです。

これにより、データベース層はDBAとデータアーキテクトチームに委ねられます。略語体系を練ることはまだ人生の仕事だと思われます。

Oracleがこの古い制限に対処していないことは、長い識別子を使用して構築されたデータベース設計を直接移植できない場合に、(まだ)競争で多くのビジネスを失っていないという事実を反映している可能性があります。


オラクルではありません。ODBCはMicrosoftの赤ちゃんであり、Javaの赤ちゃんではありません。それはまだ OCIにリンクされた別のヘルパーlibです(instantclientがどのようにデプロイされるか見てください-ODBCをinstantclientで動作させるには、OCIドライバーとODBC instantclient zipの両方が必要です)。Oracleのプライマリクライアントプラットフォーム(レガシーPro * C / C / C ++を除く)はJDBCであり、ODBCではなくOCIに直接リンクされています。
カウベルト2017

1

上記のコメントはすべて正しいですが、長い名前のパフォーマンスコストを覚えておく必要があります。1990年代初頭、Informixが巨大な看板「Oracleよりも速いInformix!」を設置したとき。Oracle本社の隣のルート101では、Informixは18文字未満のテーブル名しか使用できませんでした。理由は明白です。リテラル形式のテーブル名(つまり、「t138577321」ではなく実際の名前など)がデータディクショナリに格納されます。名前が長いとデータディクショナリが大きくなり、クエリがハード解析を必要とするたびにデータディクショナリが読み取られるため、データディクショナリが大きいとパフォーマンスが低下します...


7
何十億回も実行している場合を除いて、短い文字列を正確に一致させることがボトルネックになる理由は絶対にありません。これは、クエリ解析では当てはまりません。Oracleのこの部分が最初に設計されたとき、サイズとパフォーマンスの考慮は重要であったかもしれませんが、最近はあまり関係がありません。
サラ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は問題ありません。これは私に新しい名前を付けることを強いています。テーブルの名前を変更することは可能ですが、お客様の操作に影響を与えるため、回避しようとしています。
dsum

6
考えられるケースの99.9%の割合で+30文字が煩わしい場合でも、他の0.1%が役立つとは限りません。
ルネNyffenegger

14
ああ滑りやすいスロープ引数。英数字を4文字に制限すると、100万を超えるテーブルの組み合わせが得られるため、実際に4を超える数を「必要」とする人はいません。また、実際の30文字ではなく、30文字未満です。これは、Pascalの大文字と小文字の命名規則では、大文字と小文字が区別されずにアンダースコアで区切られた名前に置き換えられるためです。これをさまざまな接頭辞/接尾辞と組み合わせると、20文字でも幸運です。堅牢なインデックス名が略語とアンダースコアの寄せ集めに違反エラーでエコーするのではないでしょうか?
b_levitt 2013年

これは問題を扱っていないことに同意した。通常、人間は長い列名を必要としませんが、オブジェクト名が自動的に生成されるケースはたくさんあります。
fool4jesus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.