sql优化实战:从1353秒到135秒(删除索引+修改数据+重建索引)

最近在优化日结存储过程,日结存储过程中大概包含了20多个存储过程。

发现其有一个存储过程代码有问题,进一步发现结存的数据中有一个 日期字段business_date 是有问题的,这个字段对应的类型是varchar,但是存储过程传入参数的类型是char,导致最后结存进去的数据末尾多了几个空格。

比如,应该是‘2016-12‘的,但现在是‘2016-12  ‘。

为了解决这个问题,要修改这个字段的值,去掉尾部的空格,于是运行如下语句:

[sql] view plain copy print?

  1. update TB_CUSTOMER_FROZEN
  2. set BUSINESS_DATE = rtrim(BUSINESS_DATE)
update TB_CUSTOMER_FROZEN
set BUSINESS_DATE = rtrim(BUSINESS_DATE)

运行结果:

(10483163 row(s) affected)

数据量1000w左右,运行时间22分33秒,也就是1253秒,真的是太慢了。。。

这么慢肯定是有原因的。

于是看了一下原来表中有2个索引,一个聚集索引(business_date字段),一个非聚集索引(也包含了business_date字段),相当于每次修改数据的同时也要修改索引值,这才是慢的原因。

想想,可以先删除索引,然后更新数据,在重建索引,最后总耗时:6秒+1分29秒+60秒 = 135秒。

总结:

这个快的原因是批量化操作,不是每次修改一条数据就去修改索引,而是删除索引,这样修改数据也不会涉及到索引,然后批量修改数据,之后重建索引也是一个批量化的操作,所以速度才快的。

时间: 2024-10-13 08:41:25

sql优化实战:从1353秒到135秒(删除索引+修改数据+重建索引)的相关文章

实战:mysql统计指定架构的所有表的数据和索引大小情况

#统计指定架构的所有表的数据和索引大小情况 #tablesize.sh #!/bin/sh #[email protected] if [ "$#" -gt 2 ];then echo "**********************************" echo "too many input parameters" echo "**********************************" echo "

Sql Server 在已知表中插入、删除、修改某一列操作

--1.向已有表中增加一列 ALTER TABLE TableName ADD ColumnName VARCHAR(20) NULL --2.删除表中的某一列 ALTER TABLE TableName DROP COLUMN ColumnName --3.修改某一列的数据类型 ALTER TABLE TableName ALTER COLUMN ColumnName INT 2.查询当年或者当月的数据 1.查询当年的数据 SELECT * FROM UserInfo WHERE YEAR(R

SQL Server通过整理索引碎片和重建索引提高速度

SQL Server数据库操作中,当数据库中的记录比较多的时候,我们可以通过索引来实现查询.但是当索引碎片太多的时候,就会很严重地影响到查询的速度.这时候我们可以采取两种方法来解决:一种时整理索引碎片,另一种是重建索引.本文主要介绍了这一过程,接下来就让我们来一起了解一下吧. 检查索引碎片DBCC SHOWCONTIG(表),得到如下结果: DBCC SHOWCONTIG 正在扫描 'A' 表... 表: 'A'(884198200):索引 ID: 1,数据库 ID: 13 已执行 TABLE 

SQL 优化实战

背景:从一堆用户中取出部分符合要求用户的ID转化为字符串并排形式,假设共取1000个. 方案一:新建临时表,在对临时表数据进行操作.总共有4中情况,需要创建四次临时表,多次判断 1 DECLARE @UserCount1 INT --VIP等级大于28的用户数 2 SELECT T.UserID INTO #TempTableOf28 3 FROM GAMECENTERLINKEDSERVER.GameCenter.LevelSystem.VIP_UserGrade VG ,#TempTable

PHP7实战开发简单CMS内容管理系统(10)删除单个栏目数据

1数据库操作函数 function sql_excute($sql){ $conn=sql_conn(); $query = mysqli_query($conn,$sql); if(!$query) { return false; }//数据库操作影响行数 $affected_rows = mysqli_affected_rows($conn); mysqli_close($conn); return $affected_rows; } 2.删除页面 <?phprequire_once ('.

转 sql 优化

1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试,比较两种查询的性能 SQL查询效率 step by step -- setp 1.-- 建表create table t_userinfo(userid int identity(1,1) primary key nonclustered,nick varchar(50) not null defa

工作中遇到的99%SQL优化,这里都能给你解决方案

前几篇文章介绍了mysql的底层数据结构和mysql优化的神器explain.后台有些朋友说小强只介绍概念,平时使用还是一脸懵,强烈要求小强来一篇实战sql优化,经过周末两天的整理和总结,sql优化实战新鲜出炉, 大家平时学习和工作中,遇到的90% 的sql优化都会介绍到,介意篇幅过长,分成3篇文章哈. CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFA

sql优化提速整理

sql优化提速整理 场景描述 在我们实际开发中,随着业务的不断增加,数据量也在不断的攀升,这样就离不开一个问题:数据查询效率优化 根据自己的以往实际项目工作经验和学习所知,现在对SQL查询优化做一个简单的梳理总结,总结的不好之处,望多多指点交流学习 主要通过以下几个点来进行总结分析:索引.语句本身.分区存储.分库分表 索引 在实际工作中,sql优化第一想到的应该就是索引,因为添加索引能够很直观的提升查询效率,但是在添加索引的时也不是越多多好,下面简单总结一下索引的实际使用 索引简介 关于索引的定

SQL Server 性能优化实战系列(二)

SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你看到表的记录如下图所示,你最先想到的是什么呢? (图1:数据列表) 你看到这些数据,是不是觉得这样的设计既浪费了存储空间,又使得这个列的索引增大,查询起来更慢,你也想使用一些其它的数据类型来代替这个datetime吧? 其实大家都是这么想的,这个方向是100%正确的,但是在写这篇文章以前,我进入了两