February 2007
Sun Mon Tue Wed Thu Fri Sat
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28
Search


Sections
Oracle Article Summary
Categories
Apple   [2 items]
Cinema   [82 items]
Lambda   [2 items]
Oracle   [12 items]
Podcasting   [1 items]
Archives
February 2006
January 2006
December 2005
November 2005
October 2005
September 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
Links
robios.org -annex-
鮎の詰め合わせ
ぞうパラ
Jasi's Blog
ぱんでもにぅむ・ぶろぐ
へべれけ
Recent Entries
バイオハザード II アポカリプス - Resident Evil: Apocalypse
ヴィレッジ - The Village
アイ, ロボット - I, Robot
LOVERS - 十面埋伏
Oracle 8i Install - 手作業でのデータベース構築
Oracle 8i Install - 前準備
分析関数の基礎 - LAGとLEAD
ヴァン・ヘルシング - Van Helsing
誰も知らない - Nobody Knows
分析関数の基礎
Recent TrackBacks
Versace Perfume
(Versace Perfume, Feb 7)

Xanax overdose.
(Xanax side effects., Feb 7)

Rhinoplasty Recovery Time
(Rhinoplasty Recovery Time, Feb 6)

Acdsee Software
(Acdsee Software, Feb 5)

4250 Toner Cartridge
(4250 Toner Cartridge, Feb 3)

Hardside Luggage
(Hardside Luggage, Jan 29)

Headboard Bookcase
(Headboard Bookcase, Jan 26)

Samsonite Wheeled
(Samsonite Wheeled, Jan 26)

Tinkerbell Myspace Backgrounds
(Tinkerbell Myspace Backgrounds, Jan 24)

Breitling Chrono Avenger
(Breitling Chrono Avenger, Jan 23)

Syndicate
Syndicate this site (XML)

バイオハザード II アポカリプス - Resident Evil: Apocalypse

September 22, 2004

バイオハザード II アポカリプスを観た。

Yahoo!ムービーによる解説:
ゲームを映像化し世界中で大ヒットとなった前作から2年。舞台を地下施設から巨大都市に移し、蔓延するアンデッド(ゾンビ)たちと主人公アリスらの壮絶な戦いを描く。前作同様ミラ・ジョヴォヴィッチを主演に、ゲーム版1、3の主役ジル・バレンタインを『タイムマシン』でデビューしたシエンナ・ギロリーが演じる。前作で監督を務めたポール・W・S・アンダーソンは製作と脚本にまわり、本作では『パイレーツ・オブ・カリビアン』の撮影監督アレクサンダー・ウィットが総指揮をとる。ミラが演じるアリスのパワー・アップには要注目!

アリス強すぎ。最早敵なし。せっかく敵なしなのだから、戦闘シーン、特にネメシスとの決闘はもうちょっと作りこめばよかったのに。カメラワークでそれらしく見せてるけど、もったいないなぁ。

それにしても、世界最大とはいえ一つの会社がここまでするかね。やりすぎだろ。

昨日から連続のビクビク系で疲れた、、、。

監督: Alexander Witt
出演: Milla Jovovich, Sienna Guillory

ヴィレッジ - The Village

September 21, 2004

ヴィレッジを観た。

Yahoo!ムービーによる解説:
『シックス・センス』のM・ナイト・シャマラン監督が森の奥の小さな村を舞台に描くスリラー。村の住人たちのユートピアを維持するために義務づけた掟が破られる時に訪れる恐怖は予想外の結末を呼ぶ。主演に『戦場のピアニスト』でアカデミー主演男優賞を受賞したエイドリアン・ブロディ。その他に『サイン』のホアキン・フェニックス、『エイリアン』のシガニー・ウィーバーなど豪華キャストが脇を固める。物語終盤にかけて明かされる真実は『シックス・センス』以来の衝撃。

シャマランの今まで作品と違うのは、主題が「愛」だということ(アンブレイカブルは観てない)。ヴィレッジの世界の中での愛の物語だし、またそのヴィレッジの世界を作り上げたのも愛である。筋は通るし、主張も分かるし、おもしろい。目の付け所が良い。

賛否両論分かれるようですが、私には楽しめました。シックスセンスからの期待のままサインで失望して、今回ヴィレッジで盛り返した感じ?

シャマランは今回は控えめな出演でした。反射で映った姿だけ。

監督: M. Night Shyamalan
出演: Bryce Dallas Howard, Joaquin Phoenix

アイ, ロボット - I, Robot

September 19, 2004

アイ, ロボットを観た。

Yahoo!ムービーによる解説:
SF界の巨匠、アイザック・アシモフの「われはロボット」を原案に、『クロウ』や『ダークシティ』の革新的な映像が目を引くアレックス・プロヤス監督が描いたアクション・スリラー大作。ウィル・スミスを主演に、『トータル・フィアーズ』のブリジット・モイナハンやジェームズ・クロムウェルらが共演。人類が追求したテクノロジーの暴走や壮絶なアクションを交え、知的なエンターテイメントとなった大作。全米では初登場1位を記録したヒット作。

