数据库开发
文章平均质量分 91
發糞塗牆
MVP, TOGAF, MCSE, Azure Solution Architect
展开
-
SQL Server导入性能对比(1)——WITH TABLOCK并行导入
随着大数据和大量数据系统的出现,数据的加载变得越来越重要,很多岗位甚至只需要ETL技能,不过今时今日数据加载已经不再是单纯的ETL,还有ELT,甚至不需要进行数据移动的计算等等。本文先把精力放在传统的ETL上。介绍几种数据加载的过程和对比。常规数据加载方式 数据加载的本质就是把数据插入特定的地方,通常我们关注的是性能,说白了就是插入完成的时间,及引起的空间消耗。 本文及后面两篇文章...原创 2020-03-02 11:37:39 · 1612 阅读 · 0 评论 -
使用SQLCMD在SQLServer执行多个脚本
概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司,十几个客户,每个客户一个库,但是数据库结构、存储过程、视图等都是一模一样,每次执行脚本(以下称为升级),如果有一百个脚本,那么就要按顺序执行过千次,这种工作量可不是一个人能承受得了的。原创 2012-12-20 17:33:39 · 42359 阅读 · 2 评论 -
SQL Server 执行计划操作符详解(3)——计算标量(Compute Scalar)
接上文:SQL Server 执行计划操作符详解(2)——串联(Concatenation )原创 2016-01-06 17:27:42 · 7084 阅读 · 2 评论 -
SQL Server 执行计划操作符详解(1)——断言(Assert)
前言: 很多很多地方对于语句的优化,一般比较靠谱的回复即使——把执行计划发出来看看。当然那些只看语句就说如何如何改代码,我一直都是拒绝的,因为这种算是纯蒙。根据本人经验,大量的性能问题单纯从语句来看很难发现瓶颈,同一个语句,由于环境的不同,差距非常大,所以比较合适的还是分析执行计划。 那么对于执行计划,一般使用图形化执行计划就差不多了,但是用过的人也有一些疑惑,里面的图标(称为操作符)并不非常原创 2015-12-11 14:38:43 · 12218 阅读 · 4 评论 -
T-SQL动态查询(3)——静态SQL
接上文:T-SQL动态查询(2)——关键字查询 本文讲述关于静态SQL的一些知识和基础技巧。简介: 什么是静态SQL?静态SQL是和动态SQL相对而言的,其实我们没必要过于纠结精确定义,只要大概知道什么算静态SQL即可。当一个语句特别是存储过程,语句不需要动态生成或拼接,除了参数之外我们都知道语句的最终形态时,就可以认为这是静态SQL,简单来说,我们大部分的处理动态查询条件的语句都属于静态SQ原创 2015-11-26 16:01:48 · 6890 阅读 · 0 评论 -
T-SQL动态查询(1)——简介
起因: 由于最近工作需要及过去一直的疑问,所以决定着手研究一下动态SQL。由于离开一线开发有点年头了,很多技巧性的东西没有过多研究,作为DBA和《SQL Server性能优化与管理的艺术》一书的独立作者,更多的是关注在满足功能要求前提下的性能问题。但是我认为本文不仅对DBA有用,对数据库开发人员甚至设计师、架构师等都有一定的参考价值。 前言: 读者是否遇到过类似功能:一个应用程序(不管是B/S还是原创 2015-11-19 16:27:58 · 10715 阅读 · 2 评论 -
T-SQL执行内幕(2)——Tasks、Workers、Threads、Scheduler、Sessions、Connections、Requests
本文属于SQL Server T-SQL执行内幕系列 接上文:T-SQL执行内幕(1)——简介 本节以介绍一些基础的但又容易混淆的概念。包括:Tasks、Workers、Threads、Scheduler、Sessions、Connections、RequestsScheduler:计划程序,特指SQL OS的Scheduler,用于管理SQL Server中的线程调度的对象,每个计划...原创 2018-03-23 14:57:08 · 1323 阅读 · 0 评论 -
T-SQL执行内幕(1)——简介
本文属于SQL Server T-SQL执行内幕系列前言: 本文主体内容来自于:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/但是经常打不开,本人又在:https://www.codeproject.com/Articles/630346/Understanding-how-SQL-Ser...原创 2018-03-23 14:54:46 · 2673 阅读 · 0 评论 -
T-SQL执行内幕(3)——解析和编译
本文属于SQL Server T-SQL执行内幕系列 接上文,当请求被任务接收同时得到工作线程指派执行后,就开始在SQL Server内部进行运作。当请求被执行时,第一步就是要先解析(Parsing)请求,把TDS数据流转换成SQL Server可识别的格式。 从客户端发送的是T-SQL文本,然后转换成TDS数据流,到达SQL Server之后变回T-SQL文本。但是由于纯T-SQL文...原创 2018-03-23 16:53:32 · 1333 阅读 · 0 评论 -
日志文件不断增长
先了解SQLServer需要保存的日志记录: 1、 所有没有经过“检查点”的日志记录: SQLServer定时执行(Checkpoint),保证“脏页”被写入硬盘。没做Checkpoint的,可能是只在内存中修改,数据文件还没同步。SQLServer要在硬盘的日志文件中有记录,一边异常重启后重新修改。 2、 所有没有提交的事务所产生的日志及其后续的日志记录翻译 2012-09-15 20:13:50 · 14176 阅读 · 3 评论 -
T-SQL动态查询(2)——关键字查询
接上文:T-SQL动态查询(1)——简介 前言: 在开发功能的过程中,我们常常会遇到类似以下情景:应用程序有一个查询功能,允许用户在很多查询条件中选择所需条件。这个也是本系列的关注点。 但是有时候你也许会发现,有些条件或多或少是互相排斥的。比如用户通过下面其中一个条件查找信息:1. 客户名2. 客户ID3. 客户身份标识号(如国内身份证、美国社保号等)。 并且这三列上都有适当的索引。本系列主原创 2015-11-19 16:39:43 · 5789 阅读 · 2 评论 -
何时使用SET和SELECT为变量赋值
我们经常使用SET和SELECT来为变量复制,但是有时候,只能选其一来使用,下面来看看这些例子,本例中使用AdventureWorks数据库来做演示。通过查询返回值: 当你把查询返回的值付给变量时,SET将会接受这个结果(单值)并付给一个标量值。但是SELECT 可以接受查询返回的多个值。下面来看看单值和多值均使用SET的例子: USE A原创 2013-01-15 00:16:22 · 24459 阅读 · 8 评论 -
数据库开发——参照完整性——在外键中使用Delete on cascade选项
原文:http://www.mssqltips.com/sqlservertip/2743/using-delete-cascade-option-for-foreign-keys/?utm_source=dailynewsletter&utm_medium=email&utm_content=headline&utm_campaign=2012731 参照完整性在设计数据库时需要重视翻译 2012-10-06 13:03:56 · 13803 阅读 · 6 评论 -
SQL Server 日期相关
对于开发人员来说,日期处理或许简单,或许很难。结合自己过往的开发经验并整合网上的例子,总结出一些日期相关的操作,供自己备用及为大家分享: 一、日期类型:对于SQL Server 2008 来说(因为2000甚至2005已经稍微有被淘汰的迹象,所以在此不作过多说明,加上自己工作使用的是2008R2。所以不保证08以前的能用),日期类型有:数据类型格式范围精确度存储大小(以字节为单位)用户定义的秒的小原创 2012-06-13 01:25:16 · 27283 阅读 · 13 评论 -
开发随笔——NOT IN vs NOT EXISTS
NOT IN和NOT EIXTS在对允许为null的列查询时会有一定的风险。特别是NOT IN,如果子查询包含了最少一个NULL,会出现非预期的结果。下面做一个演示。 IF OBJECT_ID('ShipmentItems', 'U') IS NOT NULL DROP TABLE dbo.ShipmentItems; GO CREATE TABLE dbo.Sh原创 2014-06-16 13:57:01 · 6557 阅读 · 3 评论 -
你是否也忘了刷新视图?
起因: 由于工作原因,我隔几天就要执行一批开发人员提供过来的脚本,部分是新需求的开发,部分是修复bug。往往包含有几百个。我用工具批量执行之后,系统继续运行,后来反反复复会有这样那样的错误,其中一个,经过开发人员的检查,是因为视图没刷新。 对此我纳闷了很久,视图不就是一堆select语句吗?怎么还要刷新?难道表改了不会跟着改?为此,我首先自己做一个实验,发现原创 2012-12-24 22:41:03 · 17620 阅读 · 21 评论 -
一个非常有用的函数——COALESCE
很多人知道ISNULL函数,但是很少人知道Coalesce函数,人们会无意中使用到Coalesce函数,并且发现它比ISNULL更加强大,其实到目前为止,这个函数的确非常有用,本文主要讲解其中的一些基本使用: 首先看看联机丛书的简要定义: 返回其参数中第一个非空表达式 语法: COALESCE ( expression [ ,...n ] )原创 2012-12-16 03:29:18 · 238052 阅读 · 10 评论 -
T-SQL 中的CROSS JOIN用法(半翻译)
今天来翻译一篇关于T-SQL的文章,本文可供微软认证70-461:QueryingMicrosoft SQL Server 2012的学习和练习之用。本文以翻译为主,引出个人工作中的一些思考,详见最后部分。 我会尽可能抽时间翻译本系列(见原文出处的相关链接,这是一系列的文章)的其他文章,除了回顾一些知识之外,重点是总结一下自己的所得。 -------------------------------原创 2015-09-15 13:09:07 · 7728 阅读 · 0 评论 -
T-SQL中的APPLY用法(半翻译)
本文接上文:T-SQL 中的CROSS JOIN用法(半翻译) 同样可用于微软认证70-461: Querying Microsoft SQL Server 2012考试的学习中。 ---------------------------------------------------------------------以下为译文-----------------------------------原创 2015-09-18 14:38:33 · 7179 阅读 · 0 评论 -
T-SQL动态查询(4)——动态SQL
接上文:T-SQL动态查询(3)——静态SQL 前言: 前面说了很多关于动态查询的内容,本文将介绍使用动态SQL解决动态查询的一些方法。 为什么使用动态SQL: 在很多项目中,动态SQL被广泛使用甚至滥用,很多时候,动态SQL又确实是解决很多需求的首选方法。但是如果不合理地使用,会导致性能问题及无法维护。动态SQL尤其自己的优缺点,是否使用需要进行评估分析:动态SQL优点:动态SQL提供了强大的扩原创 2015-12-09 09:38:17 · 13274 阅读 · 2 评论 -
T-SQL执行内幕(4)——优化
本文属于SQL Server T-SQL执行内幕系列 接上文,当解析和编译完成后,请求的生命周期就进入下一步——优化(Optimisation)。在SQL语言中,优化的本质就是找最好的路线。意思是在多种可能的候选数据访问方式中选择最佳一个。比如两表关联的简单查询语句,每个表有1个索引,那么就有4种可能的数据访问方式(AB两表的索引扫描、AB两表的索引查找,A扫描B查找、A查找B扫描)。随着表...原创 2018-03-28 14:30:48 · 1408 阅读 · 0 评论 -
T-SQL执行内幕(6)——返回结果
本文属于SQL Server T-SQL执行内幕系列 在执行引擎按照执行计划的要求把数据成功检索之后,就需要把数据返回给客户端。这里的结果不是单纯的数据库引擎完成查询数据之后的结果,而是客户端(如SSMS)接收到数据的结果。一旦数据已经“填满”执行树的各个操作符,那么最顶端的根操作符就会负责把数据写入网络缓存(network buffer)并把这些数据发送给客户端。 结果集并不是直接...原创 2018-03-28 15:54:10 · 1049 阅读 · 0 评论 -
T-SQL执行内幕(9)——数据访问
本文属于SQL Server T-SQL执行内幕系列 在执行树的叶子端(通常就是图形化执行计划每个分支的最右端),一般是实际访问数据的操作符。当调用这些操作符上的next()方法时,会返回表或者索引上的实际数据。数据访问通常有三类可能的操作符:Scan: 各类扫描,扫描操作会在数据上循环访问所有的行。它永远不会定位一个特定的行,取而代之的是扫描整个数据集。在执行计划中常见的扫描操作符有...原创 2018-03-31 15:14:04 · 923 阅读 · 0 评论 -
T-SQL执行内幕(10)——读取数据
本文属于SQL Server T-SQL执行内幕系列 关系型数据库的数据访问操作总是从内存的缓存中读取数据而不是从磁盘中读取。这个缓存称为Buffer Pool。如果数据访问操作符未能在缓存中找到所需的数据,那么就需要从磁盘中加载,这就会产生一个磁盘I/O读(set statistics io on中的物理读),并且需要等待这个物理读完成(及从磁盘找到数据并加载到缓存为止)之后,才能进行操作...原创 2018-03-31 15:39:06 · 1120 阅读 · 0 评论 -
T-SQL执行内幕(11)——Read Ahead
本文属于SQL Server T-SQL执行内幕系列 每当操作读取页的数据,意味着这些数据需要固定到缓存(buffer pool)中。这个时候可能会导致操作被阻塞,因为当所需要的数据不在内存时,需要把数据从磁盘载入内存,这个时候操作需要等待页从磁盘搜索并载入内存。如果由于系统负担很重或者载入的量很大,磁盘I/O响应不及时,那么此时操作就会被阻塞(stall),性能将会暴跌。 从现实生...原创 2018-03-31 15:52:53 · 1670 阅读 · 1 评论 -
T-SQL执行内幕(7)——内存授予
本文属于SQL Server T-SQL执行内幕系列 前面提到,在执行过程中,很多操作符都需要内存来支持运作。比如Sort操作符,需要存储所有的输入以便进行排序,而Hash操作,为了创建大型的hash表,也需要申请资源来存储数据。 基于操作符的类型和预估的影响行数及列的大小(这些都可以从统计信息获得),执行计划可以知道这些操作符需要的大概内存。整个执行计划所需的内存总和称为内存授予(M...原创 2018-03-30 15:31:50 · 1036 阅读 · 0 评论 -
T-SQL执行内幕(8)——数据存储
本文属于SQL Server T-SQL执行内幕系列 前面提到了数据访问,那么如何访问?访问什么?为此必须介绍一下数据存储的概念。SQL Server以三种方式存储和组织数据:均可从sys.partitions中查到Heaps:堆,指没有聚集索引(注意主键并非一定是聚集索引)的表。另外诸如select …into … from …语句生成的表也是堆表。SQL Server堆结构 在sy...原创 2018-03-31 11:16:37 · 974 阅读 · 0 评论 -
SQL Server Hash Warning 优化
本系列属于 SQL Server性能优化案例分享 专题 最近遇到服务器CPU持续居高问题,通过计数器的检查,初步断定存在语句性能问题,然后有针对性地抓取问题语句(来龙去脉将会在另外一篇文章解释,本文关注Hash Warning),其执行计划如下: 因为这是生产环境,所以下面例子把表名替换成A/B/C/D等表。代码很简单,大概样子如下:SELECT bo.Scode ,d.PCode ,...原创 2018-03-08 14:50:59 · 1293 阅读 · 0 评论 -
SQL Server新基数估量器
本系列属于 SQL Server性能优化案例分享 专题 当你使用SQL Server 2014及以上版本并且数据库的兼容级别为120或以上时,可能会有一个比较奇怪的现象,原本在SQL 2008/2012上运行正常的数据库,可能因为迁移到SQL Server 2014版本,在新环境突然变慢了。 一般来说,迁移/升级实例版本时,我们必不可少的工作有:备份、重建全库索引、全库更新统计信息。但...原创 2018-03-21 16:05:16 · 993 阅读 · 0 评论 -
SQL Server性能优化案例分享(1)——CPU持续过高——CPU高使用率的常见原因及处理方向
本系列属于 SQL Server性能优化案例分享 专题 部分内容借用《SQL Server 2012实施与管理实战指南》P592,如果SQL Server错误日志里面并没有17883/17884这类错误,但是SQL Server CPU很高,那一般就是工作负载太高导致的。意味着SQL Server并没有什么大问题,但是很辛苦地在完成用户发过来的请求。 由于CPU较于内存、阻塞、磁盘等资...原创 2018-03-12 17:23:14 · 6561 阅读 · 0 评论 -
什么东西导致了执行计划的严重错误——需要更新统计信息吗?
原文出处:What caused that plan to go horribly wrong – should you update statistics? 由于本人确实遇到过这类问题,但是基于水平和经历,不打算重复造轮子,所以把大牛的文章翻译一下以供大家参考。以下是译文:过去几年里,我(作者)遇到这类情景: 有一个存储过程在大部分时间里面都运行得很好,但是突然就不行了。其性...翻译 2018-03-12 11:08:23 · 1682 阅读 · 0 评论 -
SQL Server Table Spool优化
本系列属于 SQL Server性能优化案例分享 专题 在执行计划中出现的Spool操作符,往往都具有明显的性能问题,也意味着数据库的设计、编码等可能存在问题,所以本文专门介绍一下这个操作符。 Spool介绍 Spool是内存或者磁盘上的缓存(cache)或临时表。SQL Server用这个结构来提升在执行过程中需要多次执行的复杂的子表达式的性能。注意几个次:一次运行中多次执行、复...原创 2018-03-06 08:24:34 · 5498 阅读 · 0 评论 -
T-SQL执行内幕(5)——执行
本文属于SQL Server T-SQL执行内幕系列 一旦优化器选择了开销最低的预估执行计划之后,就会把预估执行计划转换成实际执行树(Actual Execution Tree)进行查询执行。树的每个节点都是一个操作符。操作符及一系列的有向箭头(代表数据流的方向及结果集的数据量(箭头粗细)) 组成了整个执行计划,这里指的是图形化执行计划。 所有的操作符都实现一个具有三个方法(open...原创 2018-03-28 15:19:38 · 1151 阅读 · 0 评论 -
SQL Server 2012大幅增强了T-SQL
原文出处http://tech.it168.com/a2012/0323/1328/000001328871.shtml2012年03月26日00:05 来源:InfoQ 作者:曹如进译 编辑:王玉圆 评论:--条【IT168 评论】SQL Server 2012对T-SQL进行了大幅增强,其中包括支持ANSI FIRST_VALUE和LAST_VALUE函数,支持使用FETCH与转载 2012-05-02 14:37:46 · 2137 阅读 · 0 评论 -
阻塞与死锁(一)——基础知识
阻塞与死锁是除内存、CPU、IO外另一个影响性能的因素。对OLTP系统尤为严重一般以下问题是死锁的征兆:1、 并发用户少的时候,一切正常,但是随着用户数量增多,性能越来越慢。2、 客户端经常收到以下错误:Error 1222:Lock request time out period exceeded.(已超过锁请求超时时段)Error 1205:Your transacti原创 2012-05-16 16:02:24 · 5866 阅读 · 0 评论 -
SQL Server 数据库索引
一、什么是索引减少磁盘I/O和逻辑读次数的最佳方法之一就是使用【索引】索引允许SQL Server在表中查找数据而不需要扫描整个表。1.1、索引的好处:当表没有聚集索引时,成为【堆或堆表】【堆】是一堆未加工的数据,以行标识符作为指向存储位置的指针。表数据没有顺序,也不能搜索,除非逐行遍历。这个过程称为【扫描】。当存在聚集索引时,非聚集索引的指针由聚集索引所定义的值组成,所以聚集原创 2012-06-05 17:02:02 · 2454 阅读 · 0 评论 -
SQL 2008执行语句遇到内存不足(1)——error 701
转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/17/sql-2008-error-701.aspx某个特定的存储过程在SQL 2008中执行会遇到以下错误:Msg 701, Level 17, State 123, Procedure GetAllRevisions_Monthly, Line 22There is insuffi转载 2012-06-06 00:07:09 · 8961 阅读 · 0 评论 -
SQL Server 内存泄露(memory leak)——游标导致的内存问题
转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql-server-memory-leak.aspx问题描述:客户反映SQL Server运行一段时间就会报出内存不足的错误,怀疑是有内存泄露。从SQL Server的error log里面看如下错误信息:2009-05-14 10:54:20.71 server转载 2012-06-06 00:09:21 · 5546 阅读 · 0 评论 -
数据库开发篇(一)——转换日期类型
SQL Server支持的日期时间格式SQL codeSelect CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVERT(varchar(100), GETDATE(), 1): 05/16/06Select CONVERT(varchar(100), GETDATE(), 2): 06.0原创 2012-05-17 20:14:24 · 2066 阅读 · 1 评论 -
SQL Server错误代码及解释(留着备用)
转自:http://www.ajia.me/Article/193.htmlCode Error Message 0 操作成功完成。 1 功能错误。 2 系统找不到指定的文件。 3 系统找不到指定的路径。 4 系统无法打开文件。 5 拒绝访问。 6 句柄无效。 7 存储控制块被损坏。 8 存储空间不足,无法处理此命令。 9 存储控制块地址无效。 10转载 2012-06-08 12:55:14 · 14714 阅读 · 2 评论