Skip to content

Если колонка разбита на чанки, то может вернуться неверный результат в ответе #26788

@Vladilen

Description

@Vladilen

Есть таблица:

SHOW CREATE table test_table
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬──────────────┬──────────┐
│ CreateQuery                                                                                                                                                                           │ Path         │ PathType │
├───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼──────────┤
│ "CREATE TABLE `test_table` (\n    `timestamp` Timestamp NOT NULL,\n    `resource_type` Utf8 NOT NULL,\n    `resource_id` Utf8 NOT NULL,\n    `stream_name` Utf8 NOT NULL,\n    `parti │ "test_table""Table"
│ tion` Uint32 NOT NULL,\n    `offset` Uint64 NOT NULL,\n    `index` Uint32 NOT NULL,\n    `level` Int32,\n    `message` Utf8,\n    `json_payload` JsonDocument,\n    `ingested_at` Tim │              │          │
│ estamp,\n    `saved_at` Timestamp,\n    `request_id` Utf8,\n    PRIMARY KEY (`timestamp`, `resource_type`, `resource_id`, `stream_name`, `partition`, `offset`, `index`)\n)\nPARTITIO │              │          │
│ N BY HASH (`timestamp`, `partition`, `offset`, `index`)\nWITH (\n    STORE = COLUMN,\n    AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 1\n);\n\nALTER OBJECT `/Root/testdb/test_table` (T │              │          │
│ YPE TABLE) SET (ACTION = UPSERT_OPTIONS, `COMPACTION_PLANNER.CLASS_NAME` = 'lc-buckets', `COMPACTION_PLANNER.FEATURES` = `{\\\"levels\\\":[{\\\"class_name\\\":\\\"Zero\\\",\\\"expec │              │          │
│ ted_blobs_size\\\":20971520},{\\\"class_name\\\":\\\"Zero\\\",\\\"expected_blobs_size\\\":20971520},{\\\"class_name\\\":\\\"Zero\\\",\\\"expected_blobs_size\\\":20971520}]}`);\n"    │              │          │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴──────────┘

в которой есть данные и они сохранены следующим образом:

SELECT PortionId, EntityName, Rows, ChunkIdx FROM `test_table/.sys/primary_index_stats`;
┌───────────┬──────────────────┬───────┬──────────┐
│ PortionId │ EntityName       │ Rows  │ ChunkIdx │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"timestamp"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"resource_type"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"resource_id"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"stream_name"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"partition"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"offset"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"index"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"message"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"json_payload"132810        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"json_payload"132821        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"_yql_plan_step"265630        │
├───────────┼──────────────────┼───────┼──────────┤
│ 11"_yql_tx_id"265630        │
└───────────┴──────────────────┴───────┴──────────┘

Обратите внимание, что колонка json_payload разбита на 2 чанка в 1 порции.

При чтении данных на границе этого чанка (чтобы в выдачу попали данные из 0 и 1) результат будет отличаться, если не читать колонку json_payload и читать:

SELECT timestamp
     FROM `test_table`
     WHERE timestamp > Timestamp("2025-10-08T11:00:02.193382Z")
     ORDER by timestamp ASC
     limit 5;
┌───────────────────────────────┐
│ timestamp                     │
├───────────────────────────────┤
│ "2025-10-08T11:00:02.193445Z" │
├───────────────────────────────┤
│ "2025-10-08T11:00:02.193858Z" │
├───────────────────────────────┤
│ "2025-10-08T11:00:02.201664Z" │
├───────────────────────────────┤
│ "2025-10-08T11:00:02.201744Z" │
├───────────────────────────────┤
│ "2025-10-08T11:00:02.207683Z" │
└───────────────────────────────┘


SELECT timestamp, json_payload
     FROM `test_table`
     WHERE timestamp > Timestamp("2025-10-08T11:00:02.193382Z")
     ORDER by timestamp ASC
     limit 5;
┌───────────────────────────────┬──────────────┐
│ timestamp                     │ json_payload │
├───────────────────────────────┼──────────────┤
│ "2025-10-08T11:00:02.193445Z""{...}"   │
├───────────────────────────────┼──────────────┤
│ "2025-10-08T11:00:02.193445Z""{...}"   │
├───────────────────────────────┼──────────────┤
│ "2025-10-08T11:00:02.193858Z""{...}"   │
├───────────────────────────────┼──────────────┤
│ "2025-10-08T11:00:02.201664Z""{...}"   │
├───────────────────────────────┼──────────────┤
│ "2025-10-08T11:00:02.201744Z""{...}"   │
└───────────────────────────────┴──────────────┘

Обратите внимание на дублирующийся timestamp. Так же могут побиться данные в других колонках, если их читать с json_payload

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions