在很大的SQL表上的简单UPDATE查询

时间:2019-03-09 14:35:43

标签: performance azure tsql azure-sql-database

我有这样的更新查询:

getAchievements = () => {
    fetch(url + '/achievements', {
      method: 'get',
      headers: {
        Accept: 'application/json',
        'Content-type': 'application/json'
      }
    })
    .then((data) => data.json())
    .then((data) => {
      this.props.addData({
        achievements: data.achievements
      })

      if(this.props.store.achievements.length > 0) {
        this.setState({
          showAchievementModal: true
        })
      }
    })
    .catch((error) => {
      console.error(error)
    })
}

我的表格包含超过300百万行。我已将250个DTU的Azure SQL数据库设置为render() { return ( {this.state.showAchievementModal && <Modal animationType={'fade'} visible={this.props.store.isModalAchievementVisible} > {this.props.store.achievements.map((data,index)=>{ return( <View key={index}> <View style={styles.container}> <Text>{data.title}</Text> <Text>{data.description}</Text> <TouchableOpacity onPress={this.closeModal}> <Text>Collect</Text> </TouchableOpacity> </View> </View> ) })} </Modal> } ) } 。如图所示,DTU使用率几乎保持70%。

enter image description here

现在的问题是:如果我将DTU扩展到500,我的更新查询可以运行得更快吗?

2 个答案:

答案 0 :(得分:3)

如果您正在堆上运行(没有聚集索引),那么您正在执行的操作是扫描多达300M的行,以尝试查找前100k行以根据您的条件进行更新。然后,您可能会多次执行此操作。您也可以将行也缓存到tempdb中。

如果您在where子句中的列上的聚集索引上运行,则将对要更新的子集进行范围扫描(效率更高)。请考虑尝试一下。

您当前的查询要么是cpu绑定(如果页面适合内存),要么是io绑定(如果页面不适合)。无论哪种情况,增加dtu都会有助于提高查询性能。但是,如果下一步解决查询性能中的算法问题,您会感到更高兴。

答案 1 :(得分:1)

1。如果我将DTU扩展到500,可以更新查询运行得更快吗?

是的,可以。

但是,为了让客户考虑,Azure SQL数据库不建议您直接扩展DTU以提高数据库的性能。请参考:Improving database performance with more resources

摘要:

作为一般准则,如果您的CPU利用率始终保持在80%或以上,则您会遇到与运行相关的性能问题。如果您遇到与运行有关的问题,则可能是由于CPU资源不足引起的,或者可能与以下情​​况之一有关:

  1. 正在运行的查询太多
  2. 编译查询太多
  3. 一个或多个执行查询正在使用次优查询计划

最后,如果没有可提高数据库性能的可操作项目,则可以更改Azure SQL数据库中的可用资源量。您可以通过更改单个数据库的DTU服务层来分配更多资源,也可以随时增加弹性池的eDTU。

正如Clay所说,为了获得更好的性能和降低成本,Azure还提供了一些建议来帮助您提高性能。这些建议之一是优化查询。 有关更多详细信息,请参见:Monitoring and performance tuning

希望对您有帮助。