|
| 1 | +-- Events table stores all raw events |
| 2 | +-- Optimizations: |
| 3 | +-- 1. Use LowCardinality(String) for fields with limited distinct values |
| 4 | +-- 2. Reorder ORDER BY to prioritize time-based queries |
| 5 | +-- 3. Add materialized views for common aggregations |
| 6 | +-- 4. Remove Nullable where 0 is a sensible default |
| 7 | + |
| 8 | +CREATE TABLE IF NOT EXISTS analytics.events ( |
| 9 | + id UUID, |
| 10 | + client_id String, |
| 11 | + event_name String, |
| 12 | + anonymous_id String, |
| 13 | + time DateTime64(3, 'UTC'), |
| 14 | + session_id String, |
| 15 | + |
| 16 | + event_type LowCardinality(String) DEFAULT 'track', -- 'track', 'error', 'web_vitals' |
| 17 | + event_id Nullable(String), -- UUID from client for deduplication |
| 18 | + session_start_time Nullable(DateTime64(3, 'UTC')), -- New session tracking |
| 19 | + timestamp DateTime64(3, 'UTC') DEFAULT time, -- Alias for new format |
| 20 | + |
| 21 | + referrer Nullable(String), |
| 22 | + url String, |
| 23 | + path String, |
| 24 | + title Nullable(String), |
| 25 | + |
| 26 | + ip String, |
| 27 | + user_agent String, |
| 28 | + browser_name Nullable(String), |
| 29 | + browser_version Nullable(String), |
| 30 | + os_name Nullable(String), |
| 31 | + os_version Nullable(String), |
| 32 | + device_type Nullable(String), |
| 33 | + device_brand Nullable(String), |
| 34 | + device_model Nullable(String), |
| 35 | + country Nullable(String), |
| 36 | + region Nullable(String), |
| 37 | + city Nullable(String), |
| 38 | + |
| 39 | + screen_resolution Nullable(String), |
| 40 | + viewport_size Nullable(String), |
| 41 | + language Nullable(String), |
| 42 | + timezone Nullable(String), |
| 43 | + |
| 44 | + connection_type Nullable(String), |
| 45 | + rtt Nullable(Int16), |
| 46 | + downlink Nullable(Float32), -- New field |
| 47 | + |
| 48 | + time_on_page Nullable(Float32), |
| 49 | + scroll_depth Nullable(Float32), |
| 50 | + interaction_count Nullable(Int16), |
| 51 | + exit_intent UInt8, |
| 52 | + page_count UInt8 DEFAULT 1, |
| 53 | + is_bounce UInt8 DEFAULT 1, |
| 54 | + has_exit_intent Nullable(UInt8), -- New field |
| 55 | + page_size Nullable(Int32), |
| 56 | + |
| 57 | + utm_source Nullable(String), |
| 58 | + utm_medium Nullable(String), |
| 59 | + utm_campaign Nullable(String), |
| 60 | + utm_term Nullable(String), |
| 61 | + utm_content Nullable(String), |
| 62 | + |
| 63 | + load_time Nullable(Int32), |
| 64 | + dom_ready_time Nullable(Int32), |
| 65 | + dom_interactive Nullable(Int32), -- New field |
| 66 | + ttfb Nullable(Int32), |
| 67 | + connection_time Nullable(Int32), |
| 68 | + request_time Nullable(Int32), |
| 69 | + render_time Nullable(Int32), |
| 70 | + redirect_time Nullable(Int32), -- New field |
| 71 | + domain_lookup_time Nullable(Int32), -- New field |
| 72 | + |
| 73 | + fcp Nullable(Int32), |
| 74 | + lcp Nullable(Int32), |
| 75 | + cls Nullable(Float32), |
| 76 | + fid Nullable(Int32), -- New field |
| 77 | + inp Nullable(Int32), -- New field |
| 78 | + |
| 79 | + href Nullable(String), |
| 80 | + text Nullable(String), |
| 81 | + |
| 82 | + value Nullable(String), |
| 83 | + |
| 84 | + error_message Nullable(String), |
| 85 | + error_filename Nullable(String), |
| 86 | + error_lineno Nullable(Int32), |
| 87 | + error_colno Nullable(Int32), |
| 88 | + error_stack Nullable(String), |
| 89 | + error_type Nullable(String), |
| 90 | + |
| 91 | + properties String, |
| 92 | + |
| 93 | + created_at DateTime64(3, 'UTC') |
| 94 | +) ENGINE = MergeTree() |
| 95 | +PARTITION BY toYYYYMM(time) |
| 96 | +ORDER BY (client_id, time, id) |
| 97 | +SETTINGS index_granularity = 8192; |
0 commit comments