A5:SQL Mk-2

開発のこと、日々のこと

2024/02/01
から 松原正和
0件のコメント

A5:SQL Mk-2 Version 2.19.0

A5:SQL Mk-2 Version 2.19.0 がリリースされました。

主な新機能・変更点をまとめてみたいと思います。

以前開いていたタブをわかりやすくする機能

タブを開きすぎると「さっき使っていたタブどれだっけ?」となることがあります。これを改善するためタブをマウスオーバーすると最近使ったタブ(7個まで)の上に数字がポップアップして分かりやすく表示されるようにしました。

HTML形式のテーブル定義書のレイアウト変更

HTML形式のテーブルレイアウトはこれまで Excel のテーブル定義書のレイアウトをできるだけ再現したものになっていましたが、HTML形式のテーブル定義書は独自レイアウトのものに変更しました。

ER図のリバース生成時にリレーションシップを類推

これまでER図のリバース生成時には外部キーが定義されていないとリレーションシップの線が引かれませんでしたが、テーブル名・カラム名から類推してリレーションシップを再現する機能を追加しました。

例えば m_product テーブル(親)の id 列に対し、別のテーブル(子)に product_id があると、リレーションシップであると推定します。他のテーブルにid列があってもリレーションシップとは推定しません。

サロゲートキーでもナチュラルキーでも複合主キーでもある程度動作するように設計したはずですが、あくまでも「推定」の機能なのでテーブル名・カラム名の命名規則によってはうまく生成されないこともあるかもしれません。

論理削除された行をグレー表示する機能

DBの論理削除は賛否両論あるかと思いますが、よく見る設計であるかと思います。論理削除された行をWHERE句に似た条件式を条件式を指定することでグレー表示する機能を実装しました。

条件式にはWHERE句に似たフィルター式を指定できます。PostgreSQL を参考にした演算子を実装しています。

注意点(このパーサー&評価器の特徴)として「存在しない列はエラーとならず、存在しない列との演算はすべて FALSE として扱われる」というのがあります。やや怪しげなルールにも思えますが、この性質のおかげでデータベース全体で論理削除の条件がテーブルごとに違っても条件式を共有できます。

ワンタイムパスワードをコマンド実行の結果から入力する機能

データベースのログイン時のパスワードとして、ワンタイムパスワード(OTP)を要求するものがありますが、任意のコマンドの実行結果(の1行目)をパスワードとしてログインする機能を実装しました。

ERエディタで画像を配置したとき、絶対パスだけでなく相対パスでも画像ファイル名を指定できるように変更しました。

MacOS の Wine 上で動かしたとき、データベースツリーが表示されない不具合修正

追加機能ではないですが、Version 2.18系では MacOS 上の Wine で動作させたとき、データベースツリーが表示できない不具合がありました。(Wine のバージョンにもよるかもしれません)

この不具合も修正しました。

2024/01/01
から 松原正和
0件のコメント

眼鏡をかけているときにマスクをして曇りにくくする方法

X でも書きましたが、眼鏡をかけているときにマスク(よくある不織布のマスク)をして曇りにくくする方法です。

やり方は簡単で、マスクをきちんと装着し、ノーズフィッターも顔にできるだけフィットさせた状態で、ノーズフィッターの両端を5~10mmほどつまんで前側に折り曲げるだけです。60~90度くらいでしょうか。

完全にではないかもしれませんが、これだけでかなり曇りにくくなるはずです。

追加のコストや面倒な手順もいらず、歩きながらもできます。折り曲げたところが少し食い込む感じがするのと見た目が少し影響しますが、いつでも戻すことができますので曇りが気になるときだけするということもできます。

いくつかのマスクの銘柄で試してみましたが、程度の差はあるにせよどの銘柄でも効果はあるようでした。ノーズフィッターが長めの銘柄の方がよいかもしれません。

紐がゆるいと効果がでにくいので、自分のサイズに合ったマスクをするとよいかと思います。

2023/11/19
から 松原正和
0件のコメント

PCでゲームしないのに GPD G1 を導入してみた話

自分のPC環境は 4K ディスプレイ2台構成していますが、ノートPCの内蔵GPUには少々荷が重いなあと感じていました。Excelのスクロールがもたついたり、Delphi 開発環境も比較的重めです。なので、外付けGPUというのには以前から興味がありました。