非常に良かった。映像は迫力あるし、ストーリーもなかなかよくまとめられている。主題もきちんとある。久しぶりなヒットでした。マーケティングが結構すごかったので、たいしたことないのかなぁってちょっと心配だったけど、嬉しい裏切りでしたね。

ロボット三原則に唯一の欠点(というべきか矛盾というべきか、、、)があるとすれば。なかなかいいアイデアだと思う。アイザックアシモフもこのような展開まではきっと読めなかったであろう。

シカゴのCGも必見。

監督: Alex Proyas
出演: Will Smith, Bridget Moynahan

LOVERS - 十面埋伏

September 17, 2004

LOVERSを観た。

Yahoo!ムービーによる解説:
日本でも大ヒットを記録した『HERO』のスタッフが再び放つアクション超大作。名匠チャン・イーモウ監督の元、『恋する惑星』の金城武、『HERO』にも出演したチャン・ツィイー、『インファナル・アフェア』のアンディ・ラウといったアジアの3大スターが結集し、唐王朝衰退期の中国を舞台に、運命に翻弄されながらも真の愛を貫こうとする男女3人の切なくも美しいドラマを紡ぎ出す。イーモウ監督ならではの映像美と、ワイヤーワークを駆使した華麗なるアクションが見どころだ。

なかなかよかった。ただ、そもそもの、事を招いた「謀り」の意義がいまいちピンとこない。明快な理由なく、ただ周りに翻弄されているようにしか見えない。

しかし、ラストの緊迫したシーンは結構見もの。迫力が伝わってくる。ワイヤーアクションは、、、うーん。

監督: チャン・イーモウ
出演: 金城武 、チャン・ツィイー 、アンディ・ラウ

Oracle 8i Install - 手作業でのデータベース構築

September 14, 2004

前準備も終わったのでインストールを行う。ソフトウェアはOracle Installerで適当にインストール。データベースは、Oracle Database Configuration Assistantを使わず、手作業で構築してみる。

初期パラメータファイル作成

まずは、初期パラメータファイルを作成する。$ORACLE_HOME/dbs/init.oraがテンプレートなので、それを、$ORACLE_BASE/admin/SID/pfile/initSID.oraにコピーし、編集する。また、そのファイルのシンボリックリンクを$ORACLE_HOME/dbs/ に作成しておく。

私の初期パラメータはこんな感じ。SIDはLUPUS。configLUPUS.oraという静的パラメータファイルを別に作り、initLUPUS.oraからインクルードしている。初期パラメータについては、テストのためにめちゃめちゃな値の場合もあるので要注意!

# initLUPUS.ora
# -------------

# Database Buffer and Disk I/O
# ----------------------------
db_block_buffers = 32768        # 32K * 8K = 256M
buffer_pool_keep = (buffers:500, lru_latches:1)
buffer_pool_recycle = (buffers:1000, lru_latches:2)
db_file_multiblock_read_count = 16
db_writer_processes = 1
dbwr_io_slaves = 10
disk_asynch_io = TRUE
db_files = 200

# Shared Pool
# -----------
shared_pool_size = 134217728
shared_pool_reserved_size = 10485760
java_pool_size = 20971520
large_pool_size = 10485780
#lock_sga = TRUE
#mlock_sga = TRUE
dml_locks = 300

# Hash Joins
# ----------
hash_area_size = 10485760
hash_multiblock_io_count = 16
hash_join_enabled = TRUE

# Redo
# ----
log_archive_start = FALSE

# Latch
# -----
db_block_lru_latches = 8

# Chackpoint
# ----------
log_checkpoint_interval = 0
log_checkpoint_timeout = 1800
log_checkpoints_to_alert = TRUE

# Cursor and Library Cache
# ------------------------
cursor_space_for_time = FALSE
session_cached_cursors = 64
open_cursors = 256

# Optimizer
# ---------
optimizer_mode = CHOOSE
optimizer_max_permutations = 79000
optimizer_index_cost_adj = 1
optimizer_index_caching = 99
partition_view_enabled = TRUE
always_anti_join = HASH

# Parallel Query
# --------------
parallel_max_servers = 16
parallel_min_servers = 4
parallel_min_percent = 50
parallel_automatic_tuning = FALSE

# Sort
# ----
sort_area_size = 1048576
sort_area_retained_size = 1048576
sort_multiblock_read_count = 2

# include configuration file
ifile = /oracle/u01/app/oracle/admin/LUPUS/pfile/configLUPUS.ora


# configLUPUS.ora
# ----------------
# This file is to be included in init.ora.
# Parameters in this file are static. Do not change.

db_block_size = 8192
processes = 100
timed_statistics = TRUE

# Make trace files public
_trace_files_public = TRUE
global_names = TRUE
compatible = 8.1.7
control_files = (/oracle/u03/oradata/LUPUS/cntrl1.ctl,\
                 /oracle/u04/oradata/LUPUS/cntrl2.ctl)
