我们的服务器内存不足总是90%以上,在Task中需要

2019-08-31 作者:数据库   |   浏览(139)

Execute SQL Task能够执行带参数的SQL查询语句或存储过程(SP),通过SSIS的变量(Variable)对参数赋值。对于不同的Connection Manager,在Task中需要使用不同的符号(Parameter marker)来标记一个参数,并且在Parameter Mapping中设置参数名字(Parameter Name)。

 

SQL 基础知识梳理(四) - 数据更新

【博主】反骨仔    【原文】

图片 1

  

写在前面的故事

  首先,给看官们讲个故事:最近遇到过一个客户,系统上线三年变的越来越慢,直到前几个月全面爆发,系统前端使用人员不断抱怨,甚至已经达到了不能使用的程度。这个时候他们的IT主管也是决策者无法忍受这种情况,就召集下面的运维开会,询问情况。

  领导:现在系统这么慢,前端都无法使用了,到底什么情况?

  运维人员A:我们的服务器CPU压力太大,一直处于90%以上!

  运维人员B:我们的服务器内存不足总是90%以上!

  运维人员C:我们的磁盘速度跟不上了,换SSD会有很大提高!

  领导:啥都不行了?那我们换高配服务器!

  。。。。。。。。。。。。。。

  换了服务器,好了半个月又开始慢...和之前一样基本没有任何缓解...领导又召集运维人员开会。

 

  领导:服务器都换了,配置增加了一倍还多,为什么还慢?

  运维人员:我们需要做读写分离,做集群分担压力!

  运维人员:软件不行了,这个软件太差!

  领导:。。。。

 

  如果你是领导,那么你该如果决策呢? 如果你是运维人员,你会有上面的回答么?

  可能你看完会笑,认为这是不可能发生的故事,然而这个故事确实是真实的!反之如果这个故事中看到了自己,那么请仔细地往下看喽!

 

--------------博客地址---------------------------------------------------------------------------------------

Expert 诊断优化系列 

 

 

废话不多说,直接开整-----------------------------------------------------------------------------------------

 

在Execute SQL Task Editor中,设置Parameter Mapping的界面如下:

本文出处:

  这是《SQL 基础知识梳理(三) - 聚合和排序》的下篇。

 

数据库在系统中的角色

  这个可能不用多说,大家都知道,一般系统慢都是慢在后端,而后端主要慢在与数据库的交互!

  数据库可以理解成独立于你的系统,成为一个单独的系统。无论从数据库的物理设计,与前端的交互方式,自身的参数设置,索引的设计,维护方案等都影响着你整个系统中最慢的环节(可以说整个系统中数据库就是最慢的环节)!

  同样通过数据库的状态,也能很大程度上判定出你系统的问题到底在哪。尤其能界定清的一点就是软件真的慢么?软件设计的不好?还是数据库年久失修?

 

  • Variable Name:变量的名字,变量的作用域分为UserSystem,使用 :: 来引用作用域中的变量
  • Direction:参数的方向,分为输入参数(Input),输出参数(Output)和返回值(Returnvalue)
  • Data Type:参数的Data Type,必须和变量(Variable)的数据类型相兼容
  • Parameter Name:参数名字,不同的Connection Manager,其值不同,对于OLEDB Connection Manager,使用0,1,2等数值表示第一个,第二个参数,第三个参数等。
  • Parameter Size:默认值是-1,表示让SSIS确定参数的长度。如果参数的数据类型是变长的(varchar或varbinary),必须设置参数的长度,为参数值分配足够长度的空间。

 

目录

  • 插入数据
  • 删除数据
  • 更新数据
  • 事务

 

几个问题

图片 2

我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等
常见很多人利用master库的spt_values系统表,这个当然没有问题

一、插入数据

  1.INSERT 语句的基本语法

--语法:
--INSERT INTO <表名>(列1, 列2, ...) VALUES (值1, 值2, ...)

--示例
INSERT INTO dbo.Shohin
        ( shohin_id ,
          shohin_mei ,
          shohin_bunrui ,
          hanbai_tanka ,
          shiire_tanka ,
          torokubi
        )
