A method, comprising: receiving, by at least one processor having a plurality of threads and a cache, input having records stored in random access memory; and performing multi-pass aggregation, comprising, in a given pass: distributing, by the at least one processor, the input into portions, each of the plurality of threads having an assigned portion; aggregating, by the at least one processor, the records in the assigned portion into an intermediate private hash table found in the cache having a given size that is smaller than the cache until the intermediate private hash table is filled; determining an aggregation factor equal to s ' / s, where s ' is equal to a number of records inserted into the intermediate private hash table and s is equal to the size of the intermediate private hash table; if the aggregation factor is greater than a predetermined aggregation threshold, continuing aggregation of further records using an additional private hash table located entirely within the cache; if the aggregation factor is less than or equal to the aggregation threshold, processing further records of the assigned portion using radix bucket partitioning to partition the further records into radix buckets; wherein the intermediate private hash table and radix buckets are included in an intermediate data structure, the method further comprising providing the intermediate data structure as the input to a next pass of the multi-pass aggregation; and outputting, by the at least one processor after a last pass of the multi-pass aggregation, the aggregated records into a global hash table. receiving, by at least one processor having a plurality of threads and a cache, input having records stored in random access memory; and performing multi-pass aggregation, comprising, in a given pass: distributing, by the at least one processor, the input into portions, each of the plurality of threads having an assigned portion; aggregating, by the at least one processor, the records in the assigned portion into an intermediate private hash table found in the cache having a given size that is smaller than the cache until the intermediate private hash table is filled; determining an aggregation factor equal to s ' / s, where s ' is equal to a number of records inserted into the intermediate private hash table and s is equal to the size of the intermediate private hash table; if the aggregation factor is greater than a predetermined aggregation threshold, continuing aggregation of further records using an additional private hash table located entirely within the cache; if the aggregation factor is less than or equal to the aggregation threshold, processing further records of the assigned portion using radix bucket partitioning to partition the further records into radix buckets; wherein the intermediate private hash table and radix buckets are included in an intermediate data structure, the method further comprising providing the intermediate data structure as the input to a next pass of the multi-pass aggregation; and outputting, by the at least one processor after a last pass of the multi-pass aggregation, the aggregated records into a global hash table. distributing, by the at least one processor, the input into portions, each of the plurality of threads having an assigned portion; aggregating, by the at least one processor, the records in the assigned portion into an intermediate private hash table found in the cache having a given size that is smaller than the cache until the intermediate private hash table is filled; determining an aggregation factor equal to s ' / s, where s ' is equal to a number of records inserted into the intermediate private hash table and s is equal to the size of the intermediate private hash table; if the aggregation factor is greater than a predetermined aggregation threshold, continuing aggregation of further records using an additional private hash table located entirely within the cache; if the aggregation factor is less than or equal to the aggregation threshold, processing further records of the assigned portion using radix bucket partitioning to partition the further records into radix buckets; wherein the intermediate private hash table and radix buckets are included in an intermediate data structure, the method further comprising providing the intermediate data structure as the input to a next pass of the multi-pass aggregation; and outputting, by the at least one processor after a last pass of the multi-pass aggregation, the aggregated records into a global hash table.