SQL Server 遅いクエリの特定
MySQLなんかだと
slow_query_log=ON
slow_query_log_file=/var/lib/mysql/mysql-slow.log
long_query_time=5
とかで分かるのですが、SQL Server の場合のやり方を知らなかったのでメモします。環境が SQL Server 2000 なので参考にならないかもしれませんが、取り敢えず。
スタートメニューから「Microsoft SQL Server」→「プロファイラ」を順に選びます。
メニュー「ファイル」→「新規追加」→「トレース」を順に選びます。
「SQL Server の接続」ダイアログで接続対象や認証情報を入れて「OK」ボタン。
「トレース プロパティ」ダイアログで
【全般】
トレース名:お好きな名前をどうぞ
テンプレート名:SQLProfilerTSQL_Duration
【イベント】はそのまま
【データ列】
StartTime、EndTime、HostNameを追加しておくと便利
【フィルタ】
「Duration」→「Greater than or equal」にミリ秒を入れる
(例:3秒以上かかるものを対象とするなら3000)
で、「実行」ボタン。
これでリストに表示される。CSV出力ができないしカラムでソートできないのでリスト選択してコピー、エクセルにペーストしてフィルタかけるなりして閲覧した方が良いかもしれません。
最新の SQL Server はこの辺りどうなんでしょうかね、きっと便利になっているのでしょう。
トレースが終わったらツールバーの所にある停止を押して止めましょう。それなりに負荷をかけるでしょうから、必要最小限に留めたいですね。
著者:t.n
awsのCloudFrontを試してみる
awsのCloudFront、要するにCDNですね。
今持っているアカウントが無料期間中なので、せっかくだから試してみました。
今回用意したコンテンツ自体がテキスト数行だった為、その速度向上については触れる事ができません。
CloudFrontの設定で少しハマったのでその点について少しだけ。
まず、CloudFrontの設定を変えて思った通りに動かない時、DistributionのStatusがDeployedになっているかを確認しましょう。何か設定を変えると10分~20分くらいは更新処理で反映されていない点に注意!
せっかちな私は設定を変えて「Save」ボタンを押したらすぐに反映すると思いこんで、思った通りに動かず、あーでもないこーでもないと無駄に時間を費やしてしまいました…。
きっとあちこちにあるサーバーに情報を同期させる為、時間がかかってしまうのでしょうね。
次に設定を変更してもそもそもキャッシュされたままだと反映されないやつもある。取り敢えずDistributionの詳細からInvalidationsタブを選択し、Create Invalidationから任意のObject Pathsを指定してInvalidateしてみましょう。
ちなみにこの処理も結構時間がかかります。StatusがCompletedになるまでしっかりと待ってから次の行動に移すのが吉です。
CloudFrontを使う場合はEC2やS3と連動させると思いますが、Distributionの詳細からBehaviorsタブでBehaviorを追加する事で、任意のパターンファイルを任意のEC2やS3から取って来る形に構成する事ができます。
例えば *.jpg は S3 から、*.php は EC2 から、といった感じです。ちなみにphpはキャッシュして欲しく無いのでBehaviorの設定でObjectCachingをCustomizeにし、Minimum TTLを0としたのですが、保存しても設定が反映されません。気付かずに何度か無駄に更新してしまいました。
CloudFrontのキャッシュ時間(TTL)はどの程度なのか | Developers.IO
上記のリンクにあるページから、headerでCache-Controlを使うのが順当なやり方だと知り、phpに
<?php header("Cache-Control: no-cache"); ?>
を付ける形でキャッシュさせないようにできました。
とりあえずここまで
著者:t.n
mysqldumpしたファイルを圧縮しつつ他のサーバーに飛ばす
とあるサーバー上でmysqldumpしたいけど、そのサーバーはHDDの容量が少なくて(この時点で問題があるように思うが…)他のサーバーに保存したい時のお話です。
相変わらずlinuxのストリーミング処理には関心させられますね。大助かりです。
コマンド例としては以下の通り
mysqldump -udbuser -pdbpass dbname | gzip | ssh -l username 123.123.123.123 'cat > ~/dump.sql.gz'
パラメータについて
dbにアクセス可能なユーザー名:dbuser
上記ユーザーのパスワード:dbpass
dumpするDB名:dbname
転送先サーバーのIPアドレス:123.123.123.123
転送先サーバーのユーザー名:username
転送先サーバー上の保管先:~/dump.sql.gz(ホームディレクトリ直下ですね)
mysqldumpした内容をgzipで圧縮しつつsshで接続先に飛ばしてその内容を保存するという流れですね。この例ではsshでパスワード認証を想定しており、コマンド実行後はパスワードを入力する必要があります。
ちなみにmysqldump側で-pの直後にDB側のパスワードを指定しない場合、最初のDBのパスワード、次にsshのパスワードを入力する必要があります。私の環境だけかもしれませんが、DBのパスワードを入れた直後は何も表示されなくなり、Enterを押すと「もう一度sshのパスワード入れて」と表示され、そこでsshのパスワードを入れると処理が開始されます。何かやり方を間違えているのでしょうかね…。
あと、このやり方だと、sshで鍵認証を使っている場合は秘密鍵をmysqldumpする側のサーバーに持って来て、ssh の -i で指定する必要がありそうですね。転送先のサーバーにログインして、取りに来るというやり方も出来るかと思いますが、結局転送元が鍵認証だったら同じ事になるので、まぁ臨機応変にという感じでしょうか。
著者:t.n
複数人でのunity開発に関して
unityを複数メンバーで開発する際、色々と注意する事がある。
そんな注意事項をまとめて下さっている素敵な記事をご紹介。
Unity開発者が複数人で開発を進める上で覚えておくと幸せになる9つの事 - テラシュールブログ
gitでファイルロックできないかな~(ひとりごと)
著者:t.n
.gitignoreについて
gitの管理対象外ファイルを指定する.gitignoreについて。
.gitignoreの書き方に関して、よく正規表現が使えるという記述があったりしますが、実際には簡易正規表現のようなもので、globパターンというものが使えるようです。
・空行あるいは # で始まる行は無視される
・標準の glob パターンを使用可能
・スラッシュ( / )で始まる場合はルートディレクトリからを表す
・ディレクトリを指定するには、パターンの最後にスラッシュ (/) をつける
・パターンを逆転させるには、最初に感嘆符 (!) をつける
・複数マッチするパターンがある場合は最後にマッチするものが優先
globパターンの主なもの
・* 任意の0文字以上の文字列
・? 任意の1文字
・[abc] a or b or cのいずれかに一致
・[a-d] aからdまでにいずれかに一致
例えば a*e であれば age, ace, abcde, axxxxxxxxxxe などが該当する。
例えば a?e であれば age, ace, axe などが該当する。
著者:t.n
linuxのsedが便利
圧縮状態で数GB、解凍したら数十GBもあるような巨大なテキストデータから特定の部分を削除したい場合に重宝する。
テキストエディタで開くのは非常に難しい。秀丸エディタでも部分指定して開くのが精いっぱい。しかも行番号は指定できない(ファイルを最初から読み進める事で行数を把握するだろうから当然と言えば当然)。
例えば圧縮されているファイルを展開しながら任意の範囲行を削除して再圧縮するにはこんな感じ。
# zcat a.sql.gz | sed -e '13456,25385!d' | gzip > b.sql.gz
これは13456行~25385行以外を削除する処理。
普通の手段でやろうとするとメモリに展開しようとしてメモリもスワップも食いつぶして大変な事に・・・。
著者:t.n
floatを使った時の左右のカラムの高さを揃える方法
floatを使用して左右のカラムに背景色や背景画像の指定をした時、コンテンツの量で左右の高さが合わなくて片方の背景が切れてしまう事が…。
無理に高さを指定しまうと変にスペースも出来てしまうし、いい方法がないかと検索してたらjQueryで簡単に高さを揃える方法がありました。
http://tukuruder.com/archives/1257#codesyntax_8
調べた中ではこれが一番簡単でわかりやすかったです。
著者:N.K