VALUES  ( '0011' , -- shohin_id - char(4)
          'T 恤衫' , -- shohin_mei - varchar(100)
          '衣服' , -- shohin_bunrui - varchar(32)
          1000 , -- hanbai_tanka - int
          500 , -- shiire_tanka - int
          GETDATE()  -- torokubi - date
        );

图片 3

 

    (1)列名和值用逗号隔开,分别放在括号里,这种形式称为清单。

        ( shohin_id ,        
          shohin_mei ,
          shohin_bunrui ,
          hanbai_tanka ,
          shiire_tanka ,
          torokubi
        )        
        --列清单

        ( '0011' , -- shohin_id - char(4)
          'T 恤衫' , -- shohin_mei - varchar(100)
          '衣服' , -- shohin_bunrui - varchar(32)
          1000 , -- hanbai_tanka - int
          500 , -- shiire_tanka - int
          GETDATE()  -- torokubi - date
        )        
        --值清单    

图片 4图片 5

INSERT INTO dbo.Shohin
        ( shohin_id ,
          shohin_mei ,
          shohin_bunrui ,
          hanbai_tanka ,
          shiire_tanka ,
          torokubi
        )
VALUES  ( '0012' , -- shohin_id - char(4)
          'T 恤衫' , -- shohin_mei - varchar(100)
          '衣服' , -- shohin_bunrui - varchar(32)
          1000 , -- hanbai_tanka - int
          500 , -- shiire_tanka - int
          GETDATE()  -- torokubi - date
        ),
        ( '0013' , -- shohin_id - char(4)
          'T 恤衫' , -- shohin_mei - varchar(100)
          '衣服' , -- shohin_bunrui - varchar(32)
          1000 , -- hanbai_tanka - int
          500 , -- shiire_tanka - int
          GETDATE()  -- torokubi - date
        );

一次性多行 INSERT

  

  2.省略列清单

INSERT INTO dbo.Shohin
VALUES  ( '0014' , -- shohin_id - char(4)
          'T 恤衫' , -- shohin_mei - varchar(100)
          '衣服' , -- shohin_bunrui - varchar(32)
          1000 , -- hanbai_tanka - int
          500 , -- shiire_tanka - int
          GETDATE()  -- torokubi - date
        );

  

  3.插入 NULL 值

INSERT INTO dbo.Shohin
VALUES  ( '0015' , -- shohin_id - char(4)
          'T 恤衫' , -- shohin_mei - varchar(100)
          '衣服' , -- shohin_bunrui - varchar(32)
          1000 , -- hanbai_tanka - int
          NULL , -- shiire_tanka - int
          GETDATE()  -- torokubi - date
        );

  【备注】插入 NULL 值的列不能设置为 NOT NULL 约束。

  

  4.插入默认值

--示例:创建表时设置默认值
CREATE TABLE ShohinIns
(
    id CHAR(4) NOT NULL,
    num INT DEFAULT 0    --DEFAULT 默认约束
)

--示例:INSERT 时显示插入默认值
INSERT INTO dbo.ShohinIns
        ( id, num )
VALUES  ( '001', -- id - char(4)
          DEFAULT  -- num - int
          )

--示例:INSERT 隐式插入默认值
INSERT INTO dbo.ShohinIns( id )
VALUES  ('002')

图片 6

  【备注】建议使用显示的方式插入值。如果插入的时候隐式省略了列名,并且该列没有指定默认值的时候,该列的值会被设定为 NULL(如果省略的列设置了 NOT NULL 约束的话,执行会报错)。

  【总结】省略 INSERT 语句的列名,就会自动设定该列的默认值(没有默认值时会设定为 NULL)。

  

  5.从其它表复制数据

--语法
INSERT ... 
SELECT ...

--示例
INSERT dbo.ShohinIns
        ( id, num )
SELECT shohin_id, shiire_tanka
FROM dbo.Shohin

--示例
INSERT INTO dbo.ShohinIns
        ( id, num )
SELECT id=1, num =2;

--示例
INSERT INTO dbo.ShohinIns
        ( id, num )
