Morteza Fathollahi
05/27/2026, 10:45 PM(datetime_column, transaction_id). Given that transaction_id has very high cardinality, is rarely used in WHERE filters, but is heavily used in JOIN operations, does placing it as the second column in the Sort Key improve JOIN performance regardless of whether the datetime column is filtered or not? Or, for optimal JOIN performance, is it a better practice to remove it from the Sort Key entirely and use it exclusively as the Hash Distribution Key (DISTRIBUTED BY HASH(transaction_id))?Rocky
05/27/2026, 10:46 PMtransaction_id is the second column in your Sort Key (datetime_column, transaction_id), the Prefix Index for transaction_id only works if the first column (datetime_column) is also present as an equality filter in your WHERE clause.
* Sequential Scans: While sorting by transaction_id might theoretically provide slightly better sequential access during the scan stage, this benefit is negligible compared to the overhead of joining.
2. Is Distribution the better practice for JOINs?
Yes, absolutely. For optimal JOIN performance, the Hash Distribution Key is the most important factor.
* Colocate Join: If you distribute both joining tables by transaction_id and place them in the same Colocation Group (PROPERTIES("colocate_with" = "group_name")), StarRocks can perform a Colocate Join. This is the fastest join method because it avoids all network traffic; the data is joined locally on each node.
* Bucket Shuffle Join: Even if only the larger table is distributed by transaction_id, StarRocks can perform a Bucket Shuffle Join, which significantly reduces network overhead by shuffling only the smaller table to the nodes where the larger table's buckets reside.
Recommendations
* Distribution Key: Use DISTRIBUTED BY HASH(transaction_id). This is the single most effective way to optimize joins on high-cardinality keys.
* Sort Key: Keep the Sort Key focused on your filtering patterns. Since transaction_id is rarely used in WHERE filters, it should likely be removed from the Sort Key or placed last. Focus the Sort Key on datetime_column (and any other frequently filtered columns) to enable effective Zone Map pruning and Prefix Indexing.
* Compound Key Order: If you do keep transaction_id in the Sort Key, remember that it only helps with scanning if datetime_column is filtered first. If you often query transaction_id without filtering by time, it would need to be the first column to provide any indexing benefit.
Summary: To optimize for your "heavily joined" requirement, use transaction_id as your Distribution Key and potentially a Colocation Group. Use the Sort Key exclusively for columns that appear in your WHERE clauses.
References
• best_practices/table_clustering.md
• knowledge/usage/best-practice.md