user_dump_dest = /oracle/u01/app/oracle/admin/LUPUS/udump
core_dump_dest = /oracle/u01/app/oracle/admin/LUPUS/cdump
background_dump_dest = /oracle/u01/app/oracle/admin/LUPUS/bdump
db_name = LUPUS
db_domain = ROBIOS.ORG
instance_name = LUPUS
service_names = LUPUS.ROBIOS.ORG

とりあえずの作成ならここまで作りこむ必要はない。静的パラメータだけでよいはず。

データベース作成

インスタンスを立ち上げ、データベースを作成する。

$ ORACLE_SID=LUPUS svrmgrl

Oracle Server Manager Release 3.1.7.0.0 - Production

Copyright (c) 1997, 1999, Oracle Corporation.  All Rights Reserved.

Oracle8i Enterprise Edition Release 8.1.7.0.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.7.0.0 - 64bit Production

SVRMGR> connect internal
Connected.
SVRMGR> startup nomount pfile = "/oracle/u01/app/oracle/admin/
LUPUS/pfile/initLUPUS.ora"   <--表示上改行してます
ORACLE instance started.
Total System Global Area                        445083324 bytes
Fixed Size                                         102076 bytes
Variable Size                                   176005120 bytes
Database Buffers                                268435456 bytes
Redo Buffers                                       540672 bytes
SVRMGR> create database LUPUS
     2> maxdatafiles 128
     3> maxinstances 1
     4> maxlogfiles 8
     5> character set JA16EUC
     6> national character set JA16EUC
     7> datafile '/oracle/u02/oradata/LUPUS/system01.dbf' size 260M
     8> autoextend on next 10240K
     9> logfile '/oracle/u03/oradata/LUPUS/redo01.log' size 500K,
    10> '/oracle/u03/oradata/LUPUS/redo02.log' size 500K;
Statement processed.
SVRMGR> disconnect
SVRMGR> quit

パラメータについて

maxdatafiles
最大データファイル数。コントロールファイルに初期設定される。init.oraのDB_FILESで設定した数まで動的に拡張される。
maxinstances
このデータベースをマウントできるインスタンスの最大数。クラスタ作るわけじゃないので1でいいかなと。
maxlogfiles
REDOログファイルグループの最大数。今回は2グループ(とはいうもののメンバーは1つ)だが、とりあえず8に設定。
character sets
通常の項目のキャラクタセット。EUCへ設定。
national character sets
NCHARなどのNational Character項目のキャラクタセット。同じくEUCへ設定。
datafile
システム表領域領域のデータファイルを定義。ディクショナリ類で結構大きくなるので最初から大きめに確保。
logfile
REDOログファイルの定義。テスト用データベースなので、グループ設定はしない。本番用であれば、グループ設定を行い、複数のメディアにミラーを作ることで用心。

データディクショナリ作成

$ORACLE_HOME/rdbms/admin/catalog.sqlを実行して、データディクショナリ、動的ビューなどを作成する。

$ ORACLE_SID=LUPUS svrmgrl

Oracle Server Manager Release 3.1.7.0.0 - Production

Copyright (c) 1997, 1999, Oracle Corporation.  All Rights Reserved.

Oracle8i Enterprise Edition Release 8.1.7.0.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.7.0.0 - 64bit Production

SVRMGR> connect internal
Connected.
SVRMGR> @/oracle/u01/app/oracle/product/8.1.7/rdbms/admin/catalog.sql
Statement processed.
Statement processed.

- 途中省略 -

Statement processed.
Statement processed.
SVRMGR>

途中、ORA-01342等が幾度も出るが気にしないでよい。全く新規のデータベースなのだから。

システム表領域設定変更

SYSTEM表領域にSTORAGE句を適用する。

上記の続きより
SVRMGR> alter tablespace SYSTEM
     2> default storage ( initial 64k next 64k minextents 1
     3> maxextents unlimited pctincrease 0);
Statement processed.
SVRMGR> alter tablespace SYSTEM minimum extent 64k;
Statement processed.

ロールバックセグメントの作成

まず表領域を作成する。ここでは表領域をそれぞれ違うマウントポイントに3つ作成し、それぞれに1つ計3つの、ロールバックセグメントを作成してみる。初期サイズは25Mに設定。(3つでは通常は少ないかもしれない。)

上記の続きより
SVRMGR> create tablespace RBS01
     2> datafile '/oracle/u02/oradata/LUPUS/rbs01.dbf'
     3> size 26279936 reuse
     4> autoextend on
     5> maxsize 100m
     6> extent management local uniform size 1m;
Statement processed.
SVRMGR> create tablespace RBS02
     2> datafile '/oracle/u03/oradata/LUPUS/rbs02.dbf'
     3> size 26279936 reuse
     4> autoextend on
     5> maxsize 100m
     6> extent management local uniform size 1m;
Statement processed.
SVRMGR> create tablespace RBS03
     2> datafile '/oracle/u04/oradata/LUPUS/rbs03.dbf'
     3> size 26279936 reuse
     4> autoextend on
     5> maxsize 100m
     6> extent management local uniform size 1m;
Statement processed.
SVRMGR>