SELECT 1, 2;

   【备注】INSERT 语句中的 SELECT 语句中,可以使用 WHERE 子句或者 GROUP BY 子句等任何 SQL 语法。(但使用 ORDER BY 子句并不会产生任何效果。)

 

你了解你的数据库么

  了解决定效率

  也许很多老司机有这样的感觉,我运维的效率如何,这取决于我对系统的了解!出现什么样的情况,我就知道是哪里的问题,代码在哪里,问题在哪里!看错误号、看异常便知问题,也就是未出茅庐,已知三分天下!反过来新手可能需要debug跟一遍还一知半解。对于数据库道理也是一样的,数据库系统出现什么问题你是否能很准确的定位的可能发生问题的几个点?或者我需要查看系统哪些指标?系统中存在着哪些隐患?哪些功能慢?哪些语句需要优化?哪些运维策略做的不合理?

在Parameter Mapping中,Parameter Marker和Name受到Connection Type的影响,如下表:

比如下面这个(没截完,结果是0-2047)

二、删除数据

  1.2 种 删除数据的方法:

    (1)DROP TABLE 语句:删除表

    (2)DELETE 语句:删除表的数据

--语法
--DELETE FROM <表名>;

--示例
DELETE FROM dbo.ShohinIns;

  【备注】DELETE 语句删除的对象是记录(行),不是表和列。

 

  2.指定删除对象的 DELETE 语句

--语法
--DELETE FROM <表名>
--WHERE <条件>;

--示例
DELETE FROM dbo.Shohin
WHERE hanbai_tanka >= 4000;

  【备注】可以通过 WHERE 子句指定对象条件来删除部分数据。

  【备注】DELETE 语句中不能使用 GROUP BY、HAVING 和 ORDER BY 三类子句。

  【备注】如果要删除表全部数据时请使用 TRUNCATE <表名>,它比 DELETE 子句更高效。

 

出现问题能从容面对么

  从容出自积累

  从容面对这个词说起来容易,但是我自身从小白的开发到现在的DBA一路走来真的是积累了很多,坑也踩了很多才能做到从容面对。

  这里举几个现象 :

  当你的CPU从稳定的30% 飙升到90%以上,你能想到的可能原因是什么? 怎么样快速排查?

  当你平稳的业务出现大面积超时,你能想到的可能原因是什么? 怎么样快速排查?

Connection type

图片 7

三、更新数据

  1.UPDATE 子句的基本语法

--语法
--UPDATE <表名>
--    SET <列名> = <表达式>

 

  2.指定条件的 UPDATE 语句

--语法
--UPDATE <表名>
--    SET <列名> = <表达式>
--WHERE <条件>;

--示例
UPDATE dbo.Shohin
    SET hanbai_tanka = hanbai_tanka * 10
WHERE shohin_bunrui = '厨房用具';

  

  3、使用 NULL 进行更新

--示例
UPDATE dbo.Shohin
    SET torokubi = NULL
WHERE shohin_id = '008';

  【备注】只有未设置 NOT NULL 约束和主键约束的列才可以清空为 NULL。

  

  4.多列更新

--示例
UPDATE dbo.Shohin
    SET hanbai_tanka = hanbai_tanka * 10,    --逗号分割
        shiire_tanka = shiire_tanka / 2
WHERE shohin_bunrui = '厨房用具'

 

真的了解么

  习惯至深入

  在很多次和运维人员交流的过程中发现,我知道的名词和他知道的名词完全不是一个东西!比如:死锁。同样提到索引,他会说不用讲,这我都懂。那么什么是联合索引,什么是覆盖索引?覆盖索引怎么能降低你的死锁概率? 这时他的反应才是:哦...原来还可以这样,原来还有这么多东西!

  模拟一个场景,领导开会的时候问你如下问题:

  领导问:

  • 数据库有多大 ? 每天增长多少 ?
  • 高峰时间卡慢么 ? 为什么慢 ? 数据库问题还是软件或硬件?
  • 系统中那些语句慢 ? 慢到什么程度?
  • 系统中哪些资源是瓶颈 ?
  • 存在死锁情况么? 怎么产生的?
  • 有什么潜在风险 ?
  • 怎么解决 ?

  很多人运维人员的回答可能是:

  。。。。。。。。。。

 

  而问题发生的时候可能发生的情况就是这样的:  

  图片 8

 

  