ただ、外付けGPUボックスは大きなものが多く、市販のディスプレイカードも電力食いなものが多いです。

GPD G1 はモバイル向けのAMD Radion RX7600M XT を積んでおり、筐体サイズも外付けGPUボックスとしてはかなり小型で、比較的低消費電力です。ノートPCのドッキングステーションとしての機能も持ちます。

ノートPCへの接続には USB 4 を使用します。OcuLink というコネクタも併用できるそうですが、そんな端子、普通のノートPCにはないですし OcuLink はホットプラグ不可だそうです。USB 4 接続は一応ホットプラグ可能ですが、起動中に取り外すときは、いろいろアプリケーションを終了した後、OSのデバイスの取り外し機能から外さないといけないようです。(面倒くさいからそのまま取り外したりしますが…)

エイヤと注文してみたものの、導入当初はなかなかにトラブル続きでした。

試してみたPCは Lenovo Thinkpad X1 Carbon Gen 10 (以下 Thinkpad X1)と Lenovo Thinkpad T14 Gen 1 (Thinkpad T14)です。

Thinkpad T14 の方は「このデバイスが使用できる空きリソース不足しています」と表示されて GPD G1 を認識しませんでした。よく分かりませんでしたが、Thinkpad T14 に元からなぜか内蔵されていた GeForce MX250 がそもそも要らないなと思っていたのでデバイスマネージャで無効化したところ、認識するようになりました。(ディスプレイ出力は CPU 内蔵のGPU から出力され、GeForce MX250 はデバイスとしては繋がっているが何に使えるのか本当によくわからない…ディープラーニングとかにでも使えばよいのだろうか?)

問題は、Thinkpad X1 の方です。

  • 接続して起動するとGPD G1がうまく認識されず、ログイン画面がノートPCの画面にも表示されない(何かの待ちのような挙動?)
  • ログイン後に接続するようにしても、たまに認識しないことがある?
  • スリープまたは休止すると、すぐにスリープ・休止が解除され、しかも GPD G1 が認識されないことが多い。
  • GPD G1でディスプレイアダプタ (AMD Radion RX7600M XT)を認識しても、なぜかGPD G1経由で接続したキーボード(HHKB Professional JP)が認識しないことがある

割と致命的です。色々調べたところ、Windows に標準で付属する PnPUtil というコマンドで、USB 4 のホストルーターをリセットすると GPD G1 を再認識できるようでした。

これをできるだけ簡単に運用できるように、以下のバッチファイルを書いてみました。

PnPUtil /restart-device "PCI\VEN_8086&DEV_463E&SUBSYS_22E717AA&REV_02&USB4_MS_CM\3&11583659&1&6A"
PnPUtil /restart-device "PCI\VEN_8086&DEV_466D&SUBSYS_22E717AA&REV_02&USB4_MS_CM\3&11583659&1&6B"

/restart-device の後ろに指定するのは、PnPUtil /enum-devices コマンドで表示されたデバイス一覧の中から、「USB4 (TM) ホスト ルーター (Microsoft)」のインスタンスIDです。USB 4 ポートが2つあるので2行記述しています。PCによって、リセットすべきデバイスは異なるかもしれません。

なお、デバイスのリセットは管理者権限でしか実行できないため、このバッチファイルはデスクトップにショートカットを作り、管理者権限で実行するようにショートカットのプロパティで指定します。

これで、最低限「認識されない」状況は回避できましたが、あまり使い勝手が良いとは言えません。

Thinkpad T14 でもそうでしたが、どうもデバイスの何かのリソース確保あたりが怪しそうです。GPD G1 はUSB 4で接続されますが、内部的には USB 4 で PCI-e バスをトンネリングして接続されているようです。何か使わないデバイス(PCのリソースを使っていそうな内部的に直接PCに接続されているデバイス)を無効化するとよいかもしれません。

…デバイスマネージャを眺めていると、「AMD High Definition Audio Device」という見慣れないものが…。どうも、GPD G1 というか、AMD Radion RX7600M XT に内蔵されているオーディオデバイスのようです。確かに、GPD G1 からディスプレイ経由で接続されているスピーカーから音が出ています。

