SQLチューニング

受注テーブルJと売上テーブルUがあって、
ある条件の受注に対して売上の情報を付加して画面に表示したいとします。

受注に対して全部売上がたっているとは限りません。
売上があれば当然そのデータを付加しますが、
まだ売上のたっていない受注の売上情報にはNULL(空白)を表示したいのです。
SQLでは左外部接合を使って次のように書けます。

Select J.A, U.B From J Outer Left Join U On J.受注ID = U.受注ID Where J.C = ‘xxx’

このような計算は多々あることです。

問題は、ここで受注は受注期間等の検索条件を設定し絞り込むことができますが、
売上は何らかの理由で絞りこみが出来なくて大きなテーブルだとします。

これが予想外の処理時間を使います。

試行錯誤の末私がとった解決策は、
まず条件にあった受注データをワークテーブルに書き出します
(このテーブルには後で売上データを書き込むフィールドを作っておきます)。

Insert Into Work_Table Select J.A FromJ WhereJ.C = ‘xxx’

後は、クライアントプログラムで、この受注ワークテーブルに対して、
売上テーブルのデータを付加していきます。

ここで二つのRecordsetを作ります。
一つは[Work_Table]に対応したもので更新可能にします。
前方向に一度移動するだけです。

問題は、このデータに付き合わせる売上データ用のRecordsetを高速にすることです。
色々試しましたが最終的には次のようにしました。

Dim rs売上 As New ADODB.RecordSet
With rs売上
     .CursorLocation = adUseClient
     .LockType = adLockReadOnly
End With

rs売上(“受注ID”).Properties(“OPTIMIZE”) = True

ここで重要なのは、[rs売上.Find]で使用する[受注ID]列のPropertiesの設定です。

実際の結果は、SQLのみでの処理が約15分、改善コードでは20秒にすることができました。
なお、テスト環境は[Dell Studio 540]、[SqlServer 2008]、[Access 2003 ADO]です。

VB6のデバグ

ACCESSがらみのトラブルシューティングの仕事が入ってきました。
一つは難なく解決しましたが、
ACCESSプロジェクトでSQLのパフォーマンスを改善する仕事には手こずっています。
ACCESSではADOを使っています。

考えてみれば、私はADOを余り使ったことがありませんでした。
私は過去の仕事をすべてHDの一箇所に保存して、いつでもみることができるようにしています。
困ったときに過去の工夫を探すことで、沢山の時間短縮をしてきました。
ADOでは過去にどんな仕事をしたか、このライブラリを調べたのですが見つかりません。
ADOはあまり記憶に残っていないし、どちらにしても大した仕事をしていないのだと思います。

DAOは結構使ったのですが、ADOを少しやって.NETに移行したと思います。
そんなわけで、不慣れなADOとSQL(SQL Server)のチューニングの仕事、
しかも他人が書いたプログラムのトラブルシューティングには時間が掛かっています。

現象としては、ACCESSプロジェクトである検索をすると、
しばらく待ってなにも言わず作業が終わるというのです。
調べてみると5000行程度の出力に15分近くかかってタイムアウトしていることが分かりました。
ロジックは正しいのですが、SQL一発でやろうとしたことに無理があると思います。

SQLを改善したり、クライアント側でADOのプログラムを書いたり、ストアドプロシージャを書き換えたり、
もう3日取り掛かっていますが思ったような成果がありません。

本日は、中間結果を一度SQLのワークテーブルに書き出す方法をトライしようと思います。
うまくいくことを願っています。

ユダヤ教、キリスト教そしてイスラム教

私は無神論者です。
というより宗教に関してはごく普通の日本人で無関心者です。
恥ずかしながら仏教についても殆ど何も知りません。
(数ヶ月前に[仏教のすべて]という本を読みましたが。頭に残っていません)

ノアの箱舟やバベルの塔やモーゼの十戒とイエスがどのような関係なのか知りません。
最近宗教にまつわる小説([ダ・ヴィンチ・コード]、[カラマーゾフの兄弟])を読んで、キリスト教に興味をもったので、少し勉強してみようと、「よくわかるキリスト教」という本を取り寄せザット読んで見ました。
以下は殆ど100%受け売りです。