Parameter marker

这样也可以使用,但是感觉不够灵活,一是不是随便一个账号都可以访问master数据库的,而是他这里面也只有这么一个连续的数字了,
想要别的结果集就不太弄了,
类似数据可以用公用表表达式CTE的递归来生成
比如上述的0-2047的结果集

四、事务

  1.事务:需要在同一个处理单元中执行的一系列更新处理的集合。

  2.创建事务:

--语法
--事务开始语句
--    DML 语句①;
--    DML 语句②;
--    ...
--事务结束语句(COMMIT 或 ROLLBACK);

    (1)COMMIT - 提交处理:提交事务包含的全部更新处理的结束指令。一旦提交,无法恢复到事务开始前的状态。

    (2)ROLLBACK - 取消处理:取消事务包含的全部更新处理的结束指令。一旦回滚,数据库就会回复到事务开始之前的状态。

 

--示例
BEGIN TRANSACTION;
    UPDATE dbo.Shohin
        SET hanbai_tanka = hanbai_tanka - 1000
    WHERE shohin_mei = '运动 T 恤';

    UPDATE dbo.Shohin
        SET hanbai_tanka = hanbai_tanka   1000
    WHERE shohin_mei = 'T 恤衫';

    DELETE FROM dbo.Shohin WHERE shohin_id = '0015';

ROLLBACK;  -- COMMIT

  

  3.ACID 特性

    (1)原子性(Atomicity):在事务结束时,其中包含的更新处理要么全部执行,要么完全不执行。

    (2)一致性(Consistency):事务中包含的处理,要满足数据库提前设置的约束,也称完整性。

    (3)隔离性(lsolation):保证不同事务之前互不干扰的特性。

    (4)持久性(Durability):事务一旦结束,DBMS 会保证该时点的数据状态得以保存的特性,也称耐久性。

      

 你是哪一类?

  

  背景:今天,数据库普遍存在问题,如:性能问题、安全问题、可靠性问题、数据备份问题、结构设计问题等。

  图片 9

  

  结论:

  1. 当出了问题时,用户不知道是谁的原因,系统的真实状况如何?
  2. 问题一大堆,多数人没意识到是数据库问题,很多人想弄但不会弄,还有一部分人会弄但传统的方法不方便。

 

Parameter name

;with GenerateHelpData
as
(
    select 0 as id
    union all
    select id 1 from GenerateHelpData where id<2047
)
select id from GenerateHelpData option (maxrecursion 2047);

备注

  这里采用 MS SQL Server 进行验证,不保证所有的 DBMS 执行结果正确。

 

你是下面那个角色?

  图片 10

  图片 11

  图片 12

 

  你是否像救火队员?牺牲着自己的休息时间随叫随到的运维这你的系统?你是否像拆弹兵一样维护着一个随时爆炸的系统?你是否又像一个保姆,寸步不离的呵护着你的系统?

 

Example SQL command

可以直接让CTE参数逻辑运算,也可以生成临时表,达到多次重用的目的,这样感觉是不是也很清爽?

传送门

  《SQL 基础知识梳理(一) - 数据库与 SQL》

  《SQL 基础知识梳理(二) - 查询基础》

  《SQL 基础知识梳理(三) - 聚合和排序》

 


【参考】《SQL ゼロからはじめるデータベース操作》

 

怎么办?

  可能不少看官就是上面的一员,但是又很迷惑,我该怎么办?我要从头深入学习数据库?学个几年到精通? 当然不需要,其实数据库运维很简单!你只需要了解常规的运维套路,常规的系统指标,和常规的问题排查方式,这样已经可以解决80%的问题。如果出现搞不定的20%你需要的数据库专业人员的协作

  运维三步走:

  •   发现问题
  •   解决问题
  •   预防问题

 

  是不是感觉说的很轻巧...本文除了让运维人员了解数据库在系统中的重要,多关注数据库,多了解一些数据库的运维方式外,也推荐一款工具,所谓工欲善其事,必先利其器!

ADO

 