表領域はパフォーマンスを考えUNIFORM拡張LMT (Locally Management Tablespaces) にする(最後の行)。LMTの場合、ファイルサイズに64Kのオーバーヘッドを加えておくと余分にExtendしない。25Mアロケートしたいので、サイズは、1024 * 1024 * 25 + 1024 * 64 = 26279936 とする。

ロールバックセグメントを作成し、ONLINEとする。ORA-01552が出る可能性があるので、先にSYSTEM表領域に一時RBSを作成し、ONLINEとしておく。一時RBSは後ほどDROPする。

上記の続きより
SVRMGR> create public rollback segment rbstemp
     2> tablespace system;
Statement processed.
SVRMGR> alter rollback segment rbstemp online;
Statement processed.
SVRMGR> create public rollback segment rbs1
     2> storage ( initial 1024k next 1024k minextents 25 )
     3> tablespace rbs01;
Statement processed.
SVRMGR> create public rollback segment rbs2
     2> storage ( initial 1024k next 1024k minextents 25 )
     3> tablespace rbs02;
Statement processed.
SVRMGR> create public rollback segment rbs3
     2> storage ( initial 1024k next 1024k minextents 25 )
     3> tablespace rbs03;
Statement processed.
SVRMGR> alter rollback segment rbs1 online;
Statement processed.
SVRMGR> alter rollback segment rbs2 online;
Statement processed.
SVRMGR> alter rollback segment rbs3 online;
Statement processed.
SVRMGR> alter rollback segment rbstemp offline;
Statement processed.
SVRMGR> drop public rollback segment rbstemp;
Statement processed.

一時表領域の作成

TEMP表領域を作成する。エクステント管理についてはRBSと同様、UNIFORM拡張LMTとする。また、初期エクステントサイズはSORT_AREA_SIZEと同じ値にする。なぜなら、SORTの際ページングが発生すると一時表領域を使用するからである。同じ値であればページングが効率よく行われる。

上記の続きより
SVRMGR> create temporary tablespace TEMP
     2> tempfile '/oracle/u02/oradata/LUPUS/temp01.dbf'
     3> size 64m reuse
     4> autoextend on next 64m maxsize unlimited
     5> extent management local uniform size 1m;
Statement processed.

SYSとSYSTEMユーザーの一時表領域を、作成したTEMPに設定する。

上記の続きより
SVRMGR> alter user SYS temporary tablespace TEMP;
Statement processed.
SVRMGR> alter user SYSTEM temporary tablespace TEMP;
Statement processed.

各種スクリプト実行

STANDARDプロシージャ等の作成を行うスクリプトを実行する。実行するスクリプトは、$ORACLE_HOME/rdbms/admin内のcatproc.sql、caths.sql、otrcsvr.sqlと、$ORACLE_HOME/sqlplus/admin内のpupbld.sql。pupbld.sqlはSYSTEMユーザーで実行する。

上記の続きより
SVRMGR> @/oracle/u01/app/oracle/product/8.1.7/rdbms/admin/catproc.sql
Statement processed.
...
SVRMGR> @/oracle/u01/app/oracle/product/8.1.7/rdbms/admin/caths.sql
Statement processed.
...
SVRMGR> @/oracle/u01/app/oracle/product/8.1.7/rdbms/admin/otrcsvr.sql
Statement processed.
...
SVRMGR> connect system/manager
SVRMGR> @/oracle/u01/app/oracle/product/8.1.7/sqlplus/admin/pupbld.sql
Statement processed.
...

TNS名とリスナーの設定

外部から接続できるようにTNS名とリスナーの設定を行う。まずは、$ORACLE_HOME/network/admin/tnsnames.oraから。下記を追加する。

LUPUS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = darkstar)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = LUPUS.ROBIOS.ORG)
    )
  )

tnsping LUPUSで確認を行う。

$ tnsping LUPUS

TNS Ping Utility for Solaris: Version 8.1.7.0.0 - Production on 14-SEP-2004 19:2
6:33

(c) Copyright 1997 Oracle Corporation.  All rights reserved.

Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=darkstar)(PORT=1521))
OK (10 msec)

次はリスナーの設定。$ORACLE_HOME/network/admin/listener.oraに下記を追加する。

LISTENERLUPUS =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = darkstar)(PORT = 1521))
      )
    )
  )

リスナーを起動してみる。

$ lsnrctl start LISTENERLUPUS

LSNRCTL for Solaris: Version 8.1.7.0.0 - Production on 14-SEP-2004 20:21:11

(c) Copyright 1998 Oracle Corporation.  All rights reserved.

Starting /oracle/u01/app/oracle/product/8.1.7/bin/tnslsnr: please wait...

TNSLSNR for Solaris: Version 8.1.7.0.0 - Production
System parameter file is /oracle/u01/app/oracle/product/8.1.7/network/admin/list
ener.ora
Log messages written to /oracle/u01/app/oracle/product/8.1.7/network/log/listene
rlupus.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=darkstar)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=darkstar)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENERLUPUS
Version                   TNSLSNR for Solaris: Version 8.1.7.0.0 - Production
Start Date                14-SEP-2004 20:21:12
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  OFF
SNMP                      OFF
Listener Parameter File   /oracle/u01/app/oracle/product/8.1.7/network/admin/lis
tener.ora
Listener Log File         /oracle/u01/app/oracle/product/8.1.7/network/log/liste
nerlupus.log
The listener supports no services
The command completed successfully