そもそも「[イエス]は名前、[キリスト]は苗字は間違い」で、[イエス]はヘブライ人ではごくありふれた名前で、[キリスト]は救世主を意味するそうです。
ですから[イエス・キリスト]とは、「イエスは救世主である」という意味だそうです。

それから、深刻に争うユダヤ教、キリスト教、イスラム教は実は同族で、キリスト教もイスラム教もユダヤ教から派生したというのも驚きをもって知りました。
私がいかに欧米の宗教を知らないかということです。

さて、旧約聖書にはユダヤ教誕生の歴史(イエス以前の歴史)が書かれているようです。
旧約聖書には天地創造の話があり、神が作った最初の人間アダムとイブは禁断の木の実を食べたために、エデンの園を追い出されます。
以来男は食物を得る苦労を、女は出産の苦しみを負うことになります。
二人にはカインとアベルという男児を授かりますが、兄カインは弟を殺したために神に追放され、エデンの東のさすらいの地に放たれます。
(ジェームス・ディーンの[エデンの東]はこの話がベースになっているのはよく知られています)
アダムとイブにその後セトという男児が授かり、
その子孫が繁栄しますが、悪もはびこり、神は地上の生物を滅ぼす決心をします。
神はセトの末裔ノアに箱舟を作らせ、大洪水を起こします。

紀元前2000年ころ、ユーフラテス河口近くに住んでいたアブラハムは、神から「わたしの示す地に行きなさい」と命を受け、妻と甥をつれてカナンに向かいます。
今のパレスチナ地方です。

その息子の一人がイスラエルと名乗り、パレスチナに定住します。
イスラエルの寵愛を受けた末息子ヨセフは兄たちの恨みを買い、
エジプトに売られます。

有能なヨセフはエジプトで認められ首相にまで上り詰め、一族はエジプトで繁栄します。
それから400年下って、エジプトの政権が交代すると、一族はエジプトで迫害を受けることになります。

一族を率いてモーゼはエジプトを脱出し、カナンを目指します。

半世紀も前に公開された映画[十戒]では、なぜかモーゼを演じたチャールトン・へストンより敵役のユル・ブリンナーを強烈に覚えています

途中モーゼは神との契約(十戒、律法)を結び、これがユダヤ教の根本原理になります。
苦難の後モーゼの後継者ヨシュアがカナンを陥落し、やがてミケランジェロの彫刻で知られるダビデがイスラエルを統一、エルサレムを首都にします。
ダビデの息子ソロモンがイスラエルの最盛期を築きます。

しかしやがてイスラエルはアッシリアに滅ぼされ、民族もバビロンに捕囚され苦難の数世紀の後に、ペルシャ王によってエルサレムの帰還を許されます(この人たちをユダヤ人といいます)。
この苦難の時代にユダヤ教が確立します(旧約聖書はこの時代に書かれたということです)。

その後数世紀に亘ってパレスチナの地は列強によって隷属を強いられます。
やがてこの地にイエスが誕生します(すなわち紀元元年。実際は前4年ころ)。
ユダヤ教徒イエスは規律を重んじる正統ユダヤ教に反対し、
弱い立場の人々に寄り添い、現実的な教えを説いたために人気が高まります。
ユダヤ教は危機感を強め、民衆も迎合しイエスを磔にします。
(後年ユダヤ人はイエスを裏切った民族としてあらゆる場面で迫害されることになります)
ユダヤは数次にわたりローマと戦い、ついに紀元135年ローマから完全にこの地から追い出され、国をなくします。

一方イエスの弟子たちは、イエスがよみがえったと信じ、今までより一層布教活動に力を入れます。
最初はユダヤ教徒でありキリスト教の迫害者だったパウロは、やがて回心し各地で苦難の布教活動を続けます。
エルサレムで逮捕されたパウロはローマ皇帝に直接訴えたいとの願いで、ローマに連衡され、ここでも布教し殉教死します。
ネロ皇帝等の厳しい迫害を受けながらも、
パウロがローマに撒いた種は実り、ついには380年キリスト教はローマの国教になります。
パウロの伝教活動がキリスト教布教には重大な役割を果たしたといわれています。

