AS-B
@AS-B

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

クエリ文をループから出して読み込みを速くしたいです

Q&A

Closed

解決したいこと

現在、以下のようにループ内にクエリ文を配置し読み込みをしております。
しかし、読み込みにかなり時間がかかるようになり(数分?)、ちょくちょく更新したい内容なので調べたところ、ループ内にクエリ文を入れるとループの回数全てのデータを読み込む?というような内容で遅くなっているのではないか、というところに辿り着きました。
そこで、ループ外で1回全てを読み込み、そこから必要なものだけを表示させるようにしたいのですが、どのように書いたら良いか分かりませんでした。
と言うのも、規則性のないidを指定したいので、そこで躓いております。

該当するソースコード

<?php
$server = "XXX";
$database = "XXX";
$user = "XXX";
$password = "XXX";
$conn = odbc_connect("Driver=SQL Server;Server=$server;Database=$database;", $user, $password);

$array = [
    "0001",
    "0036",
    "0121"
];//こういった形で指定したいidが規則性なく続きます。

foreach($array as $id) {
    $name = "SELECT XXX from XXX where id='$id'";
    $name_rst = odbc_exec($conn, $name);

    echo mb_convert_encoding(odbc_result($name_rst,1),"utf-8","sjis");
}

odbc_close($conn);
?>

少々省略・変更していますが、こういった流れです。
イメージとしては、これを

$name = "SELECT XXX from XXX";
$name_rst = odbc_exec($conn, $name);

foreach($array as $id) {
    echo mb_convert_encoding(odbc_result($name_rst,'id'='$id'),"utf-8","sjis");
}

のようにできれば達成できるのか?と考えております。

何か良い方法ご存じでしたら、恐れ入りますがお力添えをお願い申し上げます。

0

2Answer

一般的にプログラムの中で完結する処理よりも、DBなど外部にアクセスする方がコストがかかります。
ループの中でSQLを実行すると、ループの数だけコストのかかる処理が増えるので、その分パフォーマンスは落ちます。いわゆるN+1問題です。

SQLのIN演算子を使うのはいかがでしょうか?
(コードから読み取れますが使用しているDBMSも明記されたほうが良いと思います)

2Like

Comments

  1. @AS-B

    Questioner

    ご教授いただきまして誠にありがとうございます。
    N+1問題、SQLのIN演算子、DBMSという単語は初耳でしたので、学習させていただきました。

    IN演算子を用いて目的を達成できました。
    ありがとうございました。

    お陰様で1歩前進し、現在はSQLを外に出す事で今度は2つの配列をまとめて表示する事(whileとforeachの多重ループ処理?)にハマっており、なかなかゴールは遠いですが地道に進みたいと思います。

IN句を使えば解決できそうな気がします。

下記のようなイメージです。

$name = "SELECT XXX from XXX where id in ( 'ここに $array をカンマ区切りにした値を入れる' ) ";
1Like

Comments

  1. @AS-B

    Questioner

    ご教授いただきまして誠にありがとうございました。
    ご記載いただきましたコードで無事に目的が達成できました。
    知識の少なさを痛感しましたが、少しずつ学んでいきたいと思います。

Your answer might help someone💌