9

私の会社では、Python ORM 用の Oracle のバックエンドの仕上げに取り組んでいます。私は、RDBMS が単純なものであっても、さまざまな方法で処理を行うことに驚いています。Oracle と他の RDBMS の違いについて多くのことを学びました。純粋な好奇心から、もっと学びたいと思っています。

あるプラットフォームから別のプラットフォームへの SQL の移植に関する一般的な「落とし穴」は何ですか?

回答ごとに 1 つの落とし穴だけにしてください。

4

17 に答える 17

4

Oracleにはカーソルの問題はないようです。カーソルは、SQLサーバーのパフォーマンスに大きな問題があります。

実際、ほとんどすべてのパフォーマンス調整はデータベース固有です(これが、データベース固有のSQLの特定のフレーバーに設計されたより優れたメソッドと比較してANSII標準コードのパフォーマンスが非常に低い場合が多い理由です)。

日付は、データベースごとに非常に異なる方法で処理されるように見えるもう1つのものです。

データ型も同等ではありません。SQL Serverを初めて使用する傾向があるのは、タイムスタンプのデータ型が日付と時刻とはまったく関係がなく、データ時間の値に変換できないことです。

于 2009-06-30T15:11:40.160 に答える
2

移植時に遭遇した SQL Server と Oracle 間の不一致のリスト:

ANSI 標準 SQL はデータベース間で完全に移植可能だと思いますか? もう一度考えてみて。

ANSI 標準 SQL の記述は実用的ではありません

于 2009-06-30T15:24:03.877 に答える
2

あるプラットフォームから別のプラットフォームへの SQL の移植に関する一般的な「落とし穴」は何ですか?

辞書の単語をそのままフレーズに置き換えて、 from Englishtoを翻訳しようとするのと同じです。Russian

helloとgoodbyeには機能しますが、Maryには Shakespeare について何も言わない子羊がいたので失敗します。

名前に が含まれていても、異なるRDBMSには異なる文化がありSQLます。

たとえば、行制限。

Oracle

WHERE rownum = 1

SQL Server

SELECT TOP 1

MySQLPostgreSQL: _

LIMIT 1

DB2

SELECT * ... FETCH FIRST 1 ROW ONLY

4 つの異なる

于 2009-06-30T14:17:06.617 に答える
2

複数値の IN 句クエリ。私はこれらを Oracle でいつも使用していましたが、SQL Server ではこれができないことに驚きました。たとえば、次のクエリです。

SELECT * FROM mytable WHERE (col1, col2) IN ( SELECT col1, col2 FROM othertable )
于 2009-06-30T14:19:09.187 に答える
2

Oracle では、FROM 句のない select ステートメントは許可されていません。したがって、次のようなクエリは実行できません。

SELECT 1

DUAL代わりに、クエリがテーブルからのものであると言う必要があります。

SELECT 1 FROM DUAL
于 2009-06-30T14:05:19.683 に答える
2

もう 1 つの例は、一意の (通常は代理の) 主キーの生成です。

SQL Server や sqlite などの多くのデータベースでは、列を ID として宣言できます。通常、挿入時にこの列の値が欠落している場合、データベースは列の一意の値を生成します。

対照的に、Oracle では、テーブルとは別にシーケンスを作成し、そのシーケンスで nextval を使用して次の値を生成します。

CREATE SEQUENCE test_seq;
SELECT test_seq.nextval FROM dual;

または、より一般的には:

INSERT INTO foo(id, title) VALUES (test_seq.nextval, 'bar');
于 2009-06-30T14:14:28.323 に答える
2

Oracle では、空の文字列を挿入することはできません。空の文字列は暗黙のうちに NULL に変換されます。

于 2009-06-30T14:26:20.327 に答える
2

Oracle は、MySQL とは対照的に、引用符に対して異なるアプローチをとっています。

MySQL: `object_name`, 'string', "string"
Oracle: "object_name", 'string'

さらに、エスケープは異なります。

MySQL: 'It\'s easy'
Oracle: 'It''s slightly confusing'

