![](https://habrastorage.org/storage2/b42/4db/3fe/b424db3fe0602f4dc6ac270a5e544e94.jpg)
投稿のタイトルがおかしいと感じる人もいます。 確かに、彼らの正しい考えで、サーバーでのリクエストの実行を遅くするのはなぜですか?
「長いクエリでクライアントプログラムのインターフェースがどのように機能するかを確認するには」と答えます。 このような問題は、 ERデザイナーの基本構造のインポートの実装中に発生しました。
私の謙虚な意見では、プログラムのインターフェースは、長い要求の間、3つの側面を提供する必要があります:
- あらゆる種類の統計とアニメーション(?)でユーザーの目を楽しませます。
- ユーザーにクリックさせたり、何か間違ったことをさせたりしないでください。
- 一方、長いプロセスを停止する機会を与えることが不可欠です。
もちろん、クライアントプログラムコードにあらゆる種類のスリープ()を挿入することを禁止する人はいませんが、これには何か悪があります。 また、組み込み関数pg_sleep()を使用できます。この関数のパラメーターには、リクエストの実行を停止する秒数を渡すことができます。
SELECT pg_sleep(1.5);
データベース内のテーブルのリストを返すクエリにブレーキをかけましょう。
SELECT oid :: regclass FROM pg_class WHERE relkind = 'r'
例1
FROMセクションにpg_sleep()呼び出しを配置できます。
SELECT oid::regclass FROM pg_class, pg_sleep(10) WHERE relkind = 'r'
この場合、関数は1回だけ実行され、合計実行時間は約10秒になります。 さらに、データセット全体がすぐに全体として返されます。
例2
SELECTセクションにpg_sleep()呼び出しを配置できます。
SELECT oid::regclass, pg_sleep(1) FROM pg_class WHERE relkind = 'r'
同じ場合、関数はデータセットの各行に対して1回実行されます。 つまり、データベースにあるテーブルと同じ回数。 このアプローチには、もう1つの利点があります。 非同期の要求処理を使用すると、たとえばこの方法またはその方法で 、文字列を1つずつ取得し、ゆっくりとクロールする進行状況バーをユーザーに表示できます。
あなたに最高!
UPDこの機能を思い出させてくれた Szymon Guzに感謝します。