私自身は、それからのキリスト教は比較的身近に感じています。
すなわちエルサレムをイスラム世界から守るという名目で戦った十字軍の戦い、
カトリック教会の腐敗に立ち上がったルターの宗教改革、ローマ教会から一線を画したプロテスタントの運動等です。

新約聖書はイエスの死後、弟子たちがイエスの教えについて397年まとめたものです。

この本での詳しい解説はありませんが、7世紀になるとユダヤ教からイスラム教も派生しました。
ユダヤ人が放浪していた間にイスラム世界がパレスチナに定住。
第一次世界大戦でイギリスがオスマント帝国との戦争にアラブとユダヤを利用し、
それぞれにこの地での独立を約束、今の中東問題の遠因になりました。

映画[アラビヤのロレンス]では、
ピーター・オツール演じる英軍人ロレンスがエルサレムの南=シナイ半島のアカバからダマスカスにかけて、
アラブと共にオスマン帝国と戦います。
しかしそれはアラブ人の独立運動とイギリスの裏切りの間にたたされた苦悩でもあります。
雄大なアラブの風景と歴史に翻弄される人々との対比が強く印象に残る映画です。

(この記事は、Wikipediaで補足しながら書いていますが、
断片的な知識が線になり面になるのは楽しいものです)

Refactor Pro!

我が家の朝顔

退院するとDeveloper Express社からメールが来ていました。
以下のようにVS2008をアンインストールしろというものです。

1) Completely uninstall DXperience.
2) Completely uninstall VS 2008.
3) Ensure that you’re running under an account with administrative privileges and install VS 2008 and DXperience v2010 vol 1.5 back.

VSのアドインの不調でVS本体をアンインストールしろはないだろう。
それによってどれだけ深刻なトラブルが起きるか考えたことがあるのか。
当然受け入れられません。

レジストリの中に以下のkeyが2ヶ所ありました。これを削除しました。
‘CodeRush;C:ProgramDataApplicationDataMicrosoftMSEnvSharedAddinsDevExpressToolsOrcas.Addin’,

また、VS2010用Refactor=[Refactor Pro!]はアドインではないようなので、
‘C:ProgramDataMicrosoftMSEnvSharedAddinsDevExpressToolsOrcas.Addin’
も削除。

これで現象としての不具合はなくなりました。
すなわち、VS2008起動時に変なメッセージは出なくなりました。

現状 [Refactor Pro!]はVS2010とVS2008で動作しています。
が、まったくどこからも使われていないVB2008用Refactorもインストールされたままです。

以前これを削除すると不具合が生じたのでそのままにしておくことにしました。

[Refactor Pro!]をまだ十分使っていませんが、
無料のVB2008用Refactorに比べれば機能が格段に多くなっています。
それにC#等沢山の言語に対応しているようです。
今後のプログラム開発に役立ってくれるだろうと楽しみにしています。

このソフトは$99で現在円高なので9000円弱で購入しました。
ユーザに対するライセンスなので自分で使う分にはどこでも使うことができます。

ついでですが、以前VS2010付属のInstallShieldに期待していると書きましたが、
試しましたところプロダクトキーのサポートがないようで、
企業内のインストールには問題ないかもしれませんが、市販パッケージ用にはつかえそうにありません。

インストールプログラムは今後多分昨年購入したInstallAwareを使います。
ただしWIXにも挑戦し何とかものにしたいと思います。

「カラマーゾフの兄弟」

8月3日遅く、妻が九州から駆けつけてくれました。

近くに住む次男は朝の早い仕事なので余り頼み事ができません。
長男は会社の帰りに遠回りして、
我が家によって頼んだ荷物を病院に持ってきてくれますが、
退社してからの作業なので、十分こちらの頼みたいことが通じません。

妻が来てくれたのでやっと安心しました。
(ただし、妻は実家の病院で代わる人がいないので、8日にはまた九州に帰りました)

病院にコンピュータを持ち込んで、AndroidとJoomlaの勉強をしようと思っていたのですが、
インターネットにつなぐことができなくて作業が進みません。

