セッションごとに 100 列 X 500,000 行で構成されるテーブルに自動車のパフォーマンス メトリックを記録するアプリケーションを構築しています。一部の列は非常に反復的です (華氏単位の冷媒温度)。他の列は連続的に変化します (点火進角、マニホールド圧力、空燃比)。
プロジェクトはオープンソースのオーディエンスを対象としているため、列ストアとページ圧縮は問題外です。MS SQL Express Edition または大規模なテーブル サイズに対応できる別の無料のデータベース プラットフォームをサポートする必要があります。
私の最初の解決策は、いくつかの列でnullを許可することです。これにより、繰り返し値を挿入しないことでストレージのフットプリントが劇的に削減され、これによりログ解像度をより高いフレームレートに上げることができます.
ただし、特定の列が 99% null になるため、個別の行を選択するときに障害が発生します。したがって、そのフィールドに値を含む最後の行を選択するビュー (または計算列?) を作成する必要があります。私のアプローチは、スパース列ごとにサブクエリを使用することです。これはひどく非エレガントに思えます。検討すべきより効率的なアプローチはありますか?
SELECT ISNULL(
val1,
(
SELECT TOP 1 val1
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val1 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val1,
ISNULL(
val2,
(
SELECT TOP 1 val2
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val2 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val2,
ISNULL(
val3,
(
SELECT TOP 1 val3
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val3 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val3
FROM [values] v