推荐一款工具

  

  Expert for SQLServer 一款SQLSERVER的体检诊断专家。

 

  图片 13

 

?

1,生成连续数字(当然数字的起始值,间隔值都可以自定义)

发现问题

  全面体检(不仅仅是性能),让你知道数据库的真实运行状况、存在的问题及潜在风险

  按照6大维度, 108项指标(软硬件环境、参数配置、结构设计、性能、可用性、备份、安全)建立体检标准,定期对数据库进行全面体检,客观呈现数据库的真实运行状况,所有问题一览无余。

  图片 14

 

Param1, Param2, …

--生成连续数字
;with GenerateHelpData
as
(
    select 0 as id
    union all
    select id 1 from GenerateHelpData where id<2047
)
select id from GenerateHelpData option (maxrecursion 2047);

解决问题

  快速诊断,分析出系统的主要问题并进行分类,同时提供解决之道

  通过数据分析,将数据库的问题按照严重程度进行分类,按照提示的方式进行调整,所有问题。不管你懂数据库还是不懂数据库,你都可以清晰地知道,应该从哪入手,进而快速地解决问题,让天下没有难用的数据库。

  图片 15

  图片 16

  图片 17

 

SELECT FirstName, LastName, Title FROM Person.Contact WHERE ContactID = ?

图片 18

预防问题

  定期体检,才能消灭隐患,买辆车还定期保养呢,这就是所谓的防患于未然,把问题消灭在萌芽中。

  个人建议,不管你用什么工具,或使用脚本。

  核心系统体检:1月/次 

  重要系统:2月或3月/次

  有功能上线,或结构变更等都需要做一次体检。

  图片 19

ADO.NET

 

多人或大牛协作

  就像一个系统运转有硬件,网络,程序,数据库,需要多方、多人协作一样,数据库的问题一样,每个人都有擅长的部分,那么多人协作就是可以更全面的解决系统问题,这款工具的最大优势在于提供了多人协作的基础数据。这份体检数据包含了数据库运行中的大部分指标,所有时间点的状况,计数器的指标,语句间的阻塞等等信息,这远胜于传统运维中拼凑堆砌出来的脚本数据。

  这就像医院的电子病历,对全身有了全面的检查,X光片子、各种检验、化验数据在手,可能你去到哪个医院,找哪个专家或医生汇诊都可以作为他们协作的依据!

  图片 20

 

  

--------------博客地址---------------------------------------------------------------------------------------

Expert 诊断优化系列 

 

 


 

  总结 : 亲身处理了上百家客户的系统,大部分系统数据库都存在着各种数据库问题,而数据库问题往往被忽视,直接被归结为软件的问题,厂商的问题!

  数据库应该被我们重视起来,很多时候只是在数据库上做一些常规的配置或简单的优化,就能让系统有几倍甚至几十倍的提升,而这些优化可能只是简简单单的数据库层面完全不用改代码的行为!

  系统运维需要定期体检,这点真心希望运维人员能够重视起来,也真心希望系统运维人员可以加深一下对数据库的了解,多掌握一些常规的手段和必要的运维策略。

  工欲善其事,必先利其器,运维同样需要一些简单方便的工具!

   本文提到的工具下载链接:

   Expert for SQLServer 工具下载链接:  **

 

  本人使用工具优化的相关文章链接 : 

  

@<parameter name>

2,CTE递归生成连续日期

SQL SERVER全面优化-------Expert for SQL Server 诊断系列

 

 ----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!

  引用高大侠的一句话 :“拒绝SQL Server背锅,从我做起!”

@<parameter name>

--生成连续日期
;with GenerateHelpData
as
(
    select cast('2016-10-01' as date) as [Date]
    union all
    select DATEADD(D,1,[Date]) from GenerateHelpData where [Date]<'2017-01-01'
)
select [Date] from GenerateHelpData;

 

SELECT FirstName, LastName, Title FROM Person.Contact WHERE ContactID = @parmContactID

图片 21

本文由小鱼儿玄机30码发布于数据库,转载请注明出处:我们的服务器内存不足总是90%以上,在Task中需要

关键词: 小鱼儿玄机30码