Oracleで表示する件数を絞って表示する方法

Oracleでは件数を絞ってSELECTできないと言われたので、
rownumを用いてSELECTする方法メモ。

表示する件数を決めて表示するSQL

select * from 表名
  where rownum <= 件数

rownumを使う場合の注意点

order by句を使う場合、rownumの条件で抽出された値の中でソート処理が実施されてしまうため、
望んだ結果が得られない。
例えば、

select username from dba_users
  where account_status='OPEN' 
    and rownum <= 5
      order by username asc;

ではダメで、dba_usersから5件SELECTした結果をソートしてしまう。
正しくソートした結果を表示するためには、下記の通り検索する表を副問い合わせで
呼び出す必要がある。

select username from (
  select username from dba_users
    where account_status='OPEN' 
      order by username asc)
  where rownum <= 5;

サーバ管理者が知らなきゃいけない3つのコマンド

今日はサーバ管理者が知らなきゃいけない3つのコマンドのお話です。
ごめんなさい。知ってたら便利だよぐらいにしておきます。

tasklist

まず一つ目は「tasklist」コマンドです。
tasklistは現在動作しているタスクの一覧を表示するコマンドで、
ご存知Unixでの「ps」相当になります。

また、スイッチもわりと便利なものが多く、

  • /fi ⇒条件に一致したものを表示
  • /svc ⇒プロセス内部のサービスも表示する

とかがあります。

netstat

二つ目は「netstat」。
これもサーバ管理者や、ネットワークエンジニア御用達のコマンドです。
基本的な動作としては使用しているポート番号が表示されるコマンドですが、
上記「tasklist」と合わせてプロセスが使っているポート番号を調べたり、
下記スイッチを組み合わせて、ルーティングテーブルを調べたりできます。

  • /a ⇒全ての接続と、listenポートが表示される
  • /n ⇒アドレスとポートを数値形式で表示する
  • /r ⇒ルーティングテーブルを表示する

net start

最後は「net start」です。
「net」コマンドには多くのサブコマンドがあるが、サーバの運用時に必ず使うのが
「net start」でしょう。
「net start」はサービスの起動に関連するコマンドです。
サービスの起動を行うこともできますが、「net start」のみを実行すると、
起動しているサービス一覧を取得できます。
再起動前後で「net start」をtxtにリダイレクトしておき、
fcコマンドで比較すれば、サービスの起動漏れを防げます。

怒涛の8-10月

運よくVMware Certified Professinal(VCP)とOracle Goldの研修を受講することができたので、8-10はみっちり勉強することができそうです。
ブログ内容が更にOracleに偏りそうな予感。
ネットワークエンジニアのはずなのになー。

受験予定

8月:VCP
9月:Oracle Master Gold 10g

情報セキュリティスペシャリスト合格

情報セキュリティスペシャリスト試験に合格しました。
点数は以下の通り。

午前1:免除
午前2:80
午後1:69
午後2:73

情報処理高度試験に合格するのは初めてなのでうれしかったです。
次回はネットワークスペシャリスト合格を目指します。

[追記]
まとまった時間ができたらまとめエントリ書きます。
ネスペに向けて勉強も始めたいなー

サブクエリまとめ

友人がサブクエリが分からないと言っていたので、
今日はサブクエリのお勉強。

サブクエリについては、SELECTの中にSELECTがあったり訳が分からなくなりそうですが、要するにカッコの中を先に計算しましょうということ。
数学のカッコ()と同じと考えれば分かりやすいと思う。

サブクエリ内とメインクエリで同じ表を参照していると分かりやすいので、例を一つ。

ex1)
select username from dba_users
  where username=(
    select usernaem from dba_users where username='SYS');
ex2)
select username from dba_users
  where username='SYS';

上記ex1)とex2)では検索結果では全く同じものが返ってくる。
なぜなら、ex1)のサブクエリ部がSYSとなり、カッコ内がSYSとなるからだ。
また、ex1)の様に、サブクエリ部が返す値が一行に固定されるものを、単一行サブクエリと呼んだりする。

サブクエリ部が返す行が一行に固定される単一行サブクエリに対して、複数の行を返すサブクエリを複数行サブクエリと呼ぶ。
下記ex3)のサブクエリ部を実行すると、Oracleデフォルトでは、SYS,SYSMAN,SYSTEMの三行が返ってくる。
また、複数行サブクエリでは、演算子として「=」を使用することはできず、「any,in,all」の三種類を演算子として使用することができる。

