フレームワークは ci を使用し、データベースは sqlsrv (SQL Server 2008) です。SQL クエリによって返された結果セットには 20,000 個のデータがあります。この SQL ステートメントを ci フレームワークで実行すると、Web ページが回転し続けます。20,000 個必要なデータ量は約 30 秒かかりますが、SQL Server 2008 R2 では SQL ステートメントは数秒で実行されます。CI で組み込みのクエリ SQL を使用する場合、実行時間は 200 ミリ秒です。つまり、ステートメントは実行されません。遅い。個人的には、返されるデータが多すぎて遅すぎると思います。20,000 個のデータと約 20 フィールドが返されます。統計を行ったり、データを CSV ファイルにエクスポートしたりするため、データが大量にあります。どうすればよいですか?私はこれに対処しますか?
私の SQL ステートメントは select * from table where create_time between 'xxxx-xx-xx 00:00:00' and 'xxxx-xx-xx 23:59:59'; これは、ユーザーがを選択します 時間範囲が小さい場合、データは少なくなります。範囲が大きい場合、データは大きくなります。データが大きい場合、非常に遅くなります。
パブリック関数 aa(){
リーリー}
これはすでに最も単純なクエリです。SQL ステートメントは数秒でチェックできますが、ブラウザで実行すると非常に時間がかかります。
ブラウザで実行します。クエリ結果が数十の場合何千ものデータがあれば、ブラウザは回転し続けるのに 40 秒以上かかります。500 個のデータであれば 3 ~ 4 秒かかります。
==============2017-05-16 16:01 更新===============
CI は使用しませんでしたCI フレームワークのドキュメントを参照すると、result_array() を使用して、次の段落を目にしました:
多くの場合、データベース接続 ID または結果 ID を指定する必要があります。接続 ID は次のようになります
リーリー
そこで、 result_id を使用してループ内の各レコードを読み取るようにコードを変更しました。
$sql ="select xxx";$query=$this->db->query($sql) ;
//ここでは sqlsrv を使用しているため、sqlsrv_fetch_array を使用してループ内の各行を読み取ります。
//次に、各行を読み取った後に csv ファイルを書き込みます。
while($row=sqlsrv_fetch_array($query ->) ;result_id,SQLSRV_FETCH_ASSOC)){
//CSV ファイルに行を書き込むコードは次のとおりです
}
具体的なコードは次のとおりです
この方法でファイルはエクスポートできますが、19204 行を見ると、16 列の CSV ファイルは約 3M です。エクスポートには 40 ~ 45 秒かかります。この時間をもっと速く最適化できないかどうかを尋ねたいです。
これは、すべてのデータを Excel にエクスポートする方法です。 Excel に書き込む前に、データをチェックアウトする必要があります。私は通常、バックグラウンド プロセスを使用してデータをエクスポートし、電子メールに送信します。