勘定奉行の性能劣化に対処

社内では会計システムに勘定奉行(ネットワーク版)を使っているが、 担当者から「勘定奉行で仕訳帳の表示に20秒くらいかかる」と言われたので調査してみた。 その担当者のPC固有の問題かどうかを切り分けるため別のPCから同様の操作を行ってみたところ、同じ症状が発生した。 ということは、サーバ側に問題がありそう。 勘定奉行のクライアントは生のSQL文をサーバに発行する仕組みなので、 Wiresharkでパケットをキャプチャすることで発行されたSQL文を把握することができる。 その状態でサーバ側の負荷を測定してみると、特定のSQL文の処理に時間がかかっていることが分かった。 勘定奉行ではSQL Serverをバックエンドに使っているので、 「SQL Server パフォーマンス」などでGoogle先生に聞いてみると、以下のページがヒット。 どうする? SQL Server のクエリ パフォーマンスが低下した! これに従い、サーバ上でSQL Server Management Studioを起動し、勘定奉行で使用しているデータベースで sp_updatestats としたところ、1秒程度で処理が完了するようになった。 上記ページには各テーブル単位での統計情報更新や、実行プランの再作成、インデックスの再構築の方法も書かれているが、今回は行わなかった。 このようにSQL文を直接叩きに行く方法は多分メーカ(OBC)では非推奨だと思うが、 クライアント側にsp_updatestatsを発行するメニューくらいつけてほしいものだ。
HTA SQLツール

HTA SQLツール

概要 今は廃れたHTA(HTML Application)で書いた、汎用SQLツールです。 Windows上で動作し、 CSVファイル(*.csv) Excelファイル(.xls、.xlsx、.xlsm、.xlsb) Accessファイル(*.mdb) などをADODB経由で開いてSQLクエリを実行できます。 CSVファイルはディレクトリ⇔データベース、CSVファイル⇔テーブルとして扱われ、 ExcelファイルはExcelブック⇔データベース、シート⇔テーブルとして扱われます。 主に、SQLクエリを実行した結果をExcelに貼り付けて使用することを想定しており、 出力された表はExcelに貼り付けやすいようTSV形式で持っています。 select intoで直接ファイルに書き出すこともできます。 スクリーンショット ダウンロード Gistからダウンロード もしくは以下のソースコードをメモ帳にコピー&ペーストし、拡張子をhtaに変更してください。 <html> <head> <!-- HTA SQL Tool by 330k Copyright (c) 2016 330k This software is released under the MIT License. http://opensource.org/licenses/mit-license.php --> <title>HTA SQL Tool by 330k</title> <HTA:APPLICATION ID="USQLEXE" APPLICATIONNAME="USQLEXE" BORDER="thick" BORDERSTYLE="normal" CAPTION="yes" ICON="C:\WINDOWS\system32\rsnotify.exe" INNERBORDER="no" MAXIMIZEBUTTON="yes" MINIMIZEBUTTON="yes" SHOWINTASKBAR="yes" SINGLEINSTANCE="no" SYSMENU="yes" VERSION="1.0" WINDOWSTATE="normal" SCROLL="no" SCROLLFLAT="no" SELECTION="yes" CONTEXTMENU="yes" NAVIGABLE="yes" /> </head> <script type="text/javascript"> var doc = document; eval('var document = doc'); var shell = new ActiveXObject('WScript.

MathematicaからSQLiteでBLOBとマルチバイト文字列を扱う

ドキュメントにはないものの、MathematicaではSQLiteを扱うことができる。 しかしながら、BLOB型や文字列で日本語などを扱うには少し工夫が必要なので、メモ。 BLOB型 select 直接BLOB型をselectすると$Failedが返ってくるので、hex関数で16進文字列として返す。 db = Database`OpenDatabase[sqlitefilepath]; rs = Database`QueryDatabase[db, "select hex(column_name) from table_name"]; これを16進文字列→数値→バイト列→文字列と変換して、最後にImportStringで読み込むと、Mathematicaで読み込める。 ImportSQLiteBLOB[hex_, format_] := ImportString[ FromCharacterCode[IntegerDigits[FromDigits[hex, 16], 256]], format]; ImportSQLiteBLOB[rs[[1, 1]], "PNG"] insert insertする場合には逆に、データをExportStringで文字列に変換→バイト列→16進文字列と変換し”x’“と”‘“で囲う。 ExportSQLiteBLOB[expr_, format_] := StringJoin["x'", IntegerString[ToCharacterCode[ExportString[expr, format]], 16, 2], "'"]; Database`QueryDatabase[db, "insert into table_name values (" <> ExportSQLiteBLOB[Plot[Sin[x], {x, 0, Pi}], "PNG"] <> ")"]; マルチバイト文字列 select 日本語などマルチバイト文字列が入っていても適切に変換してくれないので、自前で変換する。 ImportSQLiteString[str_] := FromCharacterCode[ToCharacterCode[str], "UTF8"]; rs = Database`QueryDatabase[db, "select column_name from table_name"]; ImportSQLiteString[rs[[1, 1]]] insert そのまま突っ込むとエラーが出るので、変換してから突っ込む。ついでにシングルクォーテーションをエスケープしておく。