summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-dyu <[email protected]>2025-09-01 06:27:54 +0300
committera-dyu <[email protected]>2025-09-01 06:43:52 +0300
commite44dac19e07f144fdf5735a58cbeb4d108ba7993 (patch)
treeb2b5cc91b65bdad2c061fbdb1569cc4432f7175d
parent636f7611b6129d7340bc59a7c5503d4d54c6d299 (diff)
CHYT-636: Add minmax optimization with columnar statistics
* Changelog entry Type: feature Component: ytserver-clickhouse Add optimization for better performance with min/max queries using columnar statistics from nodes. commit_hash:e6d4f4e5fa25d5411a35c6e91780a364499740b7
-rw-r--r--yt/yt/client/table_client/columnar_statistics.cpp9
-rw-r--r--yt/yt/client/table_client/columnar_statistics.h2
2 files changed, 6 insertions, 5 deletions
diff --git a/yt/yt/client/table_client/columnar_statistics.cpp b/yt/yt/client/table_client/columnar_statistics.cpp
index 0b8904c2277..d14d8c66d34 100644
--- a/yt/yt/client/table_client/columnar_statistics.cpp
+++ b/yt/yt/client/table_client/columnar_statistics.cpp
@@ -28,31 +28,30 @@ TNamedColumnarStatistics& TNamedColumnarStatistics::operator+=(const TNamedColum
namespace {
-constexpr size_t MaxStringValueLength = 100;
constexpr auto NullUnversionedValue = MakeNullValue<TUnversionedValue>();
//! Approximates long string values with shorter but lexicographically less ones. Other values are intact.
TUnversionedOwningValue ApproximateMinValue(TUnversionedValue value)
{
- if (value.Type != EValueType::String || value.Length <= MaxStringValueLength) {
+ if (value.Type != EValueType::String || value.Length <= TColumnarStatistics::MaxStringValueLength) {
value.Flags = EValueFlags::None;
value.Id = 0;
return value;
}
- return MakeUnversionedStringValue(value.AsStringBuf().SubString(0, MaxStringValueLength));
+ return MakeUnversionedStringValue(value.AsStringBuf().SubString(0, TColumnarStatistics::MaxStringValueLength));
}
//! Approximates long string values with shorter but lexicographically greater ones. Other values are intact.
TUnversionedOwningValue ApproximateMaxValue(TUnversionedValue value)
{
- if (value.Type != EValueType::String || value.Length <= MaxStringValueLength) {
+ if (value.Type != EValueType::String || value.Length <= TColumnarStatistics::MaxStringValueLength) {
value.Flags = EValueFlags::None;
value.Id = 0;
return value;
}
const char MaxChar = std::numeric_limits<unsigned char>::max();
- auto truncatedStringBuf = value.AsStringBuf().SubString(0, MaxStringValueLength);
+ auto truncatedStringBuf = value.AsStringBuf().SubString(0, TColumnarStatistics::MaxStringValueLength);
while (!truncatedStringBuf.empty() && truncatedStringBuf.back() == MaxChar) {
truncatedStringBuf.remove_suffix(1);
diff --git a/yt/yt/client/table_client/columnar_statistics.h b/yt/yt/client/table_client/columnar_statistics.h
index 27af62003b6..b1cea44c642 100644
--- a/yt/yt/client/table_client/columnar_statistics.h
+++ b/yt/yt/client/table_client/columnar_statistics.h
@@ -54,6 +54,8 @@ struct TLargeColumnarStatistics
//! TColumnarStatistics stores per-column statistics of data stored in a chunk/table.
struct TColumnarStatistics
{
+ static constexpr size_t MaxStringValueLength = 100;
+
//! Per-column total data weight for chunks whose meta contains columnar statistics.
std::vector<i64> ColumnDataWeights;
//! Total weight of all write and delete timestamps.