メインコンテンツへスキップ

【解決済】変数の入力状況によってテーブルを切り替える

コメント

15件のコメント

  • nkmt

    速度の話ですが、xpa3.1 + SQL Server 2012 の時は問題ありませんでしたが
    xpa3.2 + SQL Server 2019 へと変更したら、1100万件、1400万件のデータを
    テーブル表示するのに長時間待たされるようになった経験があります。
    ONLINE_ARRAY_FETCHING=N の付加でそれは解決しました。

  • vg

    SQLで全件だと遅いというのは何かしら理由があるのではないでしょうか
    結果データベースがメモリーになっているとか(全件メモリーに放り込むので遅いはず)
    事前読み込みが有効になっているとか
    そもそも書いているSQLが悪いということも、ちょくちょくありますが・・・

    面倒ですけどワークテーブルにINSERTして表示するとかにすると
    INDEXもきっちり効いて早くなるのではとおもいます。

    あ、②③をどうしても切り替えたいならコールタスクを条件で分ける
    サブフォームを二つ貼る or 式で変える て感じでよいかと

  • 岡林拓也

    KM様

    230万件程度ですが、②のサブタスクでSQLを使った品名の絞り込みを入れてみたところ、体感では速度が変わりませんでした。

    プログラム開始時に品名=空白で検索してしまうWhere句にしたり、メーカーコードで並び替えすると遅くなりました。

    当方MagicXPA2.4なので見当違いかもしれませんが、Where句とINDEXに何かあるのではと思います。

     

  • KM

    皆様助言いただきありがとうございます。

     

    nkmt様

    [データベース情報]に記述するので合っていますでしょうか?

    記述してみましたが、変化は見られませんでした。

     

    vg様

    結果DBはメモリでなく使用しているDBと同様です。

    事前読み込みも無しになっています。

     

    岡林拓也様

    WHERE句で、部分一致で品名検索していた(変数が空白の場合は、品名 LIKE '%%'のように)ので、そのせいかと思い、

    ------

    SELECT 品番,メーカコード FROM 商品マスタ

    WHERE メーカコード= 1

    ------

    上記のクエリでテストしてみたのですが、結果は変わらずに表示されるまでに5秒ほどかかりました。

     

    レコード数は83万件程なのですが、皆様のコメントを見る限り多すぎるってことはないようですね。

    SSMSでクエリを実行する場合は部分一致だろうが瞬時に表示されるので、Magic側で何か原因があるのでしょうか。

    SQLコマンドを実行するうえで確認した方がいいところがあれば教えていただきたいです。

  • nkmt

    私は、データベースはSQL ServerのDBを指定し、結果データベースは必ずMemoryにしております。

  • nkmt

    xpa4ですが以下のようにしております。
    データベース名 = DBMS, 21, hogehogeDB, , hogehoge-SERVER, ,sa,hogepwd, NoMagicRec+
    ordLock, ChangeFileInToolkit, CheckDefinition, CheckKey, FileLocks, +
    CHECK_KEY=YES ONLINE_ARRAY_FETCHING=N, , CheckExist, 0, , NoAS400SrvrSort,

  • KM

    nkmt様

     

    ありがとうございます。

    iniファイルを同様の設定になるように編集してみましたが効果ありませんでした。

    結果DBをメモリーにすると、2秒ほど表示が速くなりました。

     

    他にも改善点がないか探してみます。

  • nkmt

    WHERE句の部分ですが、条件絞りが何もない場合もあるのかもしれないので、
    ANDを必ず付加できるよう
    WHERE 1=1 を固定で書くことがあります。

    今思いましたが、83万件をSQLコマンドで条件絞りが無ければ、全件を結果データベースに
    INSERTするような気もしますし、遅い原因はそこではないですかね。

    GROUP集計をするのでなければ、普通にメインソースに商品マスタを指定して
    以下に範囲条件を書くのもいいと思いました。

     

     

  • nkmt

    先日以下の投稿をしましたが、SQLコマンドではなく
    メインソースに指定した普通のオンラインタスクの事でした。

    速度の話ですが、xpa3.1 + SQL Server 2012 の時は問題ありませんでしたが
    xpa3.2 + SQL Server 2019 へと変更したら、1100万件、1400万件のデータを
    テーブル表示するのに長時間待たされるようになった経験があります。
    ONLINE_ARRAY_FETCHING=N の付加でそれは解決しました。

  • KM

    nkmt様

     

    範囲/位置付のSQL Where句というのは初耳でした。

    試しに、DB SQL部分に、

    ------

    (V_メーカコード = 0 OR メーカコード = V_メーカコード) AND (V_商品名 = '' OR 商品名 LIKE CONCAT('%', V_商品名 ,'%'))

    ------

    上記のように記述したところ、思い通りの動きになり、瞬時に表示することができるようになりました。

    ありがとうございました。

     

    ただ、変数欄に存在しないメーカコードまたは存在しない品名を入力すると、

    「設定されているタスク初期モードは使用できません。」

    というエラーが表示されてしまいます。

    一覧を表示しているタスクは照会モードなのですが、原因がわからず模索中です。

     

    いろいろな知識が身について勉強になりました。

    ありがとうございました。

  • 岡林拓也

    KM様

    nkmt様の助言で問題解決良かったです。

    「設定されているタスク初期モードは使用できません。」は

    『タスク特性>オプション>登録=Yes』または『タスク特性>データ>空のデータビュー許可=Yes』のどちらかの設定で解消しませんでしょうか。

  • KM

    岡林拓也様

     

    『タスク特性>オプション>登録=Yes』を実行したところ、エラーが表示されないようになりました。

    ありがとうございました。

     

    ご面倒かとは存じますが、なぜエラーになり、なぜ登録=YESで解消できるのか、ご教授いただければ幸いです。

    よろしくお願いいたします。

  • nkmt

    KM様 うまくいったようで良かったです。

    該当データ無し対策は
    タスクの特性で、空のデータビュー許可か
    あるいは、タスク特性の登録の条件にSTAT(0,'C'MODE)、終了条件にもSTAT(0,'C'MODE)
    タスク後処理に、エラー 該当データがありません 条件=STAT(0,'C'MODE)
    を追加することもあります。

  • 岡林拓也

    KM様

    空のテーブルを開く時は登録モードで動作する為です。

    APGでテーブルを開くと、空のテーブルの場合は「登録」になることが確認できます。

    既にあるプログラムを登録=Yesにすると別の制御を追加しないといけなくなるでしょうし、

    nkmt様が書かれているstat関数でエラーを表示する方が後々の苦労は少ないかもしれないです。

     

  • KM

    nkmt様

    岡林拓也様

     

    ご教授いただきありがとうございます。

    なぜエラーが起こるのか理解できました。

    とても勉強になりました。

サインインしてコメントを残してください。