sqlite:广泛诉长绩效

时间:2019-01-07 16:03:04

标签: performance sqlite

我正在考虑是否要在sqlite数据库中以“宽”或“长”格式设置表的格式。问题末尾包括这些格式的示例。

我希望我的大部分请求都采用以下形式:

SELECT * FROM table
WHERE
  series in (series1, series100);

或用于按宽格式按列选择的类似物。

我还希望会有大量的列,甚至足以增加column limit

是否有选择用于优化这种情况下查询性能的表格布局的一般准则?

(每个示例)

“宽”格式:

| date       | series1 | series2 | ...  | seriesN |
| ---------- | ------- | ------- | ---- | ------- |
| "1/1/1900" | 15      | 24      | 43   | 23      |
| "1/2/1900" | 15      | null    | null | 23      |
| ...        | 15      | null    | null | 23      |
| "1/2/2019" | 12      | 12      | 4    | null    |

“长”格式:

| date       | series  | value |
| ---------- | ------- | ----- |
| "1/1/1900" | series1 | 15    |
| "1/2/1900" | series1 | 15    |
| ...        | series1 | 43    |
| "1/2/2019" | series1 | 12    |
| "1/1/1900" | series2 | 15    |
| "1/2/1900" | series2 | 15    |
| ...        | series2 | 43    |
| "1/2/2019" | series2 | 12    |
| ...        | ...     | ...   |
| "1/1/1900" | seriesN | 15    |
| "1/2/1900" | seriesN | 15    |
| ...        | seriesN | 43    |
| "1/2/2019" | seriesN | 12    |

1 个答案:

答案 0 :(得分:2)

出于多种原因,“长”格式是首选的选择。首先,如果您使用“宽”格式,并且永远需要添加更多系列,那么您将不得不向数据库表中添加新列。尽管这不太麻烦,但是通常在将模式投入生产后,您就希望避免进一步的模式更改。

第二,“长”格式使报告和查询变得更加容易。例如,假设您想获得每个系列的行数/数据点数。然后,您只需要类似以下内容:

SELECT series, COUNT(*) AS cnt
FROM yourTable
GROUP BY series;

要以“宽”格式获得此报告,您将需要更多代码,并且与上面的示例数据一样冗长。

这里要牢记的一点是,SQL数据库是为对记录集(可读取:跨行)而构建的。他们还可以按列处理事情,但是通常没有设置这样做。