A method comprising: receiving a request to aggregate data grouped by a first column; in response to receiving the request, performing, for each row of a plurality of rows: retrieving, using hardware of a group column access unit, a value from the first column of the row; wherein the value from the first column of the row is a group value for the row; mapping, using hardware of a hash table access unit, the group value for the row to an address in volatile memory; retrieving from volatile memory associated with the address, using hardware of a aggregation state access unit, a set of aggregation data for a group associated with the group value; and updating, using hardware of a value column access unit, an aggregate value included in the set of aggregation data based on a value contained in a second column of the row; wherein the group column access unit, the hash table access unit, the aggregation state access unit and the value column access unit are separate and distinct hardware units; and wherein the group column access unit, the hash table access unit, the aggregation state access unit and the value column access unit each have a separate and distinct local memory (208, 306, 410, 510). receiving a request to aggregate data grouped by a first column; in response to receiving the request, performing, for each row of a plurality of rows: retrieving, using hardware of a group column access unit, a value from the first column of the row; wherein the value from the first column of the row is a group value for the row; mapping, using hardware of a hash table access unit, the group value for the row to an address in volatile memory; retrieving from volatile memory associated with the address, using hardware of a aggregation state access unit, a set of aggregation data for a group associated with the group value; and updating, using hardware of a value column access unit, an aggregate value included in the set of aggregation data based on a value contained in a second column of the row; wherein the group column access unit, the hash table access unit, the aggregation state access unit and the value column access unit are separate and distinct hardware units; and wherein the group column access unit, the hash table access unit, the aggregation state access unit and the value column access unit each have a separate and distinct local memory (208, 306, 410, 510). retrieving, using hardware of a group column access unit, a value from the first column of the row; wherein the value from the first column of the row is a group value for the row; mapping, using hardware of a hash table access unit, the group value for the row to an address in volatile memory; retrieving from volatile memory associated with the address, using hardware of a aggregation state access unit, a set of aggregation data for a group associated with the group value; and updating, using hardware of a value column access unit, an aggregate value included in the set of aggregation data based on a value contained in a second column of the row; wherein the group column access unit, the hash table access unit, the aggregation state access unit and the value column access unit are separate and distinct hardware units; and wherein the group column access unit, the hash table access unit, the aggregation state access unit and the value column access unit each have a separate and distinct local memory (208, 306, 410, 510).