気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Oracle 実行計画、統計情報の概要

SQLが実行されるまでの流れ

まずは、SQL実行の全体像について確認する。

f:id:tamata78:20210128173916p:plain

  • サーバープロセスがSQLを受け取る
  • SQLチェック:構文チェック、指定テーブルや列の確認、アクセス権の確認
  • 実行計画の確認:共有プール内に該当SQLの実行計画があるかどうか。あればそのまま検索。なければ、オプティマイザの処理へ
  • オプティマイザで評価:統計情報を参照しつつ、実行計画をいくつか作成、比較して最適な実行計画を選択
  • 選択した実行計画を共有プールへ格納する
  • 実行計画を元にSQLを実行する

画像引用:https://qiita.com/zd6ir7/items/abbb1e92701992d32b88

実行計画

SQLを実行するための計画。
フルスキャンする、インデックスを使うなどの無数の選択肢から最短ルートの実行方法を計画したもの
統計情報を元に作成されるため、統計情報が適切な情報になっていることが重要

統計情報

  • 構成: 表統計、列統計、索引統計、システム統計
  • 取得タイミング:自動、手動、SQL実行時

ECサイト経営で使う用語

ECサイトで使われるKPIにおけるよく使われる用語を書いておきます。

GMV(グロスマーチャンダイズ・ボリューム)

  • 概要:流通取引総額。購入される商品やサービスの販売総額を表す
  • 補足:企業の収益総額ではない。手数料ビジネスの企業であれば、商品取引時の手数料や広告料などGMVの一部が収益となる
  • 用途:市場規模の測定など

ARPU(Average Revenue Per User)

  • ユーザー1人当たりの売上金額を表す指標

logrotateでログをローテ―トする

アプリのlog4jなどでしかログローテートできないと思っていましたが、 linuxのコマンドでlogrotateなるものがあることを知ったので、まとめてみます。

環境

Red Hat 4.4.7-4

設定ファイル構成

├─ logrotate.conf # メインの設定ファイル
├─ logrotate.d # 各サービスごとの設定ファイル
│   ├─ dracut
│   ├─ httpd
│   ├─ tomcat
│   ├─ mysql
│   ├─ syslog
│   ├─ yum

logrotate.d以下に、各サービス毎の設定ファイルを配置するのが一般的

設定例

