Server OS Cafe -4ページ目

Server OS Cafe

Server OSの紹介等

投稿写真

神楽坂の「てしごとや霽月(せいげつ)」で獺祭(だっさい)を見つけました。
日本酒の中でも純米大吟醸酒という種類に分類され、フルーティーですごく飲みやすいです。

Dassai~New Lifestyle Cafe
http://newlifestylecafe.blogspot.jp/2014/05/dassai.html


さて久々にSQL Serverのトランザクションログが破損する事態が発生しました。
トランザクション実行中にPCの電源がOFFになっちゃんたんですね。
復旧は簡単にできるのですが、その手順をメモしておきます。

[手順]
以下のTransact-SQLを順に実行します。
(このサンプルではトランザクションログが破損したDBを[TestDB]としています)

1.ALTER DATABASE TestDB SET EMERGENCY
 問題のデータベースの状態をEMERGENCYに変更します。これでデータベースがREAD_ONLYになり、ログ記録が無効になります。

2.ALTER DATABASE TestDB SET SINGLE_USER
 問題のデータベースをシングルユーザーモードに変更します。

3.DBCC CHECKDB ('TestDB',REPAIR_ALLOW_DATA_LOSS)
 DBCC CHECKDBを実行してデータベースを復旧します。

4.ALTER DATABASE TestDB SET ONLINE
復旧が完了したらデータベースをオンラインに戻します。

5.ALTER DATABASE TestDB SET MULTI_USER
 マルチユーザーモードに戻します。

Server OS Cafe-トランザクションログ復旧

なお、データベースの状態はsys.databasesで確認します。

Server OS Cafe-sysdatabases

[参考文献]
SQL Serverヒント集:どのような場合に緊急モードでの修復を使用する必要があるか、およびその方法を理解する
MSDN:ALTER DATABASEのSETオプション(Transact-SQL)
MSDN:DBCC CHECKDB(Transact-SQL)


Note:How to Emergency Mode Repair
If you execute Emergency Mode Repair to your system's SQL Server user databases,you can use follow Transact-SQL.
("TestDB" is a sample database)

ALTER DATABASE TestDB SET EMERGENCY
GO
ALTER DATABASE TestDB SET SINGLE_USER
GO
DBCC CHECKDB ('TestDB',REPAIR_ALLOW_DATA_LOSS)
GO
ALTER DATABASE TestDB SET ONLINE
GO
ALTER DATABASE TestDB SET MULTI_USER
GO

If you check database state,you see sys.databases.
I'm trying MongoDB,a kind of NoSQL databases now,because we will manage big data some day.NoSQL databases have highly parallelizable instead of a fixed schema and consistency as Releational databases.But NoSQL databases don't have ACID and we must juggle Relational databases and NoSQL databases by purpose.

将来ビッグデータを扱う機会もあろうかとNoSQLの一種であるMongoDBを試しています。NoSQLはリレーショナルデータベースの様な固定的なスキーマと一貫性を持たない代わりに並列処理の能力が高くなっています。ただしデータの一貫性が保証されない為、どこにでも使ってもいいわけではなく、用途に応じてリレーショナルデータベースと使い分ける必要があります。

Server OS Cafe-MongoDB
今日、仕事中に引っかかったこと。Microsoft Visual BasicのCLng関数の端数処理(小数点以下の丸め)の仕様。
実は小数点第一位が5の場合、最も近い偶数倍にまとめられます。
参考:http://msdn.microsoft.com/ja-jp/library/cc410213.aspx

(例)
CLng(131.5) ⇒ 132
CLng(132.5) ⇒ 132
※.NET Frameworkの標準クラスではSystem.Math.Roundも同じ動きをしますね

ね、不思議でしょう。
何でだろうと思ってよく調べてみたら、これは「JIS Z 8401-1999」規則Aによって定められている数値の丸め方なのです。(元々はISO-31によって定められている物をJISが日本向けに定義したもの)

参考:http://kikakurui.com/z8/Z8401-1999-01.html

まあ簡単に言うと、四捨五入(JIS Z 8401-1999の規則B)だと、1、2、3、4が切り捨てで、5、6、7、8、9が切り上げとなり、切り上げられる数値の方が多い為、累積すると誤差が拡大してしまうので、5の場合に切り捨て、切り上げの両方を行って、偏らないようにしているのです。
正式には「最近接偶数への丸め」と言うそうですが、銀行がよく使う方法なので「銀行丸め」とも言われるそうです。
ちなみにJavaのSystem.Math.Roundは四捨五入です。
Microsoftは時々変わったことをしますよね。
Paralles Desktop 7 for MacにWindows 7を[高速インストール]した時に一部の画面で文字化けが発生していたので直しました。
その対処法をメモします。

