【问题标题】:sqlite: wide v. long performancesqlite:宽与长性能
【发布时间】:2019-01-07 16:03:04
【问题描述】:

我正在考虑是否应该将我的 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    |

【问题讨论】:

    标签: performance sqlite


    【解决方案1】:

    “长”格式是这里的首选方式,原因有很多。首先,如果您使用“宽”格式并且需要添加更多系列,那么您将不得不向数据库表中添加新列。虽然这并不太麻烦,但一般来说,一旦您将架构投入生产,您希望避免进一步的架构更改。

    其次,“长”格式使报告和查询更加容易。例如,假设您想获取每个系列的行数/数据点数。那么你只需要这样的东西:

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

    要获得具有“宽”格式的报告,您需要更多代码,并且它会像上面的示例数据一样冗长。

    这里要记住的是,SQL 数据库是为操作记录集而构建的(阅读:跨行)。他们也可以按列处理事情,但他们通常不会这样做。

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 2020-09-22
      • 2010-11-05
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      相关资源
      最近更新 更多