@cc [owner:Yassimba] profile.measures-are-check-types
Applies only to `profile_table` in `profile.py`.

Each number in `measures` is the measurement that a Check Engine gives for an installed Check
Type. The profile holds no SQL for such a number, and it names no Check Type.

@cc [owner:Yassimba] profile.values-count-the-profiled-rows
Applies only to `profile_table` in `profile.py`.

The most frequent values and the histogram of a column read rows as the measures do: the rows
of the filter of the Dataset and of the time window, and at most `sample` of them.

@cc [owner:Yassimba] profile.read-only
Applies only to `profile_table` in `profile.py`.

A profile writes nothing: no table, no file, and no Run History.

@cc [owner:Yassimba] profile.sample-is-a-limit
Applies only to `profile_table` in `profile.py`.

No query of a profile sorts the rows of the table. `sample` is a row limit, so the database
stops when it has that many rows, in no order. `sample` 0 reads each row.

@cc [owner:Yassimba] profile.window-is-the-event-time
Applies only to `profile_table` in `profile.py`.

`since` and `until` keep the rows with `since <= event time < until`, by the event time of the
Dataset, as the Check Window of a Check Run does. A time for a table that has no event time
raises ProfileRefusedError before a query runs.
