
# DWS中单表查询性能与哪些因素有关？
DWS采用Shared-nothing架构，数据是被分布式存储，因此分布键设计、单表存储数据量、分区数量都会影响单表的整体查询性能。
1. 分布键设计 DWS默认会选择主键的第一列作为分布键。如果同时设置主键和分布键，则主键必须包含分布键。分布键决定了数据在各个节点之间的分布情况，如果分布键很好地分布在各个分区中，则可以使查询性能变得更好。
   分布列选择不当，在数据导入后有可能出现数据分布倾斜，进而导致某些磁盘的使用明显高于其他磁盘，极端情况下会导致集群只读。合理的选择分布键，对表查询的性能至关重要。此外，合适的分布键还可以使数据的索引更快地创建和维护。
   
2. 单表存储数据量 单表存储的数据量越大，查询性能就越差。当表中的数据量很大时，则需要考虑将数据进行分区存储。普通表若要转成分区表，需要新建分区表，然后把普通表中的数据导入到新建的分区表中。因此在初始设计表时，请根据业务提前规划是否使用分区表。
   对表进行分区，一般需要遵循以下原则：
   - 使用具有明显区间性的字段进行分区，比如日期、区域等字段。
   
   - 分区名称应当体现分区的数据特征。比如关键字+区间特征。
   
   - 将分区上边界的分区值定义为MAXVALUE，以防止可能出现的数据溢出。
    
3. 分区数量 利用分区，可以将表和索引划分为一些更小、更易管理的单元。大幅减少搜索空间，从而提升访问性能。
   使用分区数量会影响查询的性能。如果分区数量太小，则可能会使查询性能下降。
   DWS支持范围分区（Range Partitioning）和列表分区（List Partitioning）功能，即根据表的一列或者多列，将要插入表的记录分为若干个范围（这些范围在不同的分区里没有重叠），然后为每个范围创建一个分区，用来存储相应的数据。其中，列表分区（List Partitioning）仅8.1.3及以上集群版本支持。
   
因此，在设计数据仓库时，需要考虑这些因素并进行实验来确定最佳设计方案。
