1. A method comprising: determining, for a database query that does not represent a snowflake schema, a graph comprising (a) vertices each representing a table joined in the query, (b) a directed edge between each pair of vertices of which a first vertex represents a first table and a second vertex represents a second table that is joined in the query with the first table, each of the edges representing one of an outer join and an inner join; determining, for the graph, a directed spanning tree that (a) represents an ordering of joins in the query and includes all outer join edges in the graph, (b) does not include a first subtree having an outer join edge directed from a first vertex to a second vertex, and an inner join edge directed from the second vertex to a third vertex, (c) does not include a second subtree having an outer join edge directed from a fourth vertex to a fifth vertex, and another outer join edge directed from the fourth vertex to a sixth vertex; and the spanning tree being a sufficient basis for a physical plan to obtain data records that satisfy the query.