Server OS Cafe-文字化けの例

1. Windows 7のコントロールパネルで[地域と言語]を選択します。
2. [管理]-[システムロケール]を選択します。
3. 他の設定は全て日本語になっているのですが、システムロケールだけが[英語(米国)]になっています。[システムロケールの変更]を押下して、これを[日本語(日本)]に変更します。
 $Server OS Cafe-システムロケール

4.Windowsを再起動します。これで文字化けは解消しました。
※Paralles Desktop 7 for Macの将来のバージョンでは改善されている可能性があります



今日は今月読んだ本の中で特に良かったものについてご紹介します。

最初はビジネスと英語を両方学べるお得な2冊についてです。

1.スティーブ・ジョブズに学ぶ英語プレゼン 著:上野陽子 日経BP社
スティーブ・ジョブズ氏のプレゼンのプレゼンの英語をわかりやすく解説しており、プレゼンでの効果的な言い回しについて勉強になります。

2.世界のトップ経営者に聞く! 著:CNN English Express編集部 朝日出版社
 現在、世界の第一線にいる経営者のCNN出演時のインタビューが収録されています。
クレイグ・バレット氏、ビル・ゲイツ氏、エリック・シュミット氏等へのインタビューが収録されていて、リスニングCDもついています。

あとはビジネス書2冊のご紹介。

3.ビジネスモデル・ジェネレーション 著:アレックス・オスターワルダー&イヴ・ピニョール 訳:小山龍介 翔泳社
 今年これまでで最も気に入っている本です。
ビジネスモデルの組み立て方を絵入りで詳細に説明しています。
 キャンバス、パターン、デザイン、戦略、プロセス、展望の6つに分けて説明していますが、私には特にデザインの部分が参考になりました。
iPad、Wii、Google、オープンソース、ネスプレッソなどを引き合いに出して説明しているので、とても興味深く読む事ができました。

4.自分を超える法 著:ピータ・セージ 訳:駒場美紀+相馬一進 ダイヤモンド社
英国の若手起業家のピータ・セージが彼が考える5つの法則について解説しています。
一つ一つが非常に分かりやすく、自己啓発本としてお勧めです。

[My Favorite Books]
Follow two books is nice because we can study both business and English.

1.English Presentations The Steve Jobs Way 50 easy phrases to help you be instantly great! by Yoko Ueno
This book explains English of Mr.Steve Jobs's presentations easily and we can learn effective phrases.

2.The Voices World Business Innovators by CNN English Express
This book is collected CNN's Interviews with persons actively at work in the business world,Mr.Craig Barret, Mr.Bill Gates, Mr.Erick Schmidt etc with listening CD.

Follow two books is my favorite business books.

3.Business Model Generation by Alexander Osterwalder & Yves Pigneur
This book is my most favorite book this year and it explains how to improve a business model with many pictures.
It explains 6 ways Canvas,Pattern,Design,Strategy,Process,Outlook and Design serves as a good reference for me.
It's good to introduce iPad,Wii,Google,Open Source Software,Nespresso etc.

4.How to master your life by Peter Sage
This book is introduced five keys to executive of Peter Sage,British young executive.
It is easy to understand and I recommend it for self-development.

$Server OS Cafe-My Favorite Books
就職する時にバイブルにしていた「闘うプログラマー ビル・ゲイツの野望を担った男達」(原題:Show Stopper!)の電子書籍を見つけました。
hontoや日経BPストアで手に入ります。
今も紙の書籍を持っていますが、今回この電子書籍も購入してみました。
この本は現在、PCのOSの主流となっているWindows NTの開発ストーリーを開発責任者のデビッド・カトラー(David Neil Cutler)を中心に描いたものです。カトラー以外にも多数の個性豊かなプログラマーやビル・ゲイツ(William Henry Gate III))、スティーブ バルマー(Steven Anthony Ballmer)、ネイサン・ミアボルド(Nathan Paul Myhvold)といった当時のマイクロソフトのスター達も登場します。
Windows NTは1994年に最初の3.1がリリースされた後、成長を続け、2012年となった今年にはWindows 8としてニューバージョンがリリースされます。
そして最近になってカトラーはマイクロソフトで次世代Xbox開発チームにいるという話が飛び込んできました。

