私もSybaseの経験があるOracle DBAです。
2つのRDBMSプラットフォームの主なアーキテクチャ上および概念上の違いは何ですか?
SQL Server-> Oracleの質問 here に似た答えが最も役に立ちます。
私はここ数年、OracleとSQL Serverの作業を入れ替え、反対方向への言い回しを書きました こちら いくつかの慣用的および構造的な違い、およびさまざまな用語があります各製品を取り巻くベンダーおよび開発者/ DBAコミュニティによって異なる方法で使用されます。
物理アーキテクチャ
SQL Serverは、さまざまなものをOracleとは少し異なる方法で編成し、Oracleに直接類似するものがない1つまたは2つの主要な概念を持っています。
「データベース」はSQL Serverの個別のアイテムであり、独自のユーザー権限、スキーマ/名前空間、およびストレージを備えています。 Sybaseに精通している場合は、製品の共通の起源により、Sybaseのデータベースとほとんど同じように機能します。
ファイルグループはデータベースに対してローカルですが、テーブルスペースとほぼ同じです。
スキーマはSQL Serverのデータベースユーザーとは異なる概念ですが、ユーザーはデフォルトのスキーマを持つことができます。
SQL Serverでは、MVCCの動作が多少異なります。これは比較的最近の機能であり、古いバージョンのロックが解除されるまで、行のさまざまなコピーを維持します。 SQL Serverには、ロールバックセグメントに直接相当するものはありません。 SQL Serverデータベースでは、デフォルトではアクティブではありません。
TempdbはSQL Serverでより頻繁に使用されます。システムはこれを一時テーブルおよび中間結合結果に使用します。 tempdbについては後で詳しく説明します。
テーブルのパーティション分割は、Oracleよりもやや扱いにくいです。提供するものからパーティションキーを作成するパーティション関数を設定してから、そのパーティション関数のパーティション構成を設定する必要があります。パーティション構成は、ファイルグループのように動作し、パーティション構成にテーブルを作成します。
パーティションを入れ替えたり入れ替えたりするには、正しい構造の空のテーブルに制約を設定する必要があります。この制約により、パーティションキーの値が、スワップインするパーティションに適切であることが保証されます。
マテリアライズドビューは、SQL Serverではインデックス付きビューと呼ばれます。 GROUP BY
句にはCUBE
演算子があり、ドキュメントではクエリの書き換え機能について言及しています。ただし、この機能は十分に文書化されておらず、あまり成熟していない可能性があります。 YMMV。
SQL Serverは自律型トランザクションをサポートしていませんが、XAまたはOLEDBトランザクションプロトコルによる2フェーズコミットをサポートしています。
クラスタ化インデックスは、テーブル内のすべての列がクラスタ化インデックスに参加する必要がないため、Oracleのインデックス順テーブルとは少し異なります。 SQL Serverアーキテクチャでは、IOTがOracleよりもはるかに広く使用されています。
SQL Serverはインデックスのカバーをサポートしていますが、結合インデックスはありません。ビットマップインデックスはサポートされていませんが、ファクトテーブルにヒットせずに交差を計算できるインデックス交差/スター変換演算子があります。
シーケンスは、SQL Serverに比較的最近追加されたものです。従来、自動インクリメントキーはID列を介して行われていました。 set identity_insert on
を介してID列に値をロードできます。
プログラミング
慣用的なT-SQLは、慣用的なPL/SQLといくつかの違いがあります。それは十分に異なって機能し、いくつかのパラダイムの違いはより深く説明する価値があります。
T-SQLにはパッケージの概念はありません。データベース内のすべてのストアドプロシージャと関数は共通の名前空間に存在しますが、スキーマを使用してこれを分割でき、名前空間はデータベースに対してローカルです。
一時テーブルの使用方法の感触とSELECT INTO
を入手してください。実際にカーソルを必要とするT-SQLコードに遭遇することは非常にまれです。一時テーブルを使用すると、操作を、セット操作で実行できるステップに分割できます。 tempdb内のSELECT INTO
は最小限のログで記録され、ユーザーデータベースの特定のリカバリモードでも最小限のログが記録されるため、中間結合結果を保持するクエリ演算子と同じくらい高速です。
慣用的なT-SQLは、PL/SQLでカーソル変数が表示されるようなロールで一時テーブルを使用しますが、集合演算をより多く使用します。ただし、一時テーブルはかなりあいまいなコードになる可能性があるため、注意して使用してください。
システムデータディクショナリは、以前のバージョンのOracleのものよりもずっと鈍いものでしたが、SQL Server 2005で大幅に改善されました。Microsoftが提供するツールには、SSMSエクスプローラーに組み込まれた多くのイントロスペクション機能がありますが、それでも知っておく価値があります。データディクショナリを回避する方法。ただし、DBオブジェクトのALL
、USER
、DBA
ビューは区別されません。
SSMSにはクエリプランビューアが組み込まれています。
T-SQLコードの識別子は[]で引用でき、引用されている場合はあらゆる種類のゴミを含むことができます。ただし、列を「Direct/Transfer」と呼んでいることがわかった場合、私たちは腸を破壊します。
SQL Serverにはウィンドウ関数(2005 IIRC以降)があるため、グループ内で順序付け、合計の実行などを行うことができます。
T-SQLにはCONNECT BY
に直接相当するものはありませんが、再帰は再帰CTEを通じて実行できます。
(データベース内のスキーマではなく)データベース間でホップするコードを作成する必要がある場合は、パブリックシノニムを使用してオブジェクトにローカルのエイリアスを付け、コード内のエイリアスを参照することを検討してください。これにより、データベース名に対するハードコーディングされた依存関係が回避されます。
データベース名に対するハードコーディングされた依存関係を回避する場合、データベースにより、同じサーバーで複数の環境を維持することが非常に簡単になります。
カスタム集計関数など、CLR sprocを使用しないと実装できないものもあります。また、トランザクションコンテキストから脱出したい場合(たとえば、ロールバック防止のエラーログ用に自律型トランザクションを偽造する場合)、現在のトランザクションコンテキストの外部にローカル接続を作成できるため、CLR sprocを使用できます。
セキュリティ
ログインはSQL Serverインスタンスレベルで定義されますが、各ログインは「データベースユーザー」として0個以上のデータベースにマップされます。権限は「ログイン」(サーバー)と「ユーザー」(データベース)の両方に割り当てることができますが、データベースでは「ロール」が通常使用されます。ユーザーは役割に属し、権限は役割に割り当てられます。 SQL Server 2012は「サーバーロール」を追加します。
SQL Server 2012では、「部分的に含まれるデータベース」と呼ばれる概念が導入され、ユーザーとロールの情報をそのデータベースに対してローカルに保持できます。
データベース内では、ユーザーとスキーマの概念は分離されています。ユーザーまたはロールをスキーマに割り当てることができ、スキーマはデータベースオブジェクトを所有します。
Windows認証では、裏でログイン情報を使用して、マシンまたはドメインのユーザーをSQL Serverログインに対して認証します。これに対するIIRCサポートは、Oracleのオプションの追加機能です。
特別な役割である「dbo」(「データベース所有者」の略)は、特定のデータベース内で一種のスーパーユーザー特権を持っています。各データベースには「dbo」ロールがあり、ユーザーを特定のデータベースの「dbo」ロールに割り当てることができます。
デフォルトの「dbo」スキーマもあります。オブジェクトはdboスキーマによって所有される場合があります-「dbo」ロール(またはシステム全体の管理者権限)を持つユーザーによって作成されたオブジェクトは、別のスキーマが明示的に指定されない限り、デフォルトで「dbo」スキーマによって所有されます。
単一のデータベースのバックアップでは、セキュリティ情報は保持されません。ユーザーと役割は、バックアップの復元先のサーバーで明示的に構成する必要があります。 SQL Server 2012では、新しい「部分的に含まれるデータベース」機能を使用して、ユーザーとロールのデータをデータベースにローカルに保持できます。
SQL Server 2005以降、呼び出し元、作成者、所有スキーマ、または指定したユーザーのセキュリティコンテキストでストアドプロシージャを実行できます。
SQL Serverのビューでは、基になるテーブルの権限は、ビューを所有するスキーマの権限に基づいています。基になるテーブルに対するユーザー権限はセキュリティに関与しませんが、ビュー定義にはセッションから情報を取得するフィルターを含めることができます。 Oracleでは、付与の構成によっては、基になるテーブルに対するユーザー権限がビューに影響する場合があります。
モニタリングとチューニング
TBA-OracleのメモリアーキテクチャとSGAなど
バックアップとリカバリ
未定
ツーリング
Microsoftは、SQL Serverに一連の周辺ツールをバンドルしています。提供される主なアイテムの一部は次のとおりです。
SQL Server Management Studio(SSMS):これは、OracleのSQL Developerに似ています-エディターとコード実行機能を提供します。便利な機能には、データベースオブジェクトブラウザやクエリプランビューアなどがあります。
SQL Server Analysis Services(SSAS):これは、データベースサーバーとは異なるOLAPサーバーです。クライアントサーバー用に独自のクエリ言語(MDX)とAPI(XML/A)を使用しますSQLを使用してクエリすることはできません。SSMSには、MDXおよび未加工のXMLAクエリを編集して結果を表示する機能があります。ASCMD.EXEと呼ばれるコマンドラインクエリツールも提供されています。
SQL Server Reporting Services(SSRS):これは、レポートを公開するためのWebベースのレポートツールです。レポートは、BI Development Studio(BIDS)またはレポートビルダーを介して構築し、Webポータルに公開できます。 SSRSサーバー自体には、サーバーをプログラムで管理するためのWebサービスAPIがあります。 SSRSレポートは、SQL Serverだけでなく、さまざまなソースからのデータを使用できることに注意してください。 SSRSサーバーをプログラムで管理するために、RS.EXEと呼ばれるコマンドラインツールが提供されています。
SQL Server Integration Services(SSIS):これは、SQL Serverで提供されるETLツールです。アーキテクチャ的には、コード生成ツールではないという点で、OWBやODIとはかなり異なります。ランタイムはクライアント側にあり、データベースサーバーとは別のマシンに置くことができます。 SSISパッケージは、BIDSで開発し、DTEXEC.EXEと呼ばれるコマンドラインツールで個別に実行できます。
B.I. Development Studio(BIDS):これは、レポート、SSISパッケージ、およびSSASキューブを開発するためのビジュアルスタジオベースの環境です。他のVSベースの開発ツール(VS Professionalなど)がインストールされている場合、ツールを単一の環境と共通のプロジェクトグループに統合できます。
一括コピー(BCP):SQL * Loaderに似たコマンドライン一括挿入/抽出ツール
SQLCMD:SQL * plusに似たコマンドラインクエリツール
SQLプロファイラ:SQL Server、SSAS、およびスイート内の他のツールからトレース情報をキャプチャして評価できるトレースおよびプロファイリングツール。
SQL Serverエージェント:ある種類のジョブを定期的に実行できるジョブスケジューリングユーティリティ。
私たちの主な製品はSQL ServerとOracleの両方で動作します。回避する必要があった他のいくつかの違いを以下に示します。
日時の処理は非常に異なります:精度が異なる、使用する関数のセットが異なる
空の文字列はSQL ServerではなくOracleではNULLです
文字エンコーディングとUnicodeの処理は大きく異なります。 SQL Serverでは、同じデータベースに通常の(varchar
)列またはUnicode(nvarchar
)列を混在させることができます。Oracleでは、使用するエンコードの種類をデータベースレベルで決定します。