1. A method for improving performance of join operations, the method comprising: building a directed graph of vertices and edges, wherein the vertices represent tables to be joined and the edges represent join conditions between the tables; forming a set of candidate join operations based on the join conditions by traversing the directed graph; and selecting a subset of the candidate join operations for residing in memory as denormalized relations to make best use of an amount of available memory.