(Oracle で引用符以外のものをエスケープするには、クエリで ESCAPE ディレクティブを使用できることに注意してください。SELECT * FROM testTable WHERE percent = '50\%' ESCAPE '\')

于 2009-06-30T14:57:55.100 に答える
1

製品固有の問題点の全体像を把握するには、論理データベース設計と物理データベース設計の違いを理解する必要があります。

論理データベースの設計は、主にテーブルの機能に関係しています。表の機能には、列と制約が含まれます。テーブル自体は物理的なものですが、テーブルの設計は通常、あるデータベース システムから別のデータベース システムへの移植性が非常に高くなります。一部のデータ型の動作方法に違いがあり、テーブル名にアンダースコアを使用できるかどうかなど、構文にいくつかの違いがあります。ただし、優れた論理設計は、わずかな変更または変更なしで、あるシステムから別のシステムに移植する必要があります。

物理データベースの設計は、主に、テーブル構造が置かれているインフラストラクチャの機能と関係があります。ほとんどすべてのシステムがインデックスをサポートしており、デフォルトのインデックス タイプは B ツリーですが、別の名前で呼ばれることもあります。しかし、それ以降、各システムには独自の物理的機能があり、システムごとに完全に異なる場合があります。Oracle の典型的な物理機能はテーブルスペースです。表領域と密接に関連しているのは、表と表領域の間のマッピングです。物理的な設計は、システム固有の基準で行う必要があります。

使用している RDM システムに加えて、データ ボリューム、負荷、応答時間の要件、およびディスクなどのシステム リソースを設計で考慮する必要があります。幸いなことに、アプリケーション コードを変更することなく、物理設計に多くの変更を加えることができます。これは、物理データの独立性として知られています。これは、いくつかのアプリケーション コードを記述し、いくつかのデータをロードした後、ある程度自由に物理的なデザインを微調整して調整できることを意味します。

論理設計と物理設計、およびそれらの違いについて理解を深めるために、データベース設計に関する本をいくつか読むとよいでしょう。人気のある作家には、CJ Date や Joe Celko などがあります。

于 2009-07-03T14:00:12.600 に答える
1

一時テーブル - Oracle と SQL Server/MySQL の比較。Oracle から MS/MySQL への移行は問題ありません。逆に言えば、ちょっと違う。

于 2009-07-03T13:35:32.847 に答える
1

私を完全に油断させたオラクル特有の問題を思い出す。これがインスタンスの構成なのかデフォルト設定なのかはわかりませんが、IN ステートメントに 1000 を超える要素を含めることはできませんでした。そのため、必要なことを実行するようにだまさなければなりませんでした。

SELECT Col1,Col2 
FROM Table
WHERE Code IN (1,2,3,...,1000)
OR Code IN (1001,1002,1003,...,2000)

醜いですが、うまくいきました。

(誰かがサブクエリまたはインライン ビューの明白な解決策を指摘する前に、クエリは完全に異なるシステムで生成されました)

于 2009-07-05T17:59:08.887 に答える
1

Oracle では、1 つのクエリで複数の挿入を行うことはできません。MySQL では次のことが可能です。

INSERT INTO test(id, name) VALUES (1, 'foo'),(2, 'bar');
于 2009-06-30T14:51:04.007 に答える
1

パフォーマンスの問題は大きな問題です。たとえば、Oracle のビューは、私の知る限り、テーブルとほぼ同じくらい高速です。私がそれらを使用しなければならなかったとき、これはSQLServerには当てはまりませんでした。ビューは効果的にパフォーマンスを低下させ、同じ選択を 1 桁以上遅くしました (ビューを使用すると 1 分かかる場合があるのに対し、テーブルから直接クエリを実行すると、たとえば 0.5 秒かかります)。また、ビューですべての SQL 関数を使用できるわけではないなど、使用には多くの制限がありました。

これは 5 ~ 6 年前の事実であることに注意してください。Microsoft がその後これを改善したかどうかはわかりません。

于 2009-06-30T14:19:42.917 に答える
1

外部結合に対する Oracle の (+) 構文のように、あいまいな結合構文。私が以前働いていた会社では、標準の LEFT OUTER JOIN / LEFT JOIN 構文ではなく、この構文がいたるところで使用されていたため、一部のものを MySQL に移植するのが非常に面倒でした。

于 2009-06-30T14:24:25.900 に答える
0

Pythonに付属のドライバーでこれが当てはまるかどうかはわかりませんが、使用した「Horrable」のバージョンでは、結果セットの列が列のすべての値に対してNULLを返す場合、列自体は結果セットの構造。これにより、開発時に複製することが不可能な本番環境のバグが発生する可能性があります(多くの場合、発生しました)。

Oracleから離れているので、これは問題ではありませんが、開発者がこの「機能」を軽減するために使用するキーワードがあり、MySQLでサポートされているとは思えません。しかし、私はそれが何であるかを忘れており、Googleは助けていません。

于 2009-06-30T14:56:14.433 に答える
0

オペレータ サポートを設定します。

UNION / UNION ALL を除けば、集合演算子のサポートはデータベース間でかなりむらがあります。Oracle と SQL サーバーはそれらのほとんどをサポートしていますが、Oracle は MINUS 操作と同等の標準の EXCEPT DISTINCT 操作をサポートしています。AFIK、MySQL は UNION のみをサポートしています (INTERSECT または EXCEPT はサポートしていません)。

于 2009-06-30T14:42:57.923 に答える
0

データベースが異なれば、バイナリ データの処理方法も少し異なります。たとえば、これは MySQL で動作します。

mysql> CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t SET c = 'z';
Query OK, 1 row affected (0.01 sec)

ただし、Oracle はこれらの値が 16 進数であることに依存しています。

SQL> CREATE TABLE t (c RAW(3));

Table created.

SQL> INSERT INTO t VALUES ('z');
INSERT INTO t VALUES ('z')
                 *
ERROR at line 1:
ORA-01465: invalid hex number

代わりに、16 進数に変換する必要があります。

SQL> INSERT INTO t VALUES (rawtohex('z'));

1 row created.
于 2009-06-30T14:07:47.667 に答える