0

列「blob」が存在する場合、データベース全体に対してCOUNT(*)SUM(LENGTH(blob)/1024./1024.)、およびを実行することに興味があります。ORDER BY SUM(LENGTH(blob))synchlevelsが存在しないテーブルの場合でも、出力が必要です。GROUP BYそのコラムをお願いします:

+--------+------------+--------+-----------+
| | テーブル | 同期レベル | カウント | size_mb |
+--------+------------+--------+-----------+
| | テーブル A | 0 | 924505 | 3013.47 |
| | テーブル A | 7 | 981 | 295.33 |
| | テーブル B | 6 | 1449年 | 130.50 |
| | テーブル C | 1 | 64368 | 68.43 |
| | テーブル D | ヌル | 359 | .54 |
| | テーブル D | ヌル | 778 | .05 |
+--------+------------+--------+-----------+

純粋な SQL ソリューションを実行したいのですが、それには少し苦労しています。現在、いくつかの SQL を BASH にラップしています。

#!/bin/bash

USER=$1
DBNAME=$2

function psql_cmd(){
    cmd=$1
    prefix='\pset border 2 \\ '
    echo $prefix $cmd | psql -U $USER $DBNAME | grep -v "Border\| row"
}

function synchlevels(){
    echo "===================================================="
    echo "                 SYNCH LEVEL STATS                  " 
    echo "===================================================="
    tables=($(psql -U $USER -tc "SELECT table_name FROM information_schema.columns
    WHERE column_name = 'blob';" $DBNAME))
    for table in ${tables[@]}; do
        count_size="SELECT t.synchlevel,
                        COUNT(t.blob) AS count,
                        to_char(SUM(LENGTH(t.blob)/1024./1024.),'99999D99') AS size_mb
                      FROM $table AS t
                      GROUP BY t.synchlevel
                      ORDER BY SUM(LENGTH(t.blob)) DESC;"
        echo $table
        psql_cmd "$count_size"
    done
    echo "===================================================="
}

「synchlevel」列を持つテーブルの2番目のテーブルBASH配列を作成することでこれを拡張し、そのリストを比較して使用してSQLを実行できますが、SQL部分を純粋に実行できる方法があるかどうか疑問に思っていましたこれらのリストを BASH で作成し、外部で比較を行うことに頼らずに SQL を実行します。つまり、テーブルを外部でループしたり、で多数のクエリを作成したりする必要がないようにしたいのですtables=($(psql -U $USER...

列が存在しないことがわかっているテーブルでテストするために、次のSQLを試しました...

SELECT
  CASE WHEN EXISTS(SELECT * FROM information_schema.columns 
                WHERE column_name = 'synchlevel' 
            AND table_name = 'archivemetadata')
      THEN synchlevel
    END,
  COUNT(blob) AS count,
  to_char(SUM(LENGTH(blob)/1024./1024.),'99999D99') AS size_mb
 FROM archivemetadata, information_schema.columns AS info
 WHERE info.column_name = 'blob'

ただし、THEN synchlevelテーブルが存在しない場合は失敗します。それは本当に簡単に思えますが、どちらも必要としないこれを行う方法を見つけることができないようです:

  1. BASH での外部配列比較に頼る。
    • できますが、別のレイヤーを追加するのではなく、ソリューションを簡素化したいと考えています。
  2. PL/PGSQL 関数の作成。
    • このスクリプトは、サードパーティ製ソフトウェアのパフォーマンスを向上させるためのデータベース データ分析を支援するためのものです。私たちは DB 管理者のショップではないので、PL/PGSQL に飛び込むことは避けたいと思います。スクリプトをサポートするために、PL/PGSQL に慣れ親しむ必要があるためです。繰り返しますが、シンプルさがここでの動機です。

Postgresql 8.4 がエンジンです。(IT 機関の監督によるセキュリティ上の制約により、アップグレードすることはできません。)

ご提案いただきありがとうございます。

4

1 に答える 1