FC2ブログ

晴川雨読

晴れている時は川へ、雨の日は川に関する情報収集をします。

impdp をDBリンク越しでやると基本圧縮が効かない

Oracle11g(11.2.0.?) → Oracle11g(11.2.0.2) で、DBリンク越しで、insert /*+ APPEND */...を使い、COMPRESS属性のあるテーブルに登録すると基本圧縮される。

基本圧縮(BASIC COMPRESSION)は、Direct Path Insertした時にだけ、同一ブロックのデータの重複排除が行われる機能。
基本圧縮されたブロックを更新しようとすると、圧縮がほどける。
通常の更新(insert/deleteでも)でも圧縮させるには、Enterprise Editionの有償オプションであるAdvanced Compressionが必要。
移行データだけでも圧縮させてあげましょうって時には、基本圧縮の利用もありかと。
※最初から基本圧縮でテーブル作ると PCTFREE がデフォルトで 0 となるらしいので注意。
 そうなると同時実行性が落ちる。

圧縮されたサイズかどうかは、DBA_SEGMENTS で確認できる。
リモートで expdp したダンプファイルを持ってきて impdp した場合も同様に基本圧縮される。

しかし、NETWORK_LINK のオプションを付けて、リモートデータベースからダンプファイルを作成せず直接ローカルデータベースにインポートした場合、基本圧縮されない。
マニュアル見てもそんな制約事項なんて一言も書いてない。

基本圧縮できないのなら、ダンプファイルをネットワーク上コピーする時間が無駄だから、select/insertにするかな。

スポンサーサイト

トランザクション分離レベル(SERIALIZABLE)

Oracleでは、READ COMMITEDしか使ったことないね~。
DBリンク越しで複数テーブルを整合性とって移行するのに SERIALIZABLE 使ってみるのはどうかなと思いちょっと調べた。

SET TRANSACTION
データの同時実行性と整合性
第18回 ロックについて

MySQL のデフォルトが SERIALIZABLE で邪魔くさっかたしな~。
ということで、もし使うなら Flashback Queryかな。
UNDOに十分空がある時間帯だからそれが一番手っ取り早いかな。現行側のトランザクションに影響しないし。

@ITの『「データベーススペシャリスト試験」戦略的学習のススメ』って。。

カテゴリを "Oracle" としているが、Oracleとは関係ない。DB関連で他に良いのが無いのでそれにした。

データベーススペシャリスト の資格を取る気は全くないが、検索で @IT の記事が引っかかり、この記述どうよ?ってのを見つけたので書きます。

「カーソル」を理解する」の記事。

FOR UPDATE OF による表のロック

 前述した「<1>カーソルの宣言」を行うSELECT文の最後に「FOR UPDATE OF テーブル名」を付与すると、カーソルが指定するSELECT文を実行した状態で、該当のテーブルが他のSQL文によって更新されないようにロックをかけることができます。

カーソルで表(テーブル)をロックするってどういうことでしょ?ファイルじゃあるまいし、そんなものはDBとは言えん。言うなら「行(レコード)のロック」でしょ。表と行では全く違う。

また、「データベースのパフォーマンス設計を行う」の記事。

クラスタリング

 検索対象の表に用いられる演算を分析し、演算結果として得られるレコード群を近くの領域に配置することで、検索速度を高速化します。

この後で、パーティショニングのことを書いているので、クラスタリングの説明がこれだけというのはどうかと思う。資格を取るためのお勉強って感が満載。2つの意味を説明すべき。

さまざまな種類の「キー」を理解する

要暗記 スーパーキー 行を一意に識別するための属性(あるいは属性の組合せ)。


スーパーキーなんて始めて聞きました。そんな使いもしないものを暗記せよというのね。アホくさい。

Oracle Database 18c 新機能

Oracle Database 18c マニュアル が公開されていたので、新機能について軽く見た。

12c に比べると、アプリ屋に関する新機能が極端に少ない(OLAP向けだから?OLTP でも Core の Database エンジンは同じだとおもうが)。
次は、少ないものの中から目にとまったもの。

■Private Temporary Tables

Private temporary tables are temporary database objects that are automatically dropped at the end of a transaction or a session.


MySQL の 一時表みたいにテーブルが消えるんですね。いらん機能ですね。createした時トランザクションどうなるの?
MySQL の案件で Oracle の一時表と同じことが出来ずムカついた。
いちいちテーブルを作らないといけない、コネクションプールを使っているの残っている可能性があるなど。

■Manual termination of Run-Away Queries

This feature enables the database administrator to terminate a runaway SQL query using the ALTER SYSTEM CANCEL SQL statement.
This frees the system resources consumed by the runaway SQL query so that other SQL queries can use them.


kill する時と同じで、session,serial# は必須で、sql_id はオプション。sql_id指定したとして、そのセッションのトランザクションがどうなるか謎。マニュアルに特に書かれていないし。
これも使い道、思いつかず。

FIXED_DATE

マニュアルを見ていたら、「FIXED_DATE」というのを見つけた。

ALTER SYSTEM SET FIXED_DATE = '2018-03-19-00:00:0' SCOPE = MEMORY;


とかで SYSDATE の返す値を固定にできるそうだ。
戻すには

ALTER SYSTEM SET FIXED_DATE = NONE SCOPE = MEMORY;


とする。
ふ~ん。でも、使えんね。

  • SYSTIMESTAMP は変更できない(できるパラメータもなさそう)
  • SYSTEM 単位でしか変更できない。共用だからそんな簡単に変更できないし。ALTER SESSIONでできるならまだね。

ちゃんとしたシステム作るなら、ファイルなり・DBなりで運用日付持つでしょうね。
どこまで細かい単位で持つかは設計思想だけど、バッチとオンライン用に2つは持つだろうね。
オンラインは試験用だろうけど、バッチは実運用で必要ね。
次のページ

FC2Ad