
# StarRocks数据查询规范
该章节主要介绍StarRocks数据查询时需遵循的规则和建议。
#### StarRocks数据查询规则
- 在数据查询业务代码中建议查询失败时进行重试，再次下发查询。
- **in**中常量枚举值超过1000后，必须修改为子查询。
- 禁止使用REST API（Statement Execution Action）执行大量SQL查询，该接口仅用于集群维护。
- query查询条件返回结果超过5万条，则使用JDBC Catalog或者OUTFILE方式导出查询数据，否则FE上大量数据传输将占用FE资源，影响集群稳定性。
  - 如果是交互式查询，建议使用分页方式（offset limit）导出数据，分页命令为Order by。
  
  - 如果数据导出提供给第三方使用，建议使用outfile或者export方式。
   
- 2个以上大于3亿的表JOIN使用Colocation Join。
- 亿级别大表禁止使用**select \*** 查询数据，查询时需明确要查询的字段。
  - 使用SQL Block方式禁止**select \***操作。
  
  - 如果是高并发点查询，建议开启行存储（StarRocks 2.x版本支持），并且使用PreparedStatement查询。
   
- 亿级以上表数据查询必须设置分区分桶条件。
- 禁止对分区表执行全分区数据扫描操作。
 
#### StarRocks数据查询建议
- 一次**insert into select** 数据超过1亿条后，建议拆分为多个**insert into select**语句执行，分成多个批次来执行。
- 不要使用OR作为JOIN条件。
- 不建议频繁的数据delete修改，将要删除的数据攒批，偶尔进行批量删除，且需要带上条件，提升系统稳定性和删除效率。
- 大量数据排序（5亿以上）后返回部分数据，建议先减少数据范围再执行排序，否则大量排序会影响性能。例如： 将**from table order by datatime desc limit** *10* 优化为**from table where datatime='** *2023-10-20* **' order by datatime desc limit** *10*。
  
- 查询任务性能调优参数**parallel_fragment_exec_instance_num** 使用注意事项：
  此参数是session级别设置，表示可并发执行的fragment数量，对CPU消耗较大，因此一般情况下不需要设置此参数。如果需要设置此参数来加速查询性能，必须遵循以下规则：
  - 切勿设置该参数为全局生效，禁止使用**set global**方式进行设置。
  
  - 设置参数值建议为偶数2或4（最大值不要超过单节点CPU核数的一半）。
  
  - 设置此参数值时需要观察CPU使用率，CPU使用率小于50%时方可考虑设置。
  
  - 如果查询SQL是**insert into select**大数据量的方式，不建议设置此参数。
   
 