「ダ・ヴィンチ・コード」を読み終えたので、妻に私の魔法の本箱から、本を持ってきてもらいました。
妻が持ってきたのは、なんと「カラマーゾフの兄弟」です。
確か2年近く前に読もうとしたですが、ドストエフスキーのカッタルさに閉口して、
2冊目で投げ出していました。

話は、1代で財をなした、少々柄の悪い父フョードルとその3人の息子と下男、
それに彼らを取り巻く女たちの愛憎劇です。

長男ミーチャ - 退役軍人で父親と仲が悪い
次男イワン - 学生でクールな無神論者
三男アリョーシャ - 見習い(?)修道僧
下男スメルジャコフ - 癲癇(てんかん)もち、出生不詳、父はフョードルといわれる

3兄弟それぞれに恋人が絡み、父と長男が一人の女グルーシェンカを取り合う。
そんな中で父フョードルが殺害され、長男が逮捕され裁判にかけられる。

イワンは彼につきまとうスメルジャコフから、
「あなたが父親を殺したい」と思っていたから、私が代わりに実行したのだと告白される。
スメルジャコフは裁判の前日自殺し、イワンも精神に異常をきたす。

裁判では人々の予想を覆し、陪審員はミーチャに有罪判決をいいわたす。
ミーチャが流刑地に送られようとしている一方、
ミーチャの無実を信じ、
しかし自分がこの結果に追い込んだと、
負い目を感じる人たちが脱走計画を画策するところで小説は終わる。

実は小説はもう少しおまけが続きます。
ドストエフスキーは続編を構想していて、この部分は続編への序章と思われます。
しかし、本編完結直後彼は突然病を得て他界します。

この小説はおよそ明治10年(1879年から1880年)に雑誌の連載として発表されたものです。
時はロシア帝政末期、身分制度があり、人々は正式には貴族、僧侶、農民のいずれかに属していました。
当時のロシア人の階級意識も私たちからすると、想像するしかありません。
カラマーゾフ一族は貴族に属し、陪審員の何人かは農民であったという設定は暗示的です。

もう一つ私たち日本人に分かりにくいのは神の問題です。
「ダ・ヴィンチ・コード」とは異なる次元の話ですが、
「神は存在するのか」という西洋思想の根源的な問題意識があります。
ゲーテの「ファースト」は神に逆らい悪魔メフィストフェレスに魂を売り、
その代わりに地上の快楽を得ます。
イワンは苦悩します。
私たちはイワンとスメルジャコフの関係を、
ファーストとメフィストフェレスの関係に重ね合わせてしまいます。

更に読んでいてイラつくのは、話がアリョーシャの行動にそって語られるのですが、
語る「『わたし』がいったい誰なのか」ということです。
この小説の最も重要な問題「父親を殺したのは、誰だ」ということを、ぼやけさせています
(ドストエフスキーにとっては重要ではないのでしょう)。

「ドストエフスキーはとてもカッタルイ」と私は思っています。
真面目に文章を追って読んでいてはなかなか完読できません。
ゴチャゴチャしたところは読み飛ばさなければ、うんざりします。
今回退院や雑用の合間をみて、1週間あまりで2巻から5巻まで読みましたが、
これでちょうどいいと思います。

これくらいのスピードで読むと、小説の全体像が分かってきます。
勿論詳細は分かっていませんが、「後は気になるところを読み返すのがいいのかな」と思います。
すっ飛ばして読んでみて、「様々なテーマを取り上げ、構成のしっかりした、面白い小説だ」という感想を持ちました。

イギリスの哲学者ウィトゲンシュタインは「50回以上読んでそらんじている」ということです。

評判になった亀山訳は誤訳が多いと批判があるようですが、
私たちには、そのような議論はどうでもよいことで、
それより、アリョーシャが子供と話す部分もすべて丁寧語で、その方が気になりました。

入院中一番心配したのは、孫に見せようと植えたベランダの朝顔です。

水遣りは妻がいる間はいいのですが、
いないときは長男に頼んだり次男に頼んだり、スケジュールに気を使いました。

おかげで毎朝大輪の青い朝顔をみることができるのは少し幸せな気分です。