が、うちで使用しているディスプレイ(LG 24UD58-B)のオーディオ出力はとても音質が悪いですし、つないでいるスピーカーもかなり安いものです。Thinkpad X1 の内蔵オーディオのほうがかなりマシな印象…。

(LG 24UD58-B は画質の面では文句ないですし、価格も安めで、24インチで選べる数少ない4Kディスプレイです。オーディオ機能がちょっと残念なだけ)

試しに、「AMD High Definition Audio Device」をデバイスマネージャで無効化してみました。この状態で試してみたところ、GPD G1 が認識しないということがなくなり、スリープ・休止も問題なく、キーボードが認識されないということもなくなったようでした。まだ、トラブルが完全に解消できたかわかりませんが、しばらくこれで運用してみようと思います。

(「AMD High Definition Audio Device」を無効にしたくない場合は、(USB接続ではなく)PCに直接接続されているデバイスを何か代わりに無効化するとよいのかもしれません。)

なお、ドッキングステーションの機能としては、ディスプレイ出力は Display Port が2つ、HDMI が一つついています。HDMI は 4K ディスプレイをつなぐと、なぜか 50Hz で出力される?らしいので Display Port で接続する方がよいのかもしれません(よくわかりません)。

USB ポートは Type-A が3つのみなので本当はもうちょっとほしいところ。Type-C も1つは欲しいところでしょうか。SDカードリーダーも内蔵されていますが、差し込むのが少し硬く、GPD G1の配置によっては使いにくいように感じました。

他の方の参考になれば…。

2023/05/05
から 松原正和
0件のコメント

SQLの実行計画の読み方

今回は、SQLを書く上で特にパフォーマンスに影響のあるSQLの実行計画の読み方について解説します。実行計画はデータベース製品によってさまざまに差異がありますが、ここでは比較的どのデータベース製品でも共通する内容について解説します。

実行計画とは記述したSQLが実際にデータベースの内部でどのように処理されて結果を返すか、その処理方法を記述した情報です。

A5:SQL Mk-2では、SQLエディタで実行計画を見たい SQL の上にキャレットがある状態でメニューから [SQL(S)] – [SQLの実行計画(J)] または、Ctrl+E で表示できます。

表示の仕方はデータベース製品ごとに異なりますが、多くのデータベース製品ではツリー状の情報として表現されます。(このため A5:SQL Mk-2でもツリービューで実行計画を表示します。)

ツリーのリーフ(端)から処理が行われ、ルート(根)に向かって絞り込み・結合・集計・ソートを行いながら処理されていきます。

まず見るべきは、無駄なテーブルの全体読み込みが発生していないか確認することです。テーブル全体読み込みは、データベースの種類によって表現が異なりますが、TABLE ACCESS FULL (Oracle)・「Seq Scan (PostgreSQL)・ALL (MySQL) などと表示されます。 A5:SQL Mk-2ではこれらの処理は赤字で表示されます。

このとき、マスターテーブルのような、件数の少ないテーブルは全件読み込みが発生していたとしてもそれほど気にする必要はありません。多くの場合、小さなテーブルはデータベースのバッファキャッシュ(メモリ)から高速に読みだされます。大きなデータを持つトランザクションテーブルが全件読み込みになっている場合は注意が必要です。あと、赤字でないからと言って全件読み込みが発生していないとは言い切れないので注意が必要です。

大きなデータのテーブルで全件読み込みが発生している場合、インデックスの追加を検討する必要があります。絞り込みを行っているカラム・結合を行っているカラムでインデックスの追加を検討します。

また、サブクエリーを使っているSQLなどではサブクエリーの見直しを検討するのもよいかと思います。

インデックスの有無で後述するテーブルの結合方式も変わってきます。

テーブルの結合の仕方について。

テーブルの結合はデータベース製品によって様々ですが、大きく分けると内部的にネストループジョイン・ハッシュジョイン・ソートマージジョインの3つの方式が使い分けられることが多いです。(データベース製品によっては特定の結合方式がないケースや別の結合方式がある場合もあります。)

