0

次のクエリは、1 つのクエリで関連のない 2 つのテーブルの行数をカウントするために使用されます。

  With t1 as (Select 1 
              Union Select  2 
              Union Select 3),
  t2 as (Select 'A' 
         Union Select 'B')

  Select (Select count(*) from t1), (Select count(*) from t2)

選択クエリで 2 つの選択ステートメントを回避するより良い方法はありますか。

出力は

3 2

Postgres に固有の任意の構成も実行できます。

4

3 に答える 3

3

シンプルで正しい

まず、より冗長なのではなく、式を使用してテストケースを簡略化できます。データ型がデフォルトではなく、 .. である場合は、最初の行に明示的な型キャストが必要です。VALUESUNION ALL SELECT
integertext

第二に、aFULL OUTER JOINはまったく無意味です。クエリを遅くするだけです。また、いずれかの行が他のテーブルに複数一致する場合、その行はカウントで乗算されます。

WITH t1(col1, col2) AS (VALUES (1, 1),   (2, 2),   (3, 3))
    ,t2(col1, col2) AS (VALUES (1, 'A'), (2, 'B'), (2, 'C'))  -- 2nd row for "2"
SELECT count(t1.*), count(t2.*)
FROM t1
FULL OUTER JOIN t2 USING (col1);

収量:

4   3

これは間違っています。

WITH t1(col2) AS (VALUES (1),   (2),   ( 3))
    ,t2(col2) AS (VALUES ('A'), ('B'), ('C'))
SELECT (SELECT count(*) FROM t1) AS t1_ct
      ,(SELECT count(*) FROM t1) AS t2_ct;

収量:

3   3

これは正しいですが、よりシンプルで高速です。
確かに、row_number()新たに適用された場合、重複はあり得ません。しかし、それは時間の無駄です。

パフォーマンス

大きなテーブルの場合、カウントは比較的遅くなります。正確な数は必要ありませんが、見積もりを立てることができる場合は、これを非常に高速に取得できます。

SELECT reltuples::bigint AS estimate
FROM   pg_class
WHERE  oid = 'myschema.mytable'::regclass;

ここでマニュアルを引用します:

これは、VACUUM、ANALYZE、およびCREATEINDEXなどのいくつかのDDLコマンドによって更新されます。

この関連する回答の詳細。

于 2012-12-31T11:51:52.900 に答える
0

カウントは、(CPU 負荷の点で) 非常にコストのかかる操作です。可能な限り避けるようにしてください。条件なしでテーブルの行の合計数を取得する必要がある場合、一部の RDBMS は回避策を提供します。たとえば、MSSQL を使用すると、次のようになります。

select SUM(row_count) as Total_Rows
 from sys.dm_db_partition_stats
where object_name(object_id) = 'YourTableName' 
  and index_id < 2

別のテーブルでカウントを維持することもできます。たとえば、特定の値でグループ化された合計数が必要な場合です。トリガーを使用してカウントを増減します。これは、(たとえば) メイン フォームに常にカウントを表示する必要がある場合 (アクティブ ユーザー、エリアごとのアクティブな投稿など) に推奨されます。

于 2012-12-31T11:31:50.173 に答える
-2

row_number 列を追加して 2 つのテーブル間に関係を導入し、完全外部結合を実行します。

  With t1 as (Select 1 as Col1, 1 
              Union Select  2, 2 
              Union Select 3, 3),
  t2 as (Select -1 as Col1, 'A' 
         Union Select -2, 'B')

  Select count(t1.*), count(t2.*) from t1 full outer join t2 on t1.Col1 = t2.Col1
于 2012-12-31T10:07:57.510 に答える