A5:SQL Mk-2

開発のこと、日々のこと

2025/11/08
から 松原正和
0件のコメント

A5:SQL Mk-2 からローカルAI(Ollama, LM Studio, Lemonade-Server)を使う時の注意事項

最近では gpt-oss など、実用的な LLM が少し高性能なPCで(なんとか)動かせるようになってきました。ここで A5:SQL Mk-2 の AI として Ollama, LM Studio, Lemonade-Server などのローカルAI を使用するときの注意事項を記載します。

1.できるだけ賢いモデルを使用する

当然ですが、できるだけ賢いモデルを使用します。(2025/11 時点ならば) gpt-oss:20b あたりがかなり良いように思えます。gpt-oss:20b を使用するときは VRAM が 16GB 以上のGPUが推奨されます。

2.最大コンテキスト長を指定する

ローカルAI用のソフトウェアは多くの場合デフォルトで最大コンテキスト長が 4Kトークン程度に設定されています。最大コンテキスト長はAIが一度に扱えるトークン数、つまり文章の長さを表します。A5:SQL Mk-2 はAIチャット機能でもデフォルトでカレントスキーマ全体のCREATE TABLE 文をシステムプロンプトとしてLLMサービスに渡します。このためシステムプロンプトがすぐに4Kトークンを超えてしまい、チャット機能が破綻してしまいます。(正しくSQLを生成できなかったり、エラーになるなど)

設定すべき最大コンテキスト長はおおよその目安として、テーブル数×300トークン程度と考えると良いと思います。(使用するテーブル群によって増減します)

100 テーブルほどのシステムならば、32K 程度を指定すればよいことになります。

各ローカルAIにおいて、設定個所を記載します。

2.1 Ollama

