对于截断表和UPDATE统计信息感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍截断表sql,并为您提供关于asp.net-mvc–MVC5中的TryUpdate()和Update()方法有什么
对于截断表和UPDATE统计信息感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍截断表sql,并为您提供关于asp.net-mvc – MVC 5中的TryUpdate()和Update()方法有什么区别吗?、hibernate save和update以及saveOrUpdate区别、Mybatis-Plus中update()和updateById()将字段更新为null、MySQL 5.6为什么关闭元数据统计信息自动更新&统计信息收集源代码探索的有用信息。
本文目录一览:- 截断表和UPDATE统计信息(截断表sql)
- asp.net-mvc – MVC 5中的TryUpdate()和Update()方法有什么区别吗?
- hibernate save和update以及saveOrUpdate区别
- Mybatis-Plus中update()和updateById()将字段更新为null
- MySQL 5.6为什么关闭元数据统计信息自动更新&统计信息收集源代码探索
截断表和UPDATE统计信息(截断表sql)
调用截断表后我们是否需要更新表统计信息,或者它会自动更新?
问:截断一个表后,我们需要调用“ UPDATE STATISTICS”吗?
答案1
小编典典在再次需要统计信息之前,统计信息不会自动更新。aka,TRUNCATE不会这样做。所以不行”。
最初的答案是“是”,因为它不是TRUNCATE的一部分是自动的。这取决于您如何阅读问题:-)
请记住,查询需要时,统计信息会自动更新(例如,行数更改)。来自BOL的“索引统计信息”
每当查询执行计划中使用的统计信息未能通过当前统计信息的测试时,就会启动统计信息更新。
一种使用STATS_DATE进行验证的方法…
SELECT name AS index_name, STATS_DATE(object_id, index_id)FROM sys.indexes WHERE object_id = OBJECT_ID(''MyTruncatedTable'')
编辑 :我想确保我:-)
您会看到统计信息仅由SELECT语句更新,而不由INSERT,DELETE或TRUNCATE更新
IF OBJECT_ID(''dbo.foo'') IS NOT NULL DROP TABLE dbo.fooCREATE TABLE dbo.foo ( bar int NOT NULL IDENTITY (1, 1) PRIMARY KEY, thing int NOT NULL)CREATE INDEX IX_thing ON dbo.foo (thing)INSERT dbo.foo (thing) SELECT c1.object_id FROM sys.columns c1, sys.columns c2SELECT name AS index_name, STATS_DATE(object_id, index_id) AS AfterLoadFROM sys.indexes WHERE object_id = OBJECT_ID(''dbo.foo'')SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESCSELECT name AS index_name, STATS_DATE(object_id, index_id) AS AfterFirstQueryFROM sys.indexes WHERE object_id = OBJECT_ID(''dbo.foo'')DELETE TOP (50000) dbo.fooSELECT name AS index_name, STATS_DATE(object_id, index_id) AS AfterDeleteFROM sys.indexes WHERE object_id = OBJECT_ID(''dbo.foo'')SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESCSELECT name AS index_name, STATS_DATE(object_id, index_id) AS After2ndQueryFROM sys.indexes WHERE object_id = OBJECT_ID(''dbo.foo'')TRUNCATE TABLE dbo.fooSELECT name AS index_name, STATS_DATE(object_id, index_id) AS AfterTruncateFROM sys.indexes WHERE object_id = OBJECT_ID(''dbo.foo'')SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESCSELECT name AS index_name, STATS_DATE(object_id, index_id) AS After3rdQueryFROM sys.indexes WHERE object_id = OBJECT_ID(''dbo.foo'')
asp.net-mvc – MVC 5中的TryUpdate()和Update()方法有什么区别吗?
提前致谢
解决方法
如果存在任何绑定错误,TryUpdateModel不会抛出异常,而是将错误记录在模型状态字典中,您可以使用ModelState.IsValid属性进行检查.
这里很好解释 –
http://codetunnel.io/aspnet-mvc-tryupdatemodel-vs-updatemodel/
hibernate save和update以及saveOrUpdate区别
save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象。
update()如果是对一个已经存在的托管对象进行更新那么肯定是要使用update()方法了,数据中有这个对象。
saveOrUpdate()这个方法是更新或者插入,有主键就执行更新,如果没有主键就执行插入。
区别:对于一个从托管状态到瞬态的对象(对于一个从数据库中取出来又被删除的对象),这个对象本身是有主键的,但是因为被删除了,所以这个时候因为数据库中已经没有了这条记录了。不过它还有主键存在,所以这个时候不可以使用update()或者是saveOrUpdate(),因为update()方法是认为数据库中肯定有这条记录的,而saveOrUpdate的执行过程就是先查看这个对象是不是有主键,有主键那么就执行update()方法,没有主键就执行save()方法,因此结果跟调用了update()方法的效果是一样的,结果就会出错,因为这个对象已经被删除了,数据库中已经没有这条记录了,只是它还有主键而已(仅仅是存在于内存中),因此这个时候要执行的是save()方法。
Mybatis-Plus中update()和updateById()将字段更新为null
简介
说明
本文介绍Mybatis-Plus无法将字段更新为null的原因及解决方法。
问题描述
用Mybatis-Plus的update()或者updateById()来更新数据时,无法将字段设置为null值(更新后数据还是原来的值)。
原因
概述
默认情况下,Mybatis-Plus在更新时会判断字段是否为null,如果是null,则不设值(不将这个字段拼接为SQL的SET语句)。
源码分析
字段策略的源码:com.baomidou.mybatisplus.annotation.FieldStrategy
package com.baomidou.mybatisplus.annotation; /** * 字段策略枚举类 */ public enum FieldStrategy { /** * 忽略判断 */ IGNORED, /** * 非NULL判断 */ NOT_NULL, /** * 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断) */ NOT_EMPTY, /** * 默认的,一般只用于注解里 * <p>1. 在全局里代表 NOT_NULL</p> * <p>2. 在注解里代表 跟随全局</p> */ DEFAULT, /** * 不加入 SQL */ NEVER }
可以看到,FieldStrategy.DEFAULT:默认等于FieldStrategy.NOT_NULL,也就是:字段不为Null时才拼接SQL。
所有策略
实际上,Mybatis-Plus在增删改查时默认对Null等情况都进行了判断。
源码里的注释已经很清楚了,本处不再赘述。源码位置:com.baomidou.mybatisplus.annotation.TableField
package com.baomidou.mybatisplus.annotation; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.mapping.ResultMapping; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import org.apache.ibatis.type.UnknownTypeHandler; import java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) public @interface TableField { // 其他代码 /** * 字段验证策略之 insert: 当insert操作时,该字段拼接insert语句时的策略 * <p> * IGNORED: 直接拼接 insert into table_a(column) values (#{columnProperty}); * NOT_NULL: insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>) * NOT_EMPTY: insert into table_a(<if test="columnProperty != null and columnProperty!=''''">column</if>) values (<if test="columnProperty != null and columnProperty!=''''">#{columnProperty}</if>) * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL * * @since 3.1.2 */ FieldStrategy insertStrategy() default FieldStrategy.DEFAULT; /** * 字段验证策略之 update: 当更新操作时,该字段拼接set语句时的策略 * <p> * IGNORED: 直接拼接 update table_a set column=#{columnProperty}, 属性为null/空string都会被set进去 * NOT_NULL: update table_a set <if test="columnProperty != null">column=#{columnProperty}</if> * NOT_EMPTY: update table_a set <if test="columnProperty != null and columnProperty!=''''">column=#{columnProperty}</if> * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL * * @since 3.1.2 */ FieldStrategy updateStrategy() default FieldStrategy.DEFAULT; /** * 字段验证策略之 where: 表示该字段在拼接where条件时的策略 * <p> * IGNORED: 直接拼接 column=#{columnProperty} * NOT_NULL: <if test="columnProperty != null">column=#{columnProperty}</if> * NOT_EMPTY: <if test="columnProperty != null and columnProperty!=''''">column=#{columnProperty}</if> * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL * * @since 3.1.2 */ FieldStrategy whereStrategy() default FieldStrategy.DEFAULT; }
设置为null的方案
需求:根据用户id,设置userName(用户名),并将nickName(昵称)设置为null。
方案1:使用UpdateWrapper更新
@Autowired private UserService userService; @ApiOperation("修改") @PostMapping("/edit") public void edit(User user) { userService.lambdaUpdate() .eq(User::getId, user.getId()) .set(User::getUserName, user.getUserName()) .set(User::getNickName, null) .update(); }
方案2:设置全局的field-strategy(不推荐)
application.yml
mybatis-plus: global-config: # 字段策略 0:忽略判断,直接拼SQL, 1:非NULL, 2:非空,3:默认;4:永远不加入SQL field-strategy: 0
注意
这是全局配置,会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null,可能会影响其他业务数据的正确性。
所以,尽量不要用此法。
方案3:设置某个字段的field-strategy
方法
只在需要更新为null的字段上,设置忽略策略,如下:
/** * 昵称 */ @TableField(strategy = FieldStrategy.IGNORED) private String nickName;
更新的方法:
@Autowired private UserService; @ApiOperation("修改") @PostMapping("/edit") public void edit(Long id) { User user = new User(); user.setId(id); user.setNickName(null); userService.lambdaUpdate() .eq(User::getId, user.getId()) .update(user); }
注意
不同的业务对字段的需求可能不一样,将字段指定为忽略判断(直接拼SQL)可能会影响其他业务。
所以,此方法也不推荐。
参考文章
【Mybatis-Plus】使用updateById()、update()将字段更新为null
mybatis-plus更新字段的时候设置为null,忽略实体null判断
到此这篇关于Mybatis-Plus中update()和updateById()将字段更新为null的文章就介绍到这了,更多相关Mybatis-Plus 字段更新为null内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- 解决mybatisPlus null 值更新的问题
- Mybatis-Plus使用updateById()、update()将字段更新为null
- MybatisPlus 不修改全局策略和字段注解如何将字段更新为null
- mybatis-plus更新字段为null的处理方式
MySQL 5.6为什么关闭元数据统计信息自动更新&统计信息收集源代码探索
问题描述:MySQL5.5.15原sql如下:selectconstraint_schema,table_name,constraint_name,constraint_typefrominformation_schema.table_constraintswheretable_s
./storage/innobase/row/row0mysql.c
/*********************************************************************//** Updates the table modification counter and calculates new estimates for table and index statistics if necessary. */ UNIV_INLINE void row_update_statistics_if_needed( /*============================*/ dict_table_t* table) /*!stat_modified_counter; table->stat_modified_counter = counter + 1; /* Calculate new statistics if 1 / 16 of table has been modified since the last time a statistics batch was run, or if stat_modified_counter > 2 000 000 000 (to avoid wrap-around). We calculate statistics at most every 16th round, since we may have a counter table which is very small and updated very often. */ if (counter > 2000000000 || ((ib_int64_t)counter > 16 + table->stat_n_rows / 16)) { dict_update_statistics(table, FALSE /* update even if stats are initialized */); } }---------------------------------------------------------------------------
#通过更新统计信息stat_modified_counter,每个表都有这个表里来维护:
./storage/innobase/row/row0mysql.c
/*********************************************************************//** Updates the table modification counter and calculates new estimates for table and index statistics if necessary. */ UNIV_INLINE void row_update_statistics_if_needed( /*============================*/ dict_table_t* table) /*!stat_modified_counter; table->stat_modified_counter = counter + 1; if (DICT_TABLE_CHANGED_TOO_MUCH(table)) { dict_update_statistics( table, FALSE, /* update even if stats are initialized */ TRUE /* only update if stats changed too much */); } } /*********************************************************************/规则:每一次DML操作导致1 行更新,stat_modified_counter加1,直到满足更新统计信息的条件,stat_modified_counter的值自动重置为0。
#更新统计信息的条件:(有超过1/16的row被更改过会更新表的条件信息)
./storage/innobase/include/dict0dict.h
/** Calculate new statistics if 1 / 16 of table has been modified since the last time a statistics batch was run. We calculate statistics at most every 16th round, since we may have a counter table which is very small and updated very often. @param t table @return true if the table has changed too much and stats need to be recalculated */ #define DICT_TABLE_CHANGED_TOO_MUCH(t) \ ((ib_int64_t) (t)->stat_modified_counter > 16 + (t)->stat_n_rows / 16) /*********************************************************************/* 这样有个性能问题,若有多个线程同时检测到阈值,也即是并发调用会多次,,会导致dict_update_statistics函数多次的调用,浪费了系统资源。
解决方法:在dict_update_statistics{}函数对stat_modified_counter加锁,避免并发执行。
#统计新跟更新函数:dict_update_statistics
今天关于截断表和UPDATE统计信息和截断表sql的分享就到这里,希望大家有所收获,若想了解更多关于asp.net-mvc – MVC 5中的TryUpdate()和Update()方法有什么区别吗?、hibernate save和update以及saveOrUpdate区别、Mybatis-Plus中update()和updateById()将字段更新为null、MySQL 5.6为什么关闭元数据统计信息自动更新&统计信息收集源代码探索等相关知识,可以在本站进行查询。
本文标签: