1. An apparatus, comprising: at least one processor; and program code configured upon execution by the at least one processor to monitor a query during runtime, wherein the query involves a plurality of join operations, wherein the plurality of join operations include a first join that includes a first table and a second table and a second join that includes the first table and a third table, and wherein the program code is configured to monitor the query by: running the query according to a first join order; generating a first portion of a result set for the query while running the query according to the first join order, including adding to the result set a first record that matches the plurality of join operations in the query; concurrent with running the query, collecting performance statistics about each of the join operations; dynamically changing the first join order, during running of the query, to a second join order based on the statistics; and generating a second portion of the result set for the query while running the query according to the second join order, including adding to the result set a second record that matches the plurality of join operations in the query such that the result set includes at least the first and second records, the first and second portions of the result set generated for the same execution of the query, wherein the program code is configured to dynamically change the first join order to the second join order by determining respective fan-in statistics for the first join and second join and dynamically changing the first join order to the second join order if the respective fan-in statistics indicate that the second join is more likely to cause fan-in than the first join.