スラッシュ・ドットジャパン:「Windows-NTの父」デヴィッド・カトラー、次世代Xbox開発チームに参加

ちょっとびっくりです。

[Show Stopper! The Breakneck Race to Create Windows NT and Next Generation at Microsoft (e-Book)]
I got this ebook and read it on iPad.
This book is inside story of the creation of Windows NT and my bible when I was a newcomer.
A new stable operating system,Windows NT was built by David Cutler(David Neil Cutler),Bill Gates(William Henry Gate III),Steve Balmer(Steven Anthony Ballmer),Nathan Myhrvold(Nathan Paul Myhvold) and a lot of individual software engineers .
2012 - The new version of Windows NT will be released as Windows 8 and David Cutler is in future Xbox project.

THE VERGE:Microsoft's 'father of Windows NT' now working on future Xbox projects

$Server OS Cafe-showstopper
11月17日にSQL Server 2012のRelease Candidate 0(RC0)がリリースされました。
いよいよ2012年第一四半期のリリースに向けてラストスパートに入ったみたいですね。
SQL Server 2012 RC0は以下のサイトからダウンロードできるようになっています。

Download:Microsoft SQL Server 2012 Release Candidate 0(RC0)

さて、今回はこのRC0を使用して、SQL Server 2012から追加されるカラムストアインデックス(列ストアインデックス)を試してみることにしました。
カラムストアインデックスはインデックスに含まれる列のデータを列単位でページに格納する様にすることで、効率的なデータの格納を実現しパフォーマンスを向上させる技術の様です。

カラムストアインデックスに関する詳細はMSDNの以下のサイトを参照して下さい。

MSDN:製品ドキュメント:SQL Server 2012 RC0:列ストアインデックス