基本的にはどの方式が採用されるかはデータベース製品自体が選択します。それぞれについて説明します。

  • ネストループジョイン

ネストループジョインはそれぞれのテーブル(あるいはサブクエリーの結果セット)を2重ループで結合させる処理と思えばよいです。ただし、一般的には内側のテーブルはループではなくインデックスによるアクセスで実現されます。外側のテーブルは小さめのテーブル(全件スキャンかも)で、内側のテーブルは大きなテーブル(インデックス付き)のようなケースで使用されます。

外側のテーブル・内側のテーブルは必ずしもSQLでの記述順序とは限りません。(多くのデータベース製品ではどちらが外側・内側かは自動的に判断されます。)

  • ハッシュジョイン

ハッシュジョインは、片側のテーブル(データベースが小さいと見積もったテーブル)が結合するキー項目でメモリ上のハッシュテーブルに格納されます。もう片方のテーブルを読み込みつつ、ハッシュテーブルと突き合わせます。ハッシュテーブルを作成する処理が前処理として必要になります。

  • ソートマージジョイン

ソートマージジョインは、双方のテーブルともあらかじめ結合条件のキー項目でソートします。その後、マージ処理でキー項目を突き合わせつつ結合を行います。双方のテーブルをソートするための前処理が必要となります。またテーブルが大きくメモリに読み込めない場合、一時ファイル等に書き出されます。キー項目にインデックスが付く場合、インデックスを使ってテーブルを読み込むことでソートの代替とすることがあります。

これら3つの結合方式のうち、どれを採用するか(どれが速いと考えられるか)はデータベース製品自身が判断しますが、ハッシュジョイン・ソートマージジョインについては前処理が必要であることがパフォーマンスに影響する場合があります。結果的に結合結果の表の件数が少ない場合、前処理に時間がかかる分、ハッシュジョイン・ソートマージジョインは遅くなりがちです。また、全件結果を返す時間はともかく、最初の1件を返し始める時間は遅くなります。逆にネストループジョインは最初の1件目を返すのが速い代わりに全件返す時間は遅くなる場合があります。思い通りの結合方式になっていない場合は、インデックスを追加したり、書き方を変える必要があります。

いくつかのデータベース製品では「ヒント句」などを指定することで、どのような結合方式を採用するか・どのインデックスを使うかをある程度制御できます。

できるだけ高速な読み込み方法・結合方法を採用するために、判断基準として各データベース製品は統計情報(データの件数や種類・偏り等々)をバックグラウンドで収集します。多くの場合は自動で採取されます。大量データを投入した直後などは統計情報が実データとあっておらず、遅い実行計画になってしまうことがあります。この場合、手動で統計情報を取得するコマンドがあったりするので、それを活用すると速い実行計画になることがあります。

この記事では実行計画の読み方・パフォーマンスチューニングに関する考え方はここまでにします。遅いSQLがある場合はこの実行計画を見ながら、どのようにSQLを修正する・インデックスを追加するを考えていくことになります。

2023/05/05
から 松原正和
1件のコメント

A5:SQL Mk-2 Version 2.18.0 で導入された「ワークスペース」について

A5:SQL Mk-2 Version 2.18.0 が 2023/5/4 に公開されました。

今回のバージョンからワークスペースの機能が組み込まれています。起動時にいきなり選択画面が出てくるので、これまでA5:SQL Mk-2を使用されていた方は少しびっくりされるかもしれません。

ワークスペースはすべての設定とDBの登録情報、開いているファイルの情報をひとまとめにしたものです。
ワークスペースを切り替えることで複数の案件を簡潔に切り替えることができ、ファイルの開きすぎも抑えることができます。
ワークスペースの情報はレジストリまたは設定ファイルに保存されます。

ワークスペースはレジストリ・設定ファイルそれぞれで名前を持たないデフォルトワークスペースと名前付きのワークスペースを持ちます。デフォルトワークスペースもリネームを行うことで、名前付きワークスペースに変更することができますし、名前を空にすることでデフォルトワークスペースにすることもできます。

ワークスペースのような機能はいらないよという方は「起動時に表示する」のチェックを外すと、起動時に表示されなくなります。(前回起動したワークスペースが起動されます。)

