1. A method comprising: building a directed graph based on a corresponding schema of a database, the directed graph comprising vertices and edges, wherein the vertices represent tables in the corresponding schema and the edges represent relationships between the tables that correspond to join conditions; traversing the directed graph to determine a plurality of potential denormalizations; determining a plurality of costs and a plurality of benefits for the plurality of potential denormalizations, wherein each cost of the plurality of costs is based on a size of a denormalized relation corresponding to one of the plurality of potential denormalizations, wherein each benefit of the plurality of benefits is based on the cost of a join that is avoided when the denormalized relation is available; and determining, from the plurality of potential denormalizations, a plurality of selected denormalized relations based on an amount of available memory, the plurality of costs, and the plurality of benefits.