うまく起動した。

最後の仕上げ

/var/opt/oracle/oratabに今回構築したデータベースをリストする。こうすることで、oraenvコマンドでこのデータベースが選択できるようになる。また、自動起動、自動シャットダウンの設定も行える。とりあえず自動起動はなしで設定してみる。oratabファイルに下記を追加する。

LUPUS:/oracle/u01/app/oracle/product/8.1.7:N

以上で完成である。一般ユーザー用の表領域などは別途要作成。

Oracle 8i Install - 前準備

September 12, 2004

Sun Ultra 80を手に入れたので、手始めにOralce 8iをインストールしてみる。まずはカーネルパラメータの変更から。

カーネルパラメータ変更

変更すべきは2点。共有メモリパラメータとセマフォパラメータ。

/etc/system
に下記を追加する。

set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=10
set semsys:seminfo_semmni=100
set semsys:seminfo_semmsl=150
set semsys:seminfo_semmns=250
set semsys:seminfo_semopm=100
set semsys:seminfo_semvmx=32767

共有メモリ設定(shm*)についてはOracle推奨のデフォルト値で特に問題はない。shmmaxは、システム内全てのOracleデータベースで最大のSGAサイズより大きければよい。上記例であればこのシステムにおいて設定可能な最大のSGAは4Gとなる。(SGAをその最大値に設定する必要はない。また、仮にSGAを4Gに設定する場合でも実メモリは4G以上なければならない。ページングが行われるとデータベースパフォーマンスは著しく悪化する。)

セマフォ設定は、SEMMSL (Max Semaphore Sets) とSEMMNS (Max Semaphores) に注意する。Oracleの推奨では、SEMMSLは、システム内全てのOracleデータベースで最大のPROCESSESに10を加えたものをセット、SEMMNSは、システム内全てのOracleデータベースのPROCESSESの合計+システム内最大PROCESSES+10*データベース数をセットする。

例えば、

SID=ORA01, PROCESSES = 50
SID=ORA02, PROCESSES = 100
SID=ORA03, PROCESSES = 10

というシステムがあれば、

SEMMSL = MAX(PROCESSES) + 10 = 100 + 10 = 110
SEMMNS = SUM(PROCESSES) + MAX(PROCESSES) + 10 * COUNT(INSTANCE)
= 50 + 100 + 10 + 100 + 10 * 3 = 290

となる。

マウントポイントの作成

データベースをインストールするマウントポイントを作成する。基本的には、ソフトウェア用とデータ用と2つあればよい。OFA (Optimal Flexible Architecture) に従えば最低でも4つ必要となる。2つの場合は、/u01、/u02、4つの場合はさらに、/u03、/u04などを追加する。私はルート直下に作るのは気が引けるので、/oracle以下に/u01〜/04まで作成した。

マウントポイントというだけに、それぞれのディレクトリにはそれぞれ違うディスク(スライスではなく物理ディスク)をマウントするのがパフォーマンス上好ましい。最低でも、ソフトウェアとデータの格納ディスクは分けるべきである。ディスクが1つしかなくても、とりあえずマウントポイントは複数作っておき、将来ディスクを増設した際に移行すればよい。そういう意味では、OFAの考え方は非常に良い。

* OFAについてはOracle8i Administrator's Referenceを参照

グループとユーザーの設定

Oracleをインストール/実行するグループとユーザーを追加する。

グループはインストールグループと、データベース管理者グループを作成する。標準では、インストールグループはoinstall、管理者グループはdbaとなる。

ユーザーはOracleを実行するユーザーとなる。oracleなどとすればよい。このユーザーのPrimary GIDはインストールグループを、Secondary GIDは管理者グループを与える。ホームディレクトリはORACLE_HOMEにすればよい(後ほど決定する)。

ユーザープロファイル設定

umaskは022へ設定。

下記環境変数を設定する。

ORACLE_BASE
全てのOracleのベースとなるディレクトリ。Oracle Inventoryなどがインストールされる。推奨は、/u01/app/oracle
ORACLE_HOME
Oracleソフトウェアのディレクトリ。推奨は、$ORACLE_BASE/product/Release。8.1.7なら、/u01/app/oracle/product/8.1.7
ORACLE_SID
これからインストールするデータベースのSID。
NLS_LANG
これからインストールするデータベースの言語設定。文法は、言語_地域.キャラクタセットとなる。言語の部分はメッセージなどの言語になる。地域は、日付や通貨の表示形式を決定する。キャラクタセットは内部データのキャラクタセットとなる。お勧めは、AMERICAN_JAPAN.JA16EUC。これなら日本語が表示できない端末でも文字化けは起こらない。多言語化ならAMERICAN_JAPAN.UTF8だろうが、使用するアプリケーションのUnicode対応に要注意。

