我有这样的更新查询:
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%。
现在的问题是:如果我将DTU扩展到500,我的更新查询可以运行得更快吗?
答案 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资源不足引起的,或者可能与以下情况之一有关:
最后,如果没有可提高数据库性能的可操作项目,则可以更改Azure SQL数据库中的可用资源量。您可以通过更改单个数据库的DTU服务层来分配更多资源,也可以随时增加弹性池的eDTU。
正如Clay所说,为了获得更好的性能和降低成本,Azure还提供了一些建议来帮助您提高性能。这些建议之一是优化查询。 有关更多详细信息,请参见:Monitoring and performance tuning。
希望对您有帮助。