AWS DynmoDB 件数取得で時間要す

ちょっとマニアックで癖のあるAWS DynmoDB。

テーブルアクセス時には、まず件数を知りたいとこです。SQL文なら以下のような感じ。

SELECT count(*) from テーブル名

DynmoDBで、pythonなら以下のような感じです。

tbl1 = dynamodb.Table("テーブル名") 
resp = tbl1.scan(   Select="COUNT", 
                    ReturnConsumedCapacity='TOTAL' )
count   = resp['Count']   

簡単できたと思いましたが落とし穴が、、、

まず感覚的に、他RBMSのSELECT count(*) に比べなんか重い。2万件程度、テーブルにデータを追加してみたところ、エラーが発生しました。

原因は、読出し一回1MB制限でNGでした。count値だけなら1MBに達しないと解釈していましたが、内部的にデータも取り出してくるようです。query でもscanでも同じ。

件数取得したいだけなのに、以下のようにloopにしないといけません。ザックリ1万件づつ読出し。

isLoop = True
totalCount = 0
lastKey=""

while( isLoop == True ):
    if ( lastKey == "" ):  # First scan
        resp = tbl1.scan(   Select="COUNT", 
                            ReturnConsumedCapacity='TOTAL',
                            Limit=10000 )
    else                   # Second or later scan
        resp = tbl1.scan(   Select="COUNT", 
                            ExclusiveStartKey=lastKey,
                            ReturnConsumedCapacity='TOTAL',
                            Limit=10000 )
    count   = resp['Count']   
    totalCount += count 
    #ラストキーがあれば、続きあり 
    if 'LastEvaluatedKey' in resp :  
        lastKey = resp['LastEvaluatedKey']
    else:                       # 続きなし 
        isLoop = False          # loop終了
 

おまけにLambdaのタイムアウトやメモリの動作設定の不足でよく止まってしまいます。弊方の構築したWEBサイトで最も重い処理になってしまいました。

スマートに件数取得を行うには、管理用のテーブルを用意して、カウント対象のテーブルの件数を記録しておくしかなさそうです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です