とりあえずこれでインストールを開始できる。

分析関数の基礎 - LAGとLEAD

September 09, 2004

分析関数の中でも、LAGとLEADは特殊な関数である。

LAGは、現在の行よりも前の行の何れかの項目の値を参照する。LEADは、現在の行よりも後の行の何れかの項目を値を参照する。これらは、通常であれば副問い合わせを行わなければ実現できない。

LAGの例

LAGは、選択した行の中で、現在の行よりも以前の行のデータを取り出す。言い換えれば、データを遅延(lag)して表示する。

各事業所(DEPT)での、各従業員の雇用日の間隔を計算してみる。PREV_HIREDATEは、その従業員より以前に雇用された従業員の直近の雇用日となる。GAPが間隔日数である。

ora817@robios.org>select dept.loc, emp.ename, emp.job, emp.hiredate,
  2    lag(emp.hiredate, 1, null) over
  3      (partition by dept.loc order by emp.hiredate) as prev_hiredate,
  4    emp.hiredate -
  5      lag(emp.hiredate, 1, null) over
  6        (partition by dept.loc order by emp.hiredate) as gap
  7  from scott.emp, scott.dept
  8  where emp.deptno = dept.deptno;

LOC           ENAME      JOB       HIREDATE PREV_HIR        GAP
------------- ---------- --------- -------- -------- ----------
CHICAGO       ALLEN      SALESMAN  81-02-20
CHICAGO       WARD       SALESMAN  81-02-22 81-02-20          2
CHICAGO       BLAKE      MANAGER   81-05-01 81-02-22         68
CHICAGO       TURNER     SALESMAN  81-09-08 81-05-01        130
CHICAGO       MARTIN     SALESMAN  81-09-28 81-09-08         20
CHICAGO       JAMES      CLERK     81-12-03 81-09-28         66
DALLAS        SMITH      CLERK     80-12-17
DALLAS        JONES      MANAGER   81-04-02 80-12-17        106
DALLAS        FORD       ANALYST   81-12-03 81-04-02        245
DALLAS        SCOTT      ANALYST   82-12-09 81-12-03        371
DALLAS        ADAMS      CLERK     83-01-12 82-12-09         34
NEW YORK      CLARK      MANAGER   81-06-09
NEW YORK      KING       PRESIDENT 81-11-17 81-06-09        161
NEW YORK      MILLER     CLERK     82-01-23 81-11-17         67

14行が選択されました。

経過: 00:00:16.01

実行計画
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   WINDOW (SORT)
   2    1     NESTED LOOPS
   3    2       TABLE ACCESS (FULL) OF 'EMP'
   4    2       TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
   5    4         INDEX (UNIQUE SCAN) OF 'SYS_C0094164' (UNIQUE)




統計
----------------------------------------------------------
          0  recursive calls
          4  db block gets
         17  consistent gets
          4  physical reads
          0  redo size
       1108  bytes sent via SQL*Net to client
        420  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         14  rows processed

それぞれの事業所で初めの行のPREV_HIREDATEがブランクなのは、それ以前の行がないからである。この場合は、LAGの3番目の引数(今回はNULL)を表示する。

LEADの例

LEADは、選択した行の中で、現在の行よりも以降の行のデータを取り出す。言い換えれば、データを先取り(lead)して表示する。

従業員SMITHからKING社長まで、直属との上司との給与の差を計算する。MGR_SALが直属の上司の給与、GAPが自分の給与との差である。(FORDは上司のJONESよりも給与が良い!)

ora817@robios.org>select job, ename, hiredate, sal,
  2    lead(sal, 1, null) over (order by rownum) as mgr_sal,
  3    lead(sal, 1, null) over (order by rownum) - sal as gap
  4  from (
  5    select rownum, job, ename, hiredate, sal
  6    from scott.emp
  7    connect by prior mgr = empno
  8    start with empno = 7369);

JOB       ENAME      HIREDATE        SAL    MGR_SAL        GAP
--------- ---------- -------- ---------- ---------- ----------
CLERK     SMITH      80-12-17        800       3000       2200
ANALYST   FORD       81-12-03       3000       2975        -25
MANAGER   JONES      81-04-02       2975       5000       2025
PRESIDENT KING       81-11-17       5000

経過: 00:00:10.02

実行計画
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   WINDOW (SORT)
   2    1     COUNT
   3    2       VIEW
   4    3         COUNT
   5    4           CONNECT BY
   6    5             INDEX (UNIQUE SCAN) OF 'SYS_C0094163' (UNIQUE)
   7    5             TABLE ACCESS (BY USER ROWID) OF 'EMP'
   8    5             TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
   9    8               INDEX (UNIQUE SCAN) OF 'SYS_C0094163' (UNIQUE)




統計
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          2  physical reads
          0  redo size
        543  bytes sent via SQL*Net to client
        369  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          4  rows processed

KING社長のMGR_SALがブランクなのは、それ以降の行がないからである。この場合は、LEADの3番目の引数(今回はNULL)を表示する。