1パフォーマンス測定
で、今回は次のようなテーブルを用意してみました。
----------------------------------------------------------------------
CREATE TABLE [dbo].[RetailTransaction](
[StoreCode] [nchar](4) NOT NULL,
[BusinessDate] [datetime] NOT NULL,
[TranCode] [nvarchar](4) NOT NULL,
[TranType] [tinyint] NOT NULL,
[GoodsCode] [nvarchar](10) NOT NULL,
[OperaterCode] [nvarchar](10) NULL,
[MemberCode] [nvarchar](10) NULL,
[ItemCount] [int] NOT NULL,
[Amount] [money] NOT NULL,
[TaxAmount] [money] NOT NULL,
CONSTRAINT [PK_Transaction] PRIMARY KEY CLUSTERED
(
[StoreCode] ASC,
[BusinessDate] ASC,
[TranCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
------------------------------------------------------------------------
小売店の1日の取引を格納するというシナリオのテーブルで、StoreCode(店舗番号)、BusinessDate(営業日)、TranCode(取引番号)の3つのフィールドが主キーとなっており、主キーにはクラスタードインデックスを張っています。

このテーブルに対して以下のデータ集計を行うSQLを実行します。
------------------------------------------------------------------------
SELECT SUM(ItemCount),SUM(Amount) FROM RetailTransaction
WHERE GoodsCode = '0000000001'
------------------------------------------------------------------------
RetailTransactionテーブルには1000万行のレコードを入れ、"WHERE GoodsCode='0000000001'"の条件には200万行のレコードが該当するようにしました。
この時に、次のインデックスのそれぞれを設定した時の実行速度を計測してみました。
(使用ハードウェア:CPU Intel Core2Duo 1.4GHz、搭載メモリ 1GB)

1. 通常のノンクラスータードインデックスを設定した場合
まずは条件句に使用されいているGoodsCodeにノンクラースタードインデックスを設定してみました。

--------------------------------------------------------------------------
CREATE NONCLUSTERED INDEX IX_RetailTransaction_1
ON RetailTransaction(GoodsCode)
--------------------------------------------------------------------------

このインデックスを張った状態でのSQLの実行時間は5分15秒でした。
ただし、実行プランを確認すると、このノンクラスタードインデックスは使用されておらず
主キーに設定したクラスタードインデックスが使用されていました。
$Server OS Cafe-実行プラン1
まず、これを基準にします。

2. 付加列インデックス(カバーリングインデックス)を設定した場合

次に1のノンクラスタードインデックスに抽出対象のフィールードであるItemCount、Amountを追加した付加列インデックスを設定しました。

--------------------------------------------------------------------------
CREATE NONCLUSTERED INDEX IX_RetailTransaction_1
ON RetailTransaction(GoodsCode) INCLUDE(ItemCount,Amount)
--------------------------------------------------------------------------

このインデックスを張った状態でのSQLの実行時間は7秒でした。
さすがに速いですね。
Server OS Cafe-実行プラン2


3. カラムストアインデックスを設定した場合
次に条件句のGoodsCodeのみを含めたカラムストアインデックスを作成しました。

--------------------------------------------------------------------------
CREATE NONCLUSTERED COLUMNSTORE INDEX IX_RetailTransaction_1
ON RetailTransaction(GoodsCode)
--------------------------------------------------------------------------

このインデックスを張った状態でのSQLの実行時間は5分30秒でした。
む、一番遅くなってしまった?ということで実行プランを見るとこのインデックスはほとんど使われておらず、主キーに張られたクラスタードインデックスを使用して検索が行われていました。
Server OS Cafe-実行プラン3


4. カラムストアインデックスをカバーリングインデックスとして設定した場合
これでは納得いかん!ということで、カラムストアインデックスがカバーリングインデックスになるように設定してみました。

--------------------------------------------------------------------------
CREATE NONCLUSTERED COLUMNSTORE INDEX IX_RetailTransaction_1
ON RetailTransaction(GoodsCode,ItemCount,Amount)
--------------------------------------------------------------------------

このインデックスを張った状態でのSQLの実行時間は7秒でした。
実行時間、および実行プランの中身をみても2.付加列インデックスの場合とほとんど同じでした。
Server OS Cafe-実行プラン4

この結果だけみると、カラムストアインデックスにすることによるメリットはあまり感じられないというのが正直なところです。
2.付加列インデックスのケースと比べて、インデックスページが使用するディスクサイズは抑えられるかもしれませんが、更新ができなくなるだけ不便を感じます。
もちろん、テーブルのデータの分布、実行するSQL、ハードウェアのスペックによって結果は変わるかもしれませんので、もう少しテストを続けていきたいと思います。

2データの更新はできないの?
INSERT、DELETEはもちろん、カラムストアインデックスに含まれていない列へのUPDATE文でもメッセージ35350のエラーが発生しました。更新する時は必ず一度カラムストアインデックスをドロップする必要がありそうです。
Server OS Cafe-エラー35330


3今回、カラムストアインデックスを設定する時に、メッセージ8658のエラーに遭遇しました。

Server OS Cafe-メッセージ8658

クエリー実行時に使用可能なメモリ量はサーバー構成オプションの"min memory per query (KB)"、"min server memory (MB)"で決まる最大使用量とリソース ガバナーの"request_max_memory_grant_percent"(既定:25%)の掛け合わせで決まる様ですが、それがカラムストアインデックスを作成するだけの容量が確保されていないとエラーとなる様です。
以下の方法で対処しました。

①サーバー構成オプションの"min memory per query (KB)"、"min server memory (MB)"の設定値を最大値まで拡大します。
--------------------------------------------------------------------------
sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
sp_configure "min memory per query (KB)",2147483647
GO
RECONFIGURE
sp_configure "min server memory (MB)",2147483647
GO
RECONFIGURE
--------------------------------------------------------------------------

②次にリソース ガバナーのdefaultの"request_max_memory_grant_percent"を25%から必要量を確保できる割合に引き上げます。(今回のケースでは30%)
--------------------------------------------------------------------------
USE [master]
GO
ALTER WORKLOAD GROUP [default] WITH(group_max_requests=0,
importance=Medium,
request_max_cpu_time_sec=0,
request_max_memory_grant_percent=30,
request_memory_grant_timeout_sec=0,
max_dop=0) USING [default]
GO
--------------------------------------------------------------------------

これでカラムストアインデックスの実行が正常に行える様になりました。



先日発売されたスティーブ・ジョブズ氏の公式伝記(作者:ウォルター・アイザックソン)の電子版をiTuensで手に入れました。
iPadとiPhoneで読んでいます。
今まで語られていなかったエピソードも多数あり大変興味深いです。

I get Walter Isaacson's biography of Steve Jobs(e-Book) via iTuens.
I read it on iPad and iPhone.
It introduces very interesting episode.

$Server OS Cafe-Steve Jobs