web-dev-qa-db-ja.com

PostgreSQLでクエリ時間を正確に測定する方法(EXPLAIN ANALYZEはそうではないため)?

EXPLAIN ANALYZEがクエリ時間を返すことは知っていますが、私のユースケースではそうではないようです。 (私が何かを逃していない限り...それは何である可能性があります...?)

SELECT cars.*, users.*, makers.*, places.*
  FROM cars
  LEFT OUTER JOIN "users" ON "users"."id" = "cars"."user_id" 
  LEFT OUTER JOIN "makers" ON "makers"."id" = "cars"."company_id" 
  LEFT OUTER JOIN "places" ON "places"."id" = "cars"."location_id" 
  WHERE "cars"."deleted_at" IS NULL 
    AND "cars"."draft" = 'f' 
    AND ((cars.reference_number::text ILIKE '%abc123%') 
      OR (makers.name::text ILIKE '%abc123%') 
      OR (places.name::text ILIKE '%abc123%'))  
  ORDER BY cars.id DESC NULLS LAST 
  LIMIT 20 
  OFFSET 0;

EXPLAIN ANALYZEの出力:

Planning time: 1.300 ms
Execution time: 105.936 ms

\ timingを使用したSELECT出力:

Time: 2100.704 ms (00:02.101)

EXPLAIN ANALYZEにはデータを読み取る時間は含まれていないようです。

(PSQLコンソールではなく)SQLを使用せずに合計時間を取得するにはどうすればよいですか?

PostgreSQL 9.6.6

2
B Seven

コメントのa_horse_with_no_nameから、

実際に、explain(analyze)によって報告される時間には、SQLクライアントにデータを送信するのにかかる時間は含まれていません。これは、サーバーが結果をドライバーに送信できるように完全に準備するために必要な時間です。その後の遅延は完全にSQLクライアントとクライアントとサーバー間のネットワークの組み合わせ次第なので、説明することは不可能です

それで十分です。 1つはサーバー側、もう1つはネットワーク側です。

1
Evan Carroll

ネットワーク時間とクライアント時間を含める場合は、クライアントでタイマーを開始および停止します。どんなクライアントであろうと。

0
jjanes