再度、ワークスペースを使用したくなったら、メニューより、[設定(P)] – [ワークスペースの起動と管理(Z)…] またはスピードボタンより再度ワークスペース選択画面を表示できます。

2022/07/02
から 松原正和
1件のコメント

A5:SQL Mk-2 25th ANNIVERSARY !!

実は、今年(2022年)は、A5:SQL Mk-2(のもととなったプログラム)の開発を開始してから、25周年になります。四半世紀開発してきたことになります。

最初のバージョンは、「あまのいわと 5.0」という名前で開発されていました。何のソフトウェアであるかもわからないですね。中二病です。

現存する最古のソースファイルのタイムスタンプには、1997/07/17のものがあります。おそらく、開発開始はこの2~3週間前ではなかったかと思います。

驚いたことに、このごく初期の開発版ですら Windows 11 でも動作します。Windowsの互換性はすごいですね。ただし、セットアップ時に少しエラーが出たのと、コントロールパネルからデフォルトプリンタの設定作業が必要でした。

これからあと何年開発を続けられるでしょうか?。このあとさらに25年開発して、50th Anniversary とか言ってみたいですね。

2022/07/02
から 松原正和
0件のコメント

Windows を仮想マシンで動作させるときの注意点 (Home edition 版の話)

Twitter でも書いたのですが、VMware Workstation で Windows 11 Home edition を動かしたときに、使い物にならないくらい遅い現象がありました。Windows 11だから悪いのか、新調したPCに何か問題があるのか、VMware Workstationに何か問題があるのか…なんだろうなと思ったのですが、原因は意外なところにありました。

タスクマネージャーで見てみると、CPU使用率が100%に張り付き、グラフ表示を論理プロセッサに切り替えることもできません。どうやら1論理プロセッサしか認識していないようです。

実は、VMware Workstation の設定で、プロセッサを「プロセッサ数:4」・「プロセッサごとのコア数:1」にしていたのですが、Windows の Home Edition はライセンス上、プロセッサ数(ソケット数)が1個に制限されているため、プロセッサ数を4に設定しても、1プロセッサしか認識せず、1プロセッサ・1コアの状態で稼働していました。遅いはずです。(Windows Update, OneDrive, その他のプロセスでCPUを奪い合っていました。)

以下のような設定(ダメな設定)にしていました。

これを以下の設定(大丈夫な設定)のように、「プロセッサ数:1」・「プロセッサごとのコア数:4」に修正しました。

起動直後なので、まだCPU使用率高いですが、100%に張り付くことはなくなりました。

そもそもなんでこんな設定にしてしまったかですが、VMware Workstation (16.2.3)で Windows 10向けの仮想マシンを作るとき(Windows 11のテンプレートはまだない)、初期設定が「プロセッサ数:2」・「プロセッサごとのコア数:1」になっていました。うっかりここのプロセッサ数だけ4に修正していたのが原因のようです。これは間違います(orz)。VMware Workstation 的には、Professional Edition (以上?)でしか検証していないのかもしれないですね。

ひょっとして Home Edition は仮想マシンでは動作させてはいけない制約とかあったっけと不安になりましたが、とりあえずそのようなライセンス上の制約は見つけられませんでした。

2022/06/04
から 松原正和
1件のコメント

A5:SQL Mk-2で補完機能を改善

Twitter で「次世代SQLクライアントArctypeを触ってみる」とかがいくつか呟かれていて、少し悔しかったのですが、見た目のセンスはともかく?機能的には負けてないぞとか思うわけです。特にA5:SQL Mk-2の補完機能は補完機能はサブクエリや共通表式(WITH句)も解釈し、未知の構文ですら機能する高度な機能です。

↑ 共通表式の中にサブクエリーを使っているようなケースでも補完します!!。
↑ 未知の構文(というか、これはスペルミスのような…?)でもある程度補完できます。

ところで、SELECT 句の中でカラム名にエイリアスをつけた場合、カラム名エイリアスは、GROUP BY, HAVING, ORDER BY 句で利用可能でしたが、これまでは対応していなかったのを対応してみました。

↑ SELECT句で指定した、「受注番号」「 顧客番号」 のようなカラム名エイリアスがGROUP BY句で補完できます。(WHERE句では補完されません)