ex3)
select username from dba_users
  where username in (
    select username from dba_users
      where username like 'SYS%'
      );

まとめ

  • サブクエリ部分は()で囲う
  • メインクエリの比較などがサブクエリ部と実施されること以外は通常の演算と同じ
  • サブクエリは返される行数によって、単一行サブクエリ、複数行サブクエリに分類される
  • 単一行サブクエリでは「=,in,any,all」使用可能
  • 複数行サブクエリでは「all,in,any」使用可能
  • where句,having句の後以外のも、select句の後、from句の後など、多彩な場所に指定可能

Windows Server とパフォーマンスモニタ

Windowsには、パフォーマンスモニタと呼ばれる、パフォーマンス監視ツールが標準で準備されている。
Windows Server等では、パフォーマンスモニタを利用して稼動統計を取得したり、負荷を計測するのが一般的だ。
ただし、パフォーマンスモニタには非常に多くのパフォーマンスオブジェクト、カウンタが用意されており、あまりにも分かりにくい。
そこで、主なカウンタ、logmanについてまとめてみた。

perfmonのカウンタについて

主なパフォーマンスオブジェクトとカウンタは以下の通り

パフォーマンスオブジェクト カウンタ 用途
memory available bytes 利用可能な物理メモリの容量
memory cache bytes システムキャッシュの使用量
network interface bytes received/sec インタフェース毎の受信量
network interface bytes sent/sec インタフェース毎の送信量
processor processor time CPUの使用率
process thread count 内部スレッドの数
process virtual bytes プロセスが使用している全メモリ量
process working set プロセスが使用している物理メモリ量
process private bytes プロセスが占有しているメモリ量

上記のうち、よく利用するものに、パフォーマンスオブジェクト「process」がある。
processを利用すると、プロセス毎にメモリ量を取得できる。
基本的にWebサーバであればWebインスタンス、DBサーバであればDBインスタンスがシステムの肝になるので、それぞれの統計を取得することはチューニングの上で非常に有用な情報となる。
(32bitOS上のOracleでは2GB制限を突破しないためにも必須)

ちなみにタスクマネージャからメモリ使用量、仮想メモリサイズが確認できるが、実はそれぞれ上記「Working set」「private bytes」の値となっている。
全メモリ量を確認するにはパフォーマンスモニタを使用するしかない。

logmanについて

パフォーマンスログの取得はGUI上からも設定できるが、logmanコマンドを利用してCUIで設定することもできる。
ちなみにログの繰り返し取得設定はlogmanを利用しないとできない[-rオプション]
(GUIからの設定方法があれば是非教えて)

基本的な使い方は「logman /?」にお譲りするとして、GUIツールに比べたlogmanの最大のメリットはなんといっても繰り返し設定が使用可能な事だろう。
作りやすいGUIからコレクションを作成し、logmanコマンドから繰り返し設定するのが最強だと思っている。

参考までに既存のコレクションを繰り返し設定に変更するlogmanコマンド

logman update コレクション名 -u 実行するユーザ名 パスワード -r
logman query コレクション名

Oracleユーザプロファイル確認方法

Oracleではユーザ毎にリソース制限、セキュリティ制限を設定することはできず、必ずユーザと紐付けられているプロファイルにリソース制限、セキュリティ制限を割り当てることになっている。つまり、ユーザのリソース制限、セキュリティ制限の確認のためには紐付けられているプロファイルを確認しなければならない。

また、プロファイルの割り当てられていないユーザ存在しない。明示的に割り当てていない場合、デフォルトではDEFAULTプロファイルが割り当てられる。

  • ユーザに割り当てられているプロファイルを確認するSQL
SELECT USERNAME,PROFILE
  FROM DBA_USERS
    WHERE ACCOUNT_STATUS='OPEN';
  • ユーザに割り当てられているリソース制限、セキュリティ制限を確認するSQL
SELECT s.USERNAME,t.RESOURCE_NAME,t.LIMIT
  FROM DBA_USERS s,DBA_PROFILES t
    WHERE s.PROFILE = t.PROFILE
      AND s.USERNAME='SYSTEM';

例ではSYSTEMユーザに割り当てられているリソース制限、セキュリティ制限を確認。
最終行を消すと全てのユーザについて確認できるが、検索結果がDBA_USERSとDBA_PROFILESの直積となってしまうので、注意。

  • 最後にプロファイルの変更方法。
ALTER PROFILE プロファイル名 LIMIT名 値;

再起動なども必要なく、瞬時に変更される。