ByteCard: Enhancing ByteDance's Data Warehouse with Learned Cardinality Estimation
<|reference_start|>ByteCard: Enhancing ByteDance's Data Warehouse with Learned Cardinality Estimation: Cardinality estimation is a critical component and a longstanding challenge in modern data warehouses. ByteHouse, ByteDance's cloud-native engine for extensive data analysis in exabyte-scale environments, serves numerous internal decision-making business scenarios. With the increasing demand for ByteHouse, cardinality estimation becomes the bottleneck for efficiently processing queries. Specifically, the existing query optimizer of ByteHouse uses the traditional Selinger-like cardinality estimator, which can produce substantial estimation errors, resulting in suboptimal query plans. To improve cardinality estimation accuracy while maintaining a practical inference overhead, we develop a framework ByteCard that enables efficient training and integration of learned cardinality estimators. Furthermore, ByteCard adapts recent advances in cardinality estimation to build models that can balance accuracy and practicality (e.g., inference latency, model size, training overhead). We observe significant query processing speed-up in ByteHouse after replacing the existing cardinality estimator with ByteCard for several optimization scenarios. Evaluations on real-world datasets show the integration of ByteCard leads to an improvement of up to 30% in the 99th quantile of latency. At last, we share our valuable experience in engineering advanced cardinality estimators. This experience can help ByteHouse integrate more learning-based solutions on the critical query execution path in the future.<|reference_end|>
@article{han2024bytecard:,
    title={ByteCard: Enhancing ByteDance's Data Warehouse with Learned Cardinality
  Estimation},
    author={Yuxing Han, Haoyu Wang, Lixiang Chen, Yifeng Dong, Xing Chen, Benquan
  Yu, Chengcheng Yang, Weining Qian},
    journal={arXiv preprint arXiv:2403.16110},
    year={2024},
    archivePrefix={arXiv},
    eprint={2403.16110},
    primaryClass={cs.DB}
}