月別アーカイブ: 2010年09月

3 posts

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で補足しながら書いていますが、
断片的な知識が線になり面になるのは楽しいものです)