LAG/LEADの文法

LAG/LEAD ( 項目または式, <Offset>, <Default>) over (
  <Partition-Clause>
  Order-By-Clause
)

項目または式は、値を取得したい項目、またはそれを組み合わせた式となる。

Offsetでは、LAGの場合は現在行から何行前から、LEADの場合は現在行から何行後からデータを取得するかを指定する。省略した場合は1となる。

Defaultは、境界を越えてしまいデータの取得が行えない場合に、表示する値である。省略した場合はNULLとなる。

LAG/LEADでは、Order-By-Clauseが必須となる。また、Windowing-Clauseは使えない。Partition-Clauseは任意で設定する。

ヴァン・ヘルシング - Van Helsing

September 05, 2004

ヴァン・ヘルシングを観た。

Yahoo!ムービーによる解説:
モンスター・ハンター“ヴァン・ヘルシング”とドラキュラの運命の対決を描くスペクタクル・アドベンチャー。監督は「ハムナプトラ」シリーズのスティーヴン・ソマーズ。ヴァン・ヘルシングを演じるのは、セクシー男優のヒュー・ジャックマン。クールなヒロインにケイト・ベッキンセール。3人のドラキュラの花嫁は迫力満点で特にその飛行姿には要注目。

大規模なマーケティングの割にはやっぱりいまいちか、、、。007+インディージョーンズ/2みたいな感じ。続き物なんでしょうね、きっと。

映像技術はすごいけど、ストーリーがなぁ、、、。ありきたりすぎる。まぁ、確かにリーグ・オブ・レジェンドよりはましかな。

監督: Stephen Sommers
出演: Hugh Jackman, Kate Beckinsale, 他

誰も知らない - Nobody Knows

September 04, 2004

誰も知らないを観た。

Yahoo!ムービーによる解説:
主演の柳楽優弥が史上最年少の14歳という若さで、2004年度カンヌ国際映画祭主演男優賞に輝いた話題作。『ディスタンス』の是枝裕和監督が実際に起きた、母親が父親の違う子供4人を置き去りにするという衝撃的な事件を元に構想から15年、満を持して映像となった。女優初挑戦の、YOU扮する奔放な母親と子役達の自然な演技も秀逸。母の失踪後一人で弟妹達の面倒をみる長男の姿は、家族や社会のあり方を問いかける。

1988年、東京・西巣鴨で実際に起こった子供置き去り事件をモチーフにしている。解説では、母親が子供らを置き去りにする所までは、実際の事件と同じだが、その後の子供たちの生活や心理描写は創作とのこと。

しかし、事件について少し調べてみると、その後の生活についてもあながち創作とは言えないくらい、過酷なものであったらしい。実際にはもう一人乳児がおり、引越し前に亡くなっている。さらに、2歳児の女の子もいじめで亡くなっている。

無責任な親が増えている最近の世の中へ、子供たちの生き様は、何かを訴えかけることができただろうか。

監督: 是枝裕和
出演: 柳楽優弥, 北浦愛, YOU

分析関数の基礎

September 01, 2004

Oracle 8.1.6より、分析関数 (Analytic Function) という非常に強力なSQL拡張機能が実装されている。この機能を使えば、今までは副問い合わせを用いてしか可能でなかった問い合わせを、簡単に、そしてスピーディーに実行することができる。

分析関数が通常の集計関数 (Aggregate Function) と大きく異なるのは、通常の関数はグルーピングを行った「集合」に対し値を1つ返すにのに対し、分析関数はグルーピングを行った「同グループ内のそれぞれの行」に対し「同グループ内で、与えられた範囲を基に集計」を行い値を返す(非常に分かり辛いため後述の例を参考下さい、、、)。分析関数ではこのグルーピングされた行集合の中の、与えられた範囲を「窓 (Window)」と呼ぶ。分析関数は、各行において、与えられた窓内で集計を行い値を返すのである。

はじめに一例

ora817@robios.org>select emp.empno, emp.job, emp.ename, emp.sal,
  2   sum(sal) over (partition by job order by empno) as cumulative_sum,
  3   row_number() over (partition by job order by empno) as seq
  4  from scott.emp;

     EMPNO JOB       ENAME             SAL CUMULATIVE_SUM        SEQ
---------- --------- ---------- ---------- -------------- ----------
      7788 ANALYST   SCOTT            3000           3000          1
      7902 ANALYST   FORD             3000           6000          2
      7369 CLERK     SMITH             800            800          1
      7876 CLERK     ADAMS            1100           1900          2
      7900 CLERK     JAMES             950           2850          3
      7934 CLERK     MILLER           1300           4150          4
      7566 MANAGER   JONES            2975           2975          1
      7698 MANAGER   BLAKE            2850           5825          2
      7782 MANAGER   CLARK            2450           8275          3
      7839 PRESIDENT KING             5000           5000          1
      7499 SALESMAN  ALLEN            1600           1600          1
      7521 SALESMAN  WARD             1250           2850          2
      7654 SALESMAN  MARTIN           1250           4100          3
      7844 SALESMAN  TURNER           1500           5600          4