/var/log/app/*.log {
   copytruncate #ログファイルをコピーし、内容を削除
   rotate 7 #7世代分古いログを残す
   start 1 
   daily # 日次ローテーション
   nomail 
   compress # ローテーションログをgzipで圧縮
   missingok # ログファイルなしでもエラーを出さずに処理続行
   postrotate # ログローテーション後に以下を実行
       /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true # syslog再起動
   endscript
}

ローテートの動作確認

# テスト実行して結果を参照
$ logrotate -dv /etc/logrotate.conf

# 実際の実行
$ /usr/sbin/logrotate /etc/logrotate.conf

# 最終ローテ―ト日時の確認
$ cat /var/lib/logrotate.status
logrotate state -- version 2
"/var/log/yum.log" 2015-1-1
"/var/log/httpd/80-access_log" 2021-1-19
"/var/log/httpd/80-error_log" 2021-1-1

【関連情報】syslog

  • 概要:linux上の動きをログ出力する仕組み。syslogデーモンでログが記録される
  • パス:/var/log
  • デフォルトログ:cron、 messages、maillog、secureなど。
  • 設定ファイル:/etc/syslog.conf

Logbackのログローテート設定

Spring Boot内のLogbackを用いて、ログローテートを行う際の設定について以下にまとめます。

ログローテする場合のLogback設定

以下前提で設定しました。

  • ローテ―トタイミング:日別
  • 最大保存ファイル数:3
  • 保存形式:gz (ローテ―ト時に圧縮)
<configuration>

    <springProfile name="develop">
        <include resource="org/springframework/boot/logging/logback/defaults.xml" />
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <property name="logDir" value="/work/logs/batch/" />
        <property name="fileName" value="TestBatch.log" />
        <property name="format" value="%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-5le %lo{36} - %msg %n" />

        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <file>${logDir}${fileName}</file>
          <encoder>
            <pattern>${format}</pattern>
          </encoder>
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logDir}${fileName}.%d{yyyy-MM-dd}.gz</fileNamePattern> <!-- 拡張子をgz、zipなどにすると自動で圧縮される-->
            <maxHistory>3</maxHistory> <!-- 最大保存ファイル数 -->
            <cleanHistoryOnStart>true</cleanHistoryOnStart> <!-- 最大ファイル数超過時にファイルを削除するか否かの設定 -->
          </rollingPolicy>
        </appender>

        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${format}</pattern>
            </encoder>
        </appender>

        <logger name="jp.co.test.batch" level="debug"></logger>

        <root level="debug">
            <appender-ref ref="FILE" />
            <appender-ref ref="STDOUT" />
        </root>
    </springProfile>

%d{}変換指示子内の日時パターン文字列

java.text.SimpleDateFormatの規約に従う。
https://docs.oracle.com/javase/jp/7/api/java/text/SimpleDateFormat.html
→日付/時刻パターン

ログローテ単位毎の書き方

logFile.%d{yyyy-MM-dd}.log
%d{}のフォーマットを書き換えることで、ローテーションタイミングが決まる。

日次:logFile.%d.log  → 2006-11-24
月次ローテ:logFile.%d{yyyy-MM}.log → 2006-11 ※ "%d{yyyy/MM}/logFile.log"とすると、月次ディレクトリが作成される
週次ローテ:logFile.%d{yyyy-ww}.log
毎時ローテ:logFile.%d{yyyy-MM-dd_HH}.log
毎分ローテ:logFile.%d{yyyy-MM-dd_HH-mm}.log

ファイルサイズでローテ―トしたい場合

triggeringPolicyをappender RollingFileAppender以下に追加する。

<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  <!-- ファイルサイズによってローテートする -->
  <maxFileSize>20MB</maxFileSize>
</triggeringPolicy>

おまけ Windowsでシステム日付を変更する

Windowsで日付を変更してローテ―トのテストをしたい場合は、以下のコマンドを利用して見てください。 コマンドプロンプトを管理者で開いて、dateコマンドで日付変更

f:id:tamata78:20210118181322p:plain

参考URL

オブジェクトのマーシャリングとは?

マーシャリングとは?

マーシャリング、アンマーシャリングという言葉がたまに出てくるが、
これは、オブジェクトをファイル、DBなどに保存できる形式に変換、または変換を戻すことを指す。

同義の用語としては以下がある。
※マーシャリングは、シリアル化とほぼ同じ。リモートオブジェクトの処理に違いがあるらしい。

変換後のデータ

  • Beanが保持するデータのみをシリアル化
  • 参照先などの状態はほとんどの場合、失われる

オブジェクトは、ポインタ(アドレス参照)を多く使っているため、そのままファイルを書き出すことができない

そのため、書き出すことができる形式にデータを整形する必要がある。
この整形処理を「マーシャリング(シリアル化)」と呼んでいる。

オブジェクトの変換先対象

マーシャリングすることで「ファイルへのデータの保存」 アンマーシャリングすることで「ファイルからのデータの読み込み」 を行います。

マーシャリングはリモート呼び出しで受け渡すクラスに対してよく使われる。

Javaでの関連API

javax.xml.bind.UnmarshallerXMLデータをJavaオブジェクト変換するAPI

参考URL

ELB、ALBの正式名称

AWSには複数の種類のロードバランサーが存在しています。正式名称とざっくりとした内容を記載しておきます。

ELBとは

ELBとは「Elastic Load Balancing」の略称で、元々はこのELBがAWSにおけるロードバランシングサービスでした。

ここにALB、CLB、NLBという3種類のロードバランサー追加されたことにより、 AWSのロードバランシングサービスの総称を指す言葉がELBとなりました。

ALB、CLB、NLBのの正式名称は?

  • ALB:「Application Load Balancing」の略称
  • CLB: 元々のELBはその名称を「Classic Load Balancer(CLB)」に変えた。
  • NLB: Network Load Balancer。

Beanを簡単にXMLに書き出す Betwixt

BetwixtはJavaBeansを簡単にXMLに書き出すためのAPIです。
詳細は以下の参考URLを参照。

公式Doc http://commons.apache.org/dormant/commons-betwixt/ http://commons.apache.org/dormant/commons-betwixt/apidocs/index.html

はじめてのJakarta Commons Betwixt http://www.xucker.jpn.org/java/other/commons_betwixt_first.html