BigQuery writes all query results to a table. The table is either explicitly identified by the user (a destination table), or it is a temporary, cached results table. Temporary, cached results tables are maintained per-user, per-project. There are no storage costs for temporary tables, but if you write query results to a permanent table, you are charged for storing the data.
When you run a query, a temporary, cached results table is created in a special dataset referred to as an “anonymous dataset“. Unlike regular datasets which inherit permissions from the IAM resource hierarchy model (project and organization permissions), access to anonymous datasets is restricted to the dataset owner. The owner of an anonymous dataset is
the user who ran the query that produced the cached result.
When an anonymous dataset is created, the user that runs the query job is explictly given bigquery, dataOwner access to the anonymous dataset. bigquery.dataOwner access gives only the user who ran the query job full control over the dataset. This includes full control over the cached results tables in the anonymous dataset. If you intend to share query results, do not use the cached results stored in an anonymous dataset. Instead, write the results to a named destination table.
Though the user that runs the query has full access to the dataset and the cached results table, using them as inputs for dependent jobs is strongly discouraged.
The names of anonymous datasets begin with an underscore. This hides them from the datasets list in the GCP Console and the classic BigQuery web Ul. You can list anonymous datasets and audit anonymous dataset access controls by using the CLI or the API.