14行が選択されました。

経過: 00:00:06.03

実行計画
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   WINDOW (SORT)
   2    1     TABLE ACCESS (FULL) OF 'EMP'




統計
----------------------------------------------------------
          0  recursive calls
          4  db block gets
          1  consistent gets
          1  physical reads
          0  redo size
        978  bytes sent via SQL*Net to client
        287  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         14  rows processed

CUMULATIVE_SUMが、各JOBにおけるEMPNO順でのSALの累計、SEQは各JOBにおけるEMPNO順でのシーケンスになっている。

分析関数の文法

Analytic-Function(<Argument>, <Argument>, ...) over (
  <Partition-Clause>
  <Order-By-Clause>
  <Windowing-Clause>
)

Analytic-Function

分析関数には下記の関数がある。一部は9iからの実装である。

AVG, CORR, COVAR_POP, COVAR_SAMP, COUNT, CUME_DIST, DENSE_RANK, FIRST (9i), FIRST_VALUE, LAG, LAST (9i), LAST_VALUE, LEAD, MAX, MIN, NTILE, PERCENT_RANK, PERCENTILE_CONT (9i), PERCENTILE_DISC (9i), RANK, RATIO_TO_REPORT, REGR_ (Linear Regression) Functions, ROW_NUMBER, STDDEV, STDDEV_POP, STDDEV_SAMP, SUM, VAR_POP, VAR_SAMP, VARIANCE

Partition Clause

Partition句では、集計を行う窓のグループ分けを行う。丁度、通常の集計関数におけるGROUP BY句に等しい。分析関数は、この句で定義した項目でグルーピングし、それぞれのグループ内の窓で集計を行う。省略した場合は、選択行全てが同一グループとなる。

文法: PARTITION BY 項目 ( , 項目, ... )

Order-By Clause

Order-By句では、グループ内でのデータのソート順を定義する。集計は、この句で定義されたソート順に沿って行われる。

文法: ORDER BY 項目 ( , 項目, ...) ASC/DESC ( NULLS FIRST/LAST )

Windowing Clause

Windowing句では、窓そのものを定義する。窓は範囲である。範囲は、物理的な行での範囲指定と、論理的な値での範囲指定とある。前者はROWS、後者はRANGEで表す。

文法: ROWS/RANGE [範囲指定句]

範囲指定句では、始点と終点を指定する。

文法: BETWEEN [始点] AND [終点]

終点を現在行とし、始点だけ指定することもできる(この場合始点は、UNBOUNDED PRECIDING、CURRENT ROW、N PRECEDINGのみとり得る)。

文法: [始点]

始点/終点には、グループ内先頭のUNBOUNDED PRECEDING、現在点のCURRENT ROW、グループ内後尾のUNBOUNDED FOLLOWING、現在点からN前方のN PRECEDING、現在点からN後方のN FOLLOWING、の5種類がある。Nは、ROWSであれば行数、RANGEであれば値の差となる。グループ内先頭、後尾とは前述したOrder-By句でのソート順における先頭、後尾となる。

Windowing Clauseを省略した場合は、RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW となる。すなわち、グループ先頭から現在の行までが窓となる。

ora817@robios.org>select *
  2  from (
  3   select dept.loc, dept.dname, emp.job, emp.ename, emp.sal,
  4    dense_rank() over (partition by dept.loc order by sal desc) as rank
  5   from scott.emp, scott.dept
  6   where emp.deptno = dept.deptno)
  7  where rank <= 3;

LOC           DNAME          JOB       ENAME             SAL       RANK
------------- -------------- --------- ---------- ---------- ----------
CHICAGO       SALES          MANAGER   BLAKE            2850          1
CHICAGO       SALES          SALESMAN  ALLEN            1600          2
CHICAGO       SALES          SALESMAN  TURNER           1500          3
DALLAS        RESEARCH       ANALYST   SCOTT            3000          1
DALLAS        RESEARCH       ANALYST   FORD             3000          1
DALLAS        RESEARCH       MANAGER   JONES            2975          2
DALLAS        RESEARCH       CLERK     ADAMS            1100          3
NEW YORK      ACCOUNTING     PRESIDENT KING             5000          1
NEW YORK      ACCOUNTING     MANAGER   CLARK            2450          2
NEW YORK      ACCOUNTING     CLERK     MILLER           1300          3

10行が選択されました。

経過: 00:00:06.03

実行計画
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   VIEW
   2    1     WINDOW (SORT PUSHED RANK)
   3    2       NESTED LOOPS
   4    3         TABLE ACCESS (FULL) OF 'EMP'
   5    3         TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
   6    5           INDEX (UNIQUE SCAN) OF 'SYS_C0094164' (UNIQUE)




統計
----------------------------------------------------------
          0  recursive calls
          4  db block gets
         17  consistent gets
          0  physical reads
          0  redo size
        775  bytes sent via SQL*Net to client
        318  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         10  rows processed

各事業所(DEPT)での、給与上位3位までをリストアップしている。

Creative Commons License This weblog is licensed under a Creative Commons License.