ちょっとマニアックで癖のある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サイトで最も重い処理になってしまいました。
スマートに件数取得を行うには、管理用のテーブルを用意して、カウント対象のテーブルの件数を記録しておくしかなさそうです。