AWSメモ > DynamoDBで取得する列を指定した場合のキャパシティユニット †
概要 †DynamoDBで取得する列を指定して検索した場合のQueryのキャパシティユニットについて確認する。 AttributesToGet はレガシーパラメータだそうなので、以下のサンプルでは ProjectionExpression を使用する。 取得する列を指定して検索 †import boto3 from boto3.dynamodb.conditions import Key import json dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('SampleTable') def create_test_data(): text_data = '1234567890' * 1000 for i in range(1): for j in range(10): res = table.put_item( Item = { "pkey": f'pkey-{i+1:05d}', "skey": f'skey-{j+1:05d}', "column001": text_data, "column002": text_data, "column003": text_data, "column004": text_data, "column005": text_data, "column006": text_data, "column007": text_data, "column008": text_data, "column009": text_data, "column010": text_data }, ReturnConsumedCapacity = 'INDEXES' ) print(res) def get_item(pkey, skey, columns): args = {} args['Key'] = {'pkey': pkey, 'skey': skey} args['ProjectionExpression'] = columns args['ReturnConsumedCapacity'] = 'INDEXES' res = table.get_item(**args) print(json.dumps(res['ConsumedCapacity'], indent=4)) def query(pkey, skey, columns): args = {} args['KeyConditionExpression'] = Key('pkey').eq(pkey) if skey: args['KeyConditionExpression'] &= Key('skey').eq(skey) args['ProjectionExpression'] = columns args['ReturnConsumedCapacity'] = 'INDEXES' res = table.query(**args) print(json.dumps(res['ConsumedCapacity'], indent=4)) def main(): #create_test_data() print('### get_item(column * 5) ###') get_item('pkey-00001', 'skey-00001', 'column001, column002 ,column003, column004, column005') print('### get_item(column * 10) ###') get_item('pkey-00001', 'skey-00001', 'column001, column002 ,column003, column004, column005, column006, column007 ,column008, column009, column010') print('### query(column * 5) ###') query('pkey-00001', 'skey-00001', 'column001, column002 ,column003, column004, column005') print('### query(column * 10) ###') query('pkey-00001', 'skey-00001', 'column001, column002 ,column003, column004, column005, column006, column007 ,column008, column009, column010') print('### query(hash key only query - column * 5) ###') query('pkey-00001', None, 'column001, column002 ,column003, column004, column005') print('### query(hash key only query - column * 10) ###') query('pkey-00001', None, 'column001, column002 ,column003, column004, column005, column006, column007 ,column008, column009, column010') if __name__ == '__main__': main() 結果 †結果は変わらない。レコードサイズ分のキャパシティユニットが消費される。 ### get_item(column * 5) ### { "TableName": "SampleTable", "CapacityUnits": 12.5, "Table": { "CapacityUnits": 12.5 } } ### get_item(column * 10) ### { "TableName": "SampleTable", "CapacityUnits": 12.5, "Table": { "CapacityUnits": 12.5 } } ### query(column * 5) ### { "TableName": "SampleTable", "CapacityUnits": 12.5, "Table": { "CapacityUnits": 12.5 } } ### query(column * 10) ### { "TableName": "SampleTable", "CapacityUnits": 12.5, "Table": { "CapacityUnits": 12.5 } } ### query(hash key only query - column * 5) ### { "TableName": "SampleTable", "CapacityUnits": 122.5, "Table": { "CapacityUnits": 122.5 } } ### query(hash key only query - column * 10) ### { "TableName": "SampleTable", "CapacityUnits": 122.5, "Table": { "CapacityUnits": 122.5 } } ドキュメントにも書いてある。 # ドキュメントより抜粋 # あと、検索結果が0件の場合も、キャパシティユニットが消費される模様。 # ドキュメントより抜粋 # ただし、queryで複数件を一度に取得した時は1レコード毎に切り上げられず、 # ドキュメントより抜粋 # |