また、これまで「テーブル別名.」の後で補完機能を使うと、キーワードが補完候補に出てきてしまっていましたが、構文的におかしいので出さないようにしました。

他のSQLクライアントでは、SQL Server Management Studio (Microsoft) が、かなり高度な補完機能を持つようです。あとは、DataGrip は有償でそこそこのお値段もしますが、外部結合から JOIN の ON 句を生成出来たりかなり高度な補完機能を持つらしいですね。(DataGripは使ったことないですが。)

2022/05/05 追記

FROM句でテーブル名エイリアス(サブクエリーのエイリアス)の後ろにカッコで括ってカラム名エイリアスを書く構文にも対応できるようにしました。

2022/02/27
から 松原正和
0件のコメント

コマンドラインからA5:SQL Mk-2をインストールする(Wingetコマンドから または Zipファイルから)

Wingetコマンドでインストールする場合

コマンドプロンプトから次のようにして、winget を使用してA5:SQL Mk-2をダウンロードできます。

winget install "A5:SQL Mk-2" --id "9NSBB9XTJW86"
ここで、--id "9NSBB9XTJW86" は、A5:SQL Mk-2の識別子を指定しています。なくても動作するのですが、万が一 "A5:SQL Mk-2" という名前の別のソフトウェアがマイクロソフトストアで公開された場合、そちらをダウンロードしてしまわないように指定しています。

実のところ、--id "9NSBB9XTJW86" を指定すれば、 "A5:SQL Mk-2" の文字列指定は不必要なのですが、それだとなんのアプリケーションをインストールするのかわからないくなるので、"A5:SQL Mk-2" の文字列も残しています。

コマンドを実行すると、「マイクロソフトストアを使用するか」と「A5:SQL Mk-2をインストールするか」の質問が表示されるので、各々 Y を入力するとインストールすることができます。

完全にインストールを自動化するには以下のようにします。
winget install "A5:SQL Mk-2" --id "9NSBB9XTJW86" --accept-source-agreements --accept-package-agreements

ここでは、–accept-source-agreements は、マイクロソフトストアをソフトウェアのインストール元として使用することを許可するオプションです。

同様に、–accept-package-agreements は、A5:SQL Mk-2 をインストールすることを許可するオプションです。

注意点として、マイクロソフトストアを事前に起動して、自身のアカウントでサインインしておく必要があるようです。PCのキッティングには少し使いづらいかもしれません。

Vector 等からダウンロードしたZipファイルを展開する場合

上述の Winget を使う方式は、マイクロソフトストアにあらかじめサインインしている必要があり、PCのキッティングには少し使いにくいので、ダウンロード済みのZipファイルからインストールする方法を紹介します。

あらかじめ、VectorからZipファイルをダウンロードしておき、コマンドプロンプトから上記のコマンドを指定します。

PowerShell Expand-Archive -Path a5m2_2.17.1_x64.zip -DestinationPath C:\App\A5M2

スタートメニューにA5:SQL Mk-2を登録するには、あらかじめ A5M2.exe へのショートカットを作っておき、C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ 配下にコピーします。(ショートカットのリンク先は、”C:\App\A5M2\A5M2.exe” など、実際に実行ファイルを指している必要があります。)

この作業は管理者権限で起動されたコマンドプロンプトで作業します。

mkdir "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\A5 SQL Mk-2(x64)"
xcopy "C:\data\A5M2.lnk" "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\A5 SQL Mk-2(x64)"

2022/02/13
から 松原正和
0件のコメント

A5:SQL Mk-2で多くなりすぎたタブを整理する

A5:SQL Mk-2を使っているとしばしばタブの数が多くなり、使いづらくなってきます。

このとき、タブ部分の Shift+マウスオーバーでタブ内容のプレビューを行うことができます。

また、Shift+タブの×ボタンで、保存の確認ダイアログなしでタブを終了することができます。

この2つのShiftキー操作とタブ操作を使うことで、不要なタブをプレビューで探し出し、×ボタンを押すことでどんどんタブを閉じることができます。

また、タブは、ドラッグ&ドロップで移動することができます。

これらの操作で、タブを整理し使いやすくできます。