Ollama では環境変数 OLLAMA_CONTEXT_LENGTH に指定します。32K を指定する場合は、 32768 を指定します。

    2.2 LM Studio

    LM Studio ではモデルごとの設定で指定します。開発者のタブ(緑色のターミナルアイコン)で右上のほうにある「コンテキスト長」で指定します。32K を指定する場合は、 32768 を指定します。

    2.3 Lemonade-Server

    Lemonade-Server では環境変数 LEMONADE_CTX_SIZE に指定します。32K を指定する場合は、 32768 を指定します。

    2025/07/23
    から 松原正和
    0件のコメント

    A5:SQL Mk-2 から AWS ssm session manager を経由してDB接続する

    AWS を使用してシステム開発するとき、bastion サーバーを立てて、そこから RDS に接続するのではなく、セキュリティ強化を目的として、AWS ssm session manager を使って接続するように構成することがあります。

    A5:SQL Mk-2 から AWS ssm session manager を経由してDB接続する には、多段ssh と同様に、「ssh.exe コマンド(OpenSSH, Windows 10 1803 以降に付属)」を使います。

    以下のような接続形態を想定します。

     [A5:SQL Mk-2] ── [AWS ssm session manager] ── [EC2 サーバー] ── [RDS]

    まず、AWS ssm session manager の設定を一通り完了させます。(ステップ 8 まで)

    追加で、C:\Users\<ユーザー名>\.ssh\config に以下の内容を記載します。

    Host your_system
        HostName i-1234567890ABCDEF1
        User ec2_user
        ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p --profile aws_profile"
        IdentityFile ~/.ssh/id_ed25519
        IdentitiesOnly yes

    AWSの設定例(ステップ 8の設定)と同様ですが、ProxyCommand の最後に --profile aws_profile としてプロファイル名を指定していることに注意してください。環境変数に AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY を設定していない場合や、複数のAWS環境を使い分けている場合はプロファイルのオプション指定は必須です。

    他の設定項目も適宜書き換えてください。HostName パラメータは EC2サーバーのインスタンスIDを指定します。秘密鍵ファイルの設定などもここで書いておくと便利です。Host your_system の部分はEC2のインスタンスIDと一致させる必要はなく、わかりやすい設定名にしてください。

    また、ssh.exe your_system でsshセッションが開始できることも確認してください。

    A5:SQL Mk-2のデータベース登録の画面では、サーバー名はRDSのエンドポイント名を登録します。

    SSH2トンネルのタブでは、接続方式に「ssh.exe コマンド(Open SSH, Windows 10 1803 以降に付属)」を指定し、SSH2ホスト名に .ssh\config に記載した接続先システムの名前を記載します。.ssh\config にユーザー名・秘密鍵ファイルが指定されていれば、ここでの入力は必要ありません。

    これだけ入力して、「テスト接続」ボタンを押下すると、ssh.exe がコマンドプロンプトで起動され、SSHトンネルが作られてDBに接続できます。秘密鍵ファイルにパスフレーズが設定されている場合、このコマンドプロンプトで入力を行います。(ssh-agent を併用すると便利です。)

    AWSの設定でワンタイムパスワードでの認証が設定されている場合もここで入力します。

    コマンドプロンプトはパスフレーズを入力しない場合などは接続後にすぐに消えますが、パスフレーズを入力するなどすると、そのまま残り続けます。この場合は、A5:SQL Mk-2 でのDB接続を切断するまで閉じずに最小化したままにしておいてください。

    2025/07/23
    から 松原正和
    0件のコメント

    A5:SQL Mk-2 で多段ssh接続を行う

    A5:SQL Mk-2 で多段ssh接続を行うには、Version 2.20.0で追加された SSH2トンネルの接続方式「ssh.exe コマンド(OpenSSH, Windows 10 1803 以降に付属)」を使います。

    以下のような接続形態を想定します。

     [A5:SQL Mk-2] ── [bastion] ── [your_system] ── [your_db]

    先に、ssh.exe の設定を行います。C:\Users\<ユーザー名>\.ssh\config ファイルに踏み台サーバーの設定および接続したいシステムの接続名を記載します。 

    Host bastion
        Hostname bastion_server
        User your_user
        IdentityFile ~/.ssh/bastion_id_id_ed25519
        IdentitiesOnly yes
    
    Host your_system
        Hostname your_server
        User your_name
        IdentityFile ~/.ssh/your_id_id_ed25519
        ProxyJump bastion
        IdentitiesOnly yes

    各種設定値は適宜書き換えてください。your_system 内の ProxyJump bastion の設定によって、bastion に接続してからyour_system に接続するようになります。また、ssh.exe your_system でsshセッションが開始できることも確認してください。

    A5:SQL Mk-2のデータベース登録の画面では、サーバー名は ssh 接続先のサーバーから見たサーバー名またはIPアドレスでサーバー名を登録します。

    SSH2トンネルのタブでは、接続方式に「ssh.exe コマンド(Open SSH, Windows 10 1803 以降に付属)」を指定し、SSH2ホスト名に .ssh\config に記載した接続先システムの名前を記載します。.ssh\config にユーザー名・秘密鍵ファイルが指定されていれば、ここでの入力は必要ありません。

    これだけ入力して、「テスト接続」ボタンを押下すると、ssh.exe がコマンドプロンプトで起動され、SSHトンネルが作られてDBに接続できます。秘密鍵ファイルにパスフレーズが設定されている場合、このコマンドプロンプトで入力を行います。(ssh-agent を併用すると便利です。)

    コマンドプロンプトはパスフレーズを入力しない場合などは接続後にすぐに消えますが、パスフレーズを入力するなどすると、そのまま残り続けます。この場合は、A5:SQL Mk-2 でのDB接続を切断するまで閉じずに最小化したままにしておいてください。

    2025/02/17
    から 松原正和
    0件のコメント

    A5:SQL Mk-2 で AWS の Secrets Manager からパスワードを取得してDB接続する

    AWS のシークレットマネージャーからパスワードを取得してDBに接続したいことがあります。AWSマネジメントコンソールから読み取ってもよいですが、ローテーションされていると毎回参照するのも大変です。

    A5:SQL Mk-2ではコマンド実行でワンタイムパスワードを取得して、DB接続する機能があります。以下のようなシークレットからパスワードを取得して、DB接続するパターンを考えてみます。

    次のような GetPassword.bat バッチファイルを用意します。

    @echo off
    
    rem aws コマンドのために、AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY を引数から取得
    set AWS_ACCESS_KEY_ID=%2
    set AWS_SECRET_ACCESS_KEY=%3
    set AWS_REGION=%4
    
    rem 取得したいシークレットの名前または ARN
    set SECRET_ID=%1
    
    rem ------------------------------
    rem Secrets Manager から password を取得
    rem ------------------------------
    powershell -NoProfile -Command ^
        "(aws secretsmanager get-secret-value --secret-id %SECRET_ID% --query SecretString --output text | ConvertFrom-Json).password"
    

    awsコマンドがインストールされている必要があります。awsコマンドを使用するために、AWSアクセスキー・AWSシークレットアクセスキー・AWSリージョンが必要となります。
    このため引数として、シークレット名・AWSアクセスキー・AWSシークレットアクセスキー・AWSリージョン を渡します。コマンドラインから実行すると以下のようにパスワードが標準出力に出力されます。
    (AWSアクセスキー・AWSシークレットアクセスキー はマスクしています。)

    A5:SQL Mk-2 では、データベース登録画面の「その他」タブで「ワンタイムパスワード生成コマンド」の欄に以下のように入力します。

    ワンタイムパスワード入力例

    C:\…\GetPassword.bat <シークレット名> <AWSアクセスキー> <AWSシークレットアクセスキー> <AWSリージョン>

    A5:SQL Mk-2のログイン時、パスワードは空のままにします。

    以上で接続すると、GetPassword.bat が実行され、その実行結果(標準出力)をパスワードとしてDBに接続されます。

    上記の例では、AWSアクセスキー・AWSシークレットアクセスキーをバッチファイルの引数として渡していますが、OSの環境変数としてあらかじめ設定する・バッチファイルに埋め込むなど使いやすいように改造して使ってみてください。

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

    A5:SQL Mk-2 Version 2.20.0 不具合情報

    A5:SQL Mk-2 Version 2.20.0 の不具合情報について記載します。

    これらの不具合については、ベータ版によって修正されています。

    1. Oracle Database, IBM Db2, Microsoft SQL Server に接続してインデックスを列挙するような処理をした後に、アプリケーションを終了できない不具合があります。(以下スクリーンショットのような状態

    また、インデックスを列挙するような処理を複数回行った時もエラーが表示されます。

    アプリケーションが終了できない場合、タスクマネージャから終了するしかなくなります。

    2. MySQL で接続したSQLエディタで、MySQL の関数が太字の黒字で表示され、キャレットの位置がずれる。

    この不具合は、フォントを MS ゴシック 以外に変更するとキャレットの位置ずれは修正されます。MySQL の関数が太字の黒字で表示されるのは想定外の挙動であるため、修正されます。

    3. スキーマ間のデータ転送機能で一部データ型でエラーが起こる

    スキーマ間のデータ転送機能を使ったときに特定の数値型のデータが含まれていると、`The parameter has different data type` エラーになります。

    「複数行インサートを使用する」のチェックを外すと発生しなくなりますが、転送速度は遅くなります。

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

    A5:SQL Mk-2 Version 2.20.0 の新機能ご紹介

    A5:SQL Mk-2 Version 2.20.0 を公開しました。ここではその新機能についてご紹介します。

    様々な新機能が追加されましたが、ここでは以下の新機能に絞って説明を行います。

    1. AIアシスタント機能
    2. テキストエディタコンポーネントの置き換え
    3. SSH経由の接続で、Windows OSに付属する ssh.exe を利用できるように変更

    1. AIアシスタント機能について

    1.1 使う前に

    AIアシスタント機能を使うには、オプションダイアログからAI機能を有効にして、使用するAIサービスを登録、設定をする必要があります。例えば、OpenAI の ChatGPT を使用するには、OpenAI Platform でアカウントを登録し、支払い情報を登録してAPIキーを発行する必要があります。

    例えば ChatGPT を使用するには、オプションダイアログのAIタブで サービスOpenAI – ChatGPT v1 を指定し、APIキーを登録、モデルを選択する必要があります。

    Open AI Platform は ChatGPT Plus などのチャットサービスとは異なるサービスです。ChatGPT Plusに登録していても別に Open AI Platform に登録する必要があります。AI APIの料金は基本的に従量制です。(単価は使用するモデルにより異なります。)

    AIサービスは以下のサービスに対応します。

    • Anthropic – Claude
    • Google – Gemini
    • Microsoft – Azure OpenAI
    • OpenAI ChatGPT
    • Ollama (これのみローカルにインストールするソフトウェアで、APIキーの発行は不要です)

    1.2 AIアシスタントペイン

    オプションダイアログからAIサービスの設定が完了したら、SQLエディタでメニューから [SQL(S)] – [AIアシスタント(AIペインの表示)(I)] または、Ctrl+I でAIアシスタントペインを開くことができます。

    AIアシスタントペインでは様々な質問をすることができます。チャットではないので、前回質問の結果に対しての続きの質問はできません。

    AIにSQLを書いてもらう事も出来ますが、AIにデータベースやSQLについて教えてもらうことを主眼に置いた機能です。

    他のSQLクライアントのAIアシスタントでは、SQLを直接作ってもらったりすることが多いですが、A5:SQL Mk-2のAIアシスタントペインでは説明を付けてもらう事ができるので、生成されたSQLをより深く理解する事ができます。

    AIの回答中のコードはそのままSQLエディタで実行したり、クリップボードへコピーをすることができます。

    1.3 コメントからSQLを生成

    SQLエディタに書いたSQLコメントからSQL自体を記述してもらうことができます。基本的にカラムやテーブルに対してコメントが付きますが、コメントなしで生成することもできます。

    生成されたSQLはテキストエディタ中でコメントの直下に挿入されます。

    1.4 SQLにコメントを付加してもらう

    よくわからないSQLにコメントを付加してもらうことができます。テキストエディタ中のSQLが直接書き換えられます。

    結果が気に入らない場合は「元に戻す」(Ctrl+Z)で戻すことも可能です。

    1.5 SQLの解説を依頼

    SQLの解説をAIアシスタントに依頼することができます。この機能はAIアシスタントペインが自動で開き、質問して回答を得ることができます。

    1.6 SQLのエラーをAIに質問

    SQLでエラーがあった場合にエラーダイアログが表示されますが、ここでエラーの原因と修正案をAIに質問することができます。この機能では、AIアシスタントペインが開いて自動的に質問・回答を得ることができます。

    ※AIの回答は必ずしも正確でない可能性があります。

    1.7 SQLの実行計画からSQLを改善(パフォーマンスチューニング)をしてもらう機能

    SQLの実行計画画面からSQLを改善してもらうことができます。AIアシスタントペインが開いて自動的に質問・回答を得ることができます。

    ※AIの回答は必ずしも正確でない可能性があります。

    1.8 DBのテーブルやカラム・ER図のエンティティや属性に論理名をつけてもらう機能

    テーブル名やカラム名はしばしば英語や英語を短縮したような名前が使用されわかりにくいこともあります。AIに論理名をつけてもらうことで分かりやすくすることができます。

    論理名は日本語以外の言語でつけてもらうこともできます。

    2. テキストエディタコンポーネントの置き換え

    これまでのプロプライエタリのテキストコンポーネントからオープンソースのテキストエディタに置き換えを行いました。これは将来的にA5:SQL Mk-2本体をオープンソースにするための準備の一環です。

    これまでのテキストエディタコンポーネントは古い設計で動作速度も遅かったですが、新しいテキストエディタコンポーネントはこれまでのエディタよりも高速に動作し、64bit版ではカラー絵文字も使用できます。(🍣とか🍺とか)

    ただ、これまでのテキストエディタコンポーネントとは多少挙動の異なるところもあるはずなので好みの問題はあるかもしれません。

    (コードの折り畳みや矩形選択などができなくなってしまいました)

    ※A5:SQL Mk-2本体をオープンソースにするといっても、早くても10年後とかの話になるかと思います。

    3. SSH経由の接続で、Windows OSに付属するssh.exe を利用して接続できるように変更

    これまではA5:SQL Mk-2内蔵のSSHライブラリまたは putty(plink.exe)経由での接続のみでしたが、Windows OSに付属するようになった ssh.exe 経由での接続もサポートするようになりました。

    .ssh_confingの記述で多段SSHで接続したり、ssh-agent 経由で鍵ファイルのパスフレーズを管理したりできます。

    最後に

    Version 2.20 はAI機能に対応したり、近年のアップデートの中でもかなり大型のアップデートとなったように思います。これらの機能が皆様のDB開発のお役に立てればと思います。

    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を修正する・インデックスを追加するを考えていくことになります。