A method comprising: receiving a data access request for a plurality of tuples (121, 122); compiling the data access request into one or more relational operators (131, 132); dynamically selecting a particular implementation (131A, 131B, 132A, 132B) of a particular relational operator (131, 132) of said one or more relational operators (131, 132) from a plurality of interchangeable implementations (131A, 131B, 132A, 132B), wherein each implementation (131A, 131B, 132A, 132B) of the plurality of interchangeable implementations (131A, 131B, 132A, 132B) comprises a respective one or more physical operators (161, 162, 163, 164); dynamically selecting a particular hardware operator (161A, 161B) for a particular physical operator (161, 162, 163, 164) of said one or more physical operators (161, 162, 163, 164) of the particular implementation (131A, 131B, 132A, 132B) of the particular relational operator (131, 132) from a plurality of interchangeable hardware operators (161A, 161B) that comprises: a first hardware operator (161A, 161B) that executes on first processing hardware, and a second hardware operator (161A, 161B) that executes on second processing hardware that is functionally different from the first processing hardware; wherein said dynamically selecting said particular implementation (131A, 131B, 132A, 132B) is based on a dynamic condition concerning: a) available memory, b) available processing bandwidth, or c) expected consumption of memory or processing time by: said particular implementation (131A, 131B, 132A, 132B), said particular physical operator (161, 162, 163, 164), or said particular hardware operator (161A, 161B); generating an execution plan for the data access request that is a directed acyclic graph, DAG, wherein: the DAG is not a tree, and the DAG comprises said one or more physical operators (161, 162, 163, 164) of the particular implementation (131A, 131B, 132A, 132B) of said particular relational operator (131, 132); interpreting or otherwise executing the generated execution plan; and generating a response to the data access request that is based on: the plurality of tuples (121, 122), the particular implementation (131A, 131B, 132A, 132B) of the particular relational operator (131, 132), and the particular hardware operator (161A, 161B); wherein the response is an answer to the data access request that includes a final result set. receiving a data access request for a plurality of tuples (121, 122); compiling the data access request into one or more relational operators (131, 132); dynamically selecting a particular implementation (131A, 131B, 132A, 132B) of a particular relational operator (131, 132) of said one or more relational operators (131, 132) from a plurality of interchangeable implementations (131A, 131B, 132A, 132B), wherein each implementation (131A, 131B, 132A, 132B) of the plurality of interchangeable implementations (131A, 131B, 132A, 132B) comprises a respective one or more physical operators (161, 162, 163, 164); dynamically selecting a particular hardware operator (161A, 161B) for a particular physical operator (161, 162, 163, 164) of said one or more physical operators (161, 162, 163, 164) of the particular implementation (131A, 131B, 132A, 132B) of the particular relational operator (131, 132) from a plurality of interchangeable hardware operators (161A, 161B) that comprises: a first hardware operator (161A, 161B) that executes on first processing hardware, and a second hardware operator (161A, 161B) that executes on second processing hardware that is functionally different from the first processing hardware; wherein said dynamically selecting said particular implementation (131A, 131B, 132A, 132B) is based on a dynamic condition concerning: a) available memory, b) available processing bandwidth, or c) expected consumption of memory or processing time by: said particular implementation (131A, 131B, 132A, 132B), said particular physical operator (161, 162, 163, 164), or said particular hardware operator (161A, 161B); a) available memory, b) available processing bandwidth, or c) expected consumption of memory or processing time by: said particular implementation (131A, 131B, 132A, 132B), said particular physical operator (161, 162, 163, 164), or said particular hardware operator (161A, 161B); generating an execution plan for the data access request that is a directed acyclic graph, DAG, wherein: the DAG is not a tree, and the DAG comprises said one or more physical operators (161, 162, 163, 164) of the particular implementation (131A, 131B, 132A, 132B) of said particular relational operator (131, 132); the DAG is not a tree, and the DAG comprises said one or more physical operators (161, 162, 163, 164) of the particular implementation (131A, 131B, 132A, 132B) of said particular relational operator (131, 132); interpreting or otherwise executing the generated execution plan; and generating a response to the data access request that is based on: the plurality of tuples (121, 122), the particular implementation (131A, 131B, 132A, 132B) of the particular relational operator (131, 132), and the particular hardware operator (161A, 161B); wherein the response is an answer to the data access request that includes a final result set.