数据库字段数据类型对索引的影响
2017-03-06 15:41
387 查看
这两天做一个数据更新工作,并把它做成每天定时任务。差不多有每天有个7w的量。写完后,一运行,总是遇见CPU爆满的情况,如下图。
接下来就开始查找原因,首先检查了一下,哪些语句使用CPU较高。
但是分析了一下, 我已经对查询的字段加上了索引,但是好像不起作用啊 。
最终发现是这个样子的,我在声明变量@Member的时候,用的是bigint,而原来的数据库中的字段是nvarchr。
之后,我把@Member的字段的类型也改成了nvarchar,再执行,cpu一下子降了下来。
结论
当SQL 传递参数与表索引字段类型不一致的时候,数据库将自动进行数据类型转换,这时就不会使用到索引,而是使用全表扫描,从而导致了CPU 和I/O 都开销很大,今天又算印证这个真理了。
接下来就开始查找原因,首先检查了一下,哪些语句使用CPU较高。
SELECT TOP 10 TEXT AS 'SQL Statement' ,last_execution_time AS 'Last Execution Time' ,(total_logical_reads + total_physical_reads + total_logical_writes) / execution_count AS [Average IO] ,(total_worker_time / execution_count) / 1000000.0 AS [Average CPU Time (sec)] ,(total_elapsed_time / execution_count) / 1000000.0 AS [Average Elapsed Time (sec)] ,execution_count AS "Execution Count",qs.total_physical_reads,qs.total_logical_writes ,qp.query_plan AS "Query Plan" FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) st CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp ORDER BY total_elapsed_time / execution_count DESC
但是分析了一下, 我已经对查询的字段加上了索引,但是好像不起作用啊 。
最终发现是这个样子的,我在声明变量@Member的时候,用的是bigint,而原来的数据库中的字段是nvarchr。
之后,我把@Member的字段的类型也改成了nvarchar,再执行,cpu一下子降了下来。
结论
当SQL 传递参数与表索引字段类型不一致的时候,数据库将自动进行数据类型转换,这时就不会使用到索引,而是使用全表扫描,从而导致了CPU 和I/O 都开销很大,今天又算印证这个真理了。
相关文章推荐
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
- Android 数据库创建字段时的数据类型
- ADO 访问数据库 存取image类型字段数据 源代码
- JDBC数据类型与数据库字段对应表——mysql篇
- SQL SERVER 2008数据库的表中修改字段的数据类型后,不能保存
- 得到数据库中所有用户表的字段、数据类型
- PHP以指定字段为索引返回数据库所取的数据数组
- 更新数据库所有表的某一个指定字段 ,附加对‘将 varchar 值转换为数据类型为 int 的列时发生语法错误’处理方法
- sql 数据库中 查询所有的数据表,字段,数据类型,长度
- SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
- 怎样得到数据库中某一个表的某一个字段在设计时候的数据类型
- 查询数据库中的表,返回字段相对应的数据类型!
- 数据库中字段类型对应的C#中的数据类型
- HubbleDotNet 开源全文搜索数据库项目--数据表的数据类型和索引类型
- SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
- Android 数据库创建字段时的数据类型
- JDBC数据类型与数据库字段对应表――SQL Server篇
- db4o数据库存放的class含有相同的字段名且字段的类型也相同。现在想把这个库中数据读出来,但总是报 java.lang.ClassCastException错误
- JDBC数据类型与数据库字段对应表――mysql篇
- ADO.NET中取得数据库字段的数据类型