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 T
4     WHERE VG.UserID = t.UserID  AND VG.Grade>=28  ORDER BY VG.Grade DESC           --倒叙,高VIP等级优先获奖
5     SELECT @UserCount1=COUNT(UserID) FROM #TempTableOf28
1    DECLARE @StringUserID1 VARCHAR (max)
2    SET @StringUserID1=‘‘
3     IF EXISTS(SELECT  1 FROM  #TempTableOf28 ) AND @UserCount1<=1000  --VIP等级大于28,要么不足1000,要么直接取完,取完改@DrawCount=0,不再执行其他部分
4       SELECT  @StringUserID1=@StringUserID1+‘,‘+CAST(UserID AS VARCHAR) FROM #TempTableOf28
5     ELSE IF EXISTS(SELECT 1 FROM  #TempTableOf28 ) AND @UserCount1>1000
6       SELECT TOP 1000  @StringUserID1=@StringUserID1+‘,‘+CAST(UserID AS VARCHAR) FROM #TempTableOf28

小结:有四种情况需要创建四个临时表,判断结构中直接把相应的部分转换为字符串结构。

方案二:不使用临时表,优化判断结构

 1 IF (SELECT COUNT(1) FROM @vip)<=1000
 2     INSERT INTO @UsersLast
 3     SELECT UserID FROM @vip
 4 ELSE IF (SELECT COUNT(1) FROM @vip WHERE Vip>=28)>=1000
 5     INSERT INTO @UsersLast
 6     SELECT TOP 1000 UserID FROM @vip WHERE vip>=28
15 ELSE
16     INSERT INTO @UsersLast
17     SELECT TOP 1000 UserID FROM @vip
18     ORDER BY vip DESC

小结:直接写入表,判断结构清晰,最后再将相关表直接转换为符合要求的类型。

总结:两种方式均可完成需求,但第一种不仅仅大量使用临时表,而且产生大量重复代码,代码整合度也很低。从接口整体情况来看,第一种方案的代码是第二种的三倍之多。效率相比可见一斑。so,优化之路路漫漫其修远兮~

原文地址:https://www.cnblogs.com/zhangrenzhi/p/8797038.html

时间: 2024-10-15 03:02:50

SQL 优化实战的相关文章

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

最近在优化日结存储过程,日结存储过程中大概包含了20多个存储过程. 发现其有一个存储过程代码有问题,进一步发现结存的数据中有一个 日期字段business_date 是有问题的,这个字段对应的类型是varchar,但是存储过程传入参数的类型是char,导致最后结存进去的数据末尾多了几个空格. 比如,应该是'2016-12'的,但现在是'2016-12  '. 为了解决这个问题,要修改这个字段的值,去掉尾部的空格,于是运行如下语句: [sql] view plain copy print? upd

工作中遇到的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至关重要,那么sql到底如何优化呢? SQL优化方案: 1. sql中索引的使用技巧: (1) 对于多列索引(复合索引),sql查询条件只有使用了最左边的列,索引才会生效. (2) 对于like模糊查询,模糊匹配的字符串最前面禁止使用%._等模糊匹配器的字符,否则索引将失效,如果最前面必须要用到模糊匹配,

面向.Net程序员的后端性能优化实战

最近2个月没做什么新项目 完全是对于旧的系统进行性能优化 避免超时 死锁 数据处理能力不够等常见的性能问题 这里不从架构方面出发 毕竟动大手脚成本比较高 那么我们以实例为前提 从细节开始 优化角度 一.业务逻辑优化 二.DB优化 三.数据处理优化 四.锁与性能 五.cpu飙高小结 六.crash现象分析 业务逻辑优化 这一条不具有普遍性 不同的业务不同的场景 如果归纳起来 就是在不影响业务的前提下进行流程精简 1. 废弃冗余逻辑 常见于各种基于数据库的检查 很多同学在维护别人代码的时候 没有深入

MySQL——索引优化实战

上篇文章中介绍了索引的基本内容,这篇文章我们继续介绍索引优化实战.在介绍索引优化实战之前,首先要介绍两个与索引相关的重要概念,这两个概念对于索引优化至关重要. 本篇文章用于测试的user表结构: 索引相关的重要概念 基数 单个列唯一键(distict_keys)的数量叫做基数. SELECT COUNT(DISTINCT name),COUNT(DISTINCT gender) FROM user; user表的总行数是5,gender 列的基数是 2,说明 gender 列里面有大量重复值,n

史上最全的MySQL高性能优化实战总结!

1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已. 今天给大家体验MySQL的优化实战,助你高薪之路顺畅.图 - MySQL查询过程 1.2 优化的哲学 优化有风险,涉足需谨慎 1.2.1 优化可能带来的问题 1.2.2 优化的需求1.2.3 优化由谁参与 在进

MySQL高性能优化实战总结

from:http://database.51cto.com/art/201809/583620.htm 1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已. 今天给大家体验MySQL的优化实战,助你高薪之路顺畅. 图 - MySQL查询过程 1.2 优化的哲学

蚂蚁金服架构师带你深入性能优化一MySql性能优化实战

概要: Mysql的优化,大体可以分为三部分:索引的优化,sql语句的优化,表的优化.本文主要帮助自己整理思路,也可作为一个学习MySQL优化的提纲. 索引的优化 只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引 尽量使用短索引,如果可以,应该制定一个前缀长度 对于经常在where子句使用的列,最好设置索引,这样会加快查找速度 对于有多个列where或者order by子句的,应该建立复合索引 对于like语句,以%或者'-'开头的不会使用索

sql优化

1.all: 全表扫描,遍历全表找到匹配的行 index:索引全扫描,遍历整个索引来查询匹配的行 range:索引范围扫描,常见于<,>,>=,between等操作符 ref: 使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行 eq_ref:类似ref,区别就是使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配.简单来说,就是多表连接中使用primary key或者unique index 作为关联条件 const/system:单表中最多有一个匹配行,查询起