已经有快2个月没有更新博客了,实在是因为最近发生了太多的事情,辞了工作,在湘雅医院待了一个多月,然后又新换了工作......

在平时的工作中,Sqlserver中许多知识点是经常用到的,但是有时候我们往往忽略了它们,在过去的一年里,一直使用的是Mysql,现在又开始接触Sqlserver了,所以就把一些常用又容易忽视的Sqlserver知识点总结一点,以便备忘之用。

所有的操作都将基于Northwind数据库来进行操作。

注意:当采用附加Northwind数据库的方式进行数据库迁移的时候,可能会出现错误:“Access is denied”。解决方案: right-click the SQL Server  Management Studio icon and select  Run as administrator。

SET NOCOUNT ON 介绍

在存储过程中,经常用到SET NOCOUNT ON;

作用:阻止在结果集中返回显示受T-SQL语句或则usp影响的行计数信息。
当SET NOCOUNT ON 时候,不返回计数,当SET NOCOUNT OFF时候,返回计数。

当SET NOCOUNT ON 时候,会更新@@RowCount,但是不向客户端发送存储过程每个语句的DONE_IN_proc消息。

如果存储过程中包含一些并不返回实际数据的语句,使用SET NOCOUNT ON时,网络通信流量便会大量减少,可以显著提高应用程序性能。

SET NOCOUNT 指定的设置只在执行或运行时候生效,分析时候不生效。

示例:

USE Northwind
GO
SET NOCOUNT OFF;
SELECT TOP 5 OrderDate FROM Orders
GO

执行结果如下:

USE Northwind
GO
SET NOCOUNT ON;
SELECT TOP 5 OrderDate FROM Orders
GO

执行结果如下:

Go 介绍

如果只是执行一条语句,有没有GO都一样。

如果多条语句之间用GO分隔开就不一样了。

每个被GO分隔的语句都是一个单独的事务,一个语句执行失败不会影响其它语句执行。

GO 不是 Transact-SQL 语句;而是可为  SQL Server 查询分析器识别的命令。

如果你的SQL过长的时候,就要写GO,或者有一些语句,它只能是第一句操作的,在之前你也得写 GO ,GO的意思是分批处理语句,有加这个 GO ,就执行GO 行的代码,执行后再执行接下来的代码。

像以下这种情况下就要用到GO ,以达到分批处理数据的目的,否则将会报错。

IF EXISTS(SELECT 1 FROM sys.views WHERE name='View_OrderInfo')
DROP VIEW View_OrderInfo
create view View_OrderInfo
as
select c.ContactName,c.CompanyName,o.OrderDate,o.ShipName,o.OrderID,o.Freight from [Orders] o inner join Customers c on o.CustomerID=c.CustomerID

会报错

必须是:

IF EXISTS(SELECT 1 FROM sys.views WHERE name='View_OrderInfo')
DROP VIEW View_OrderInfo
GO
create view View_OrderInfo
as
select c.ContactName,c.CompanyName,o.OrderDate,o.ShipName,o.OrderID,o.Freight from [Orders] o inner join Customers c on o.CustomerID=c.CustomerID

select count(*)  count(1) count(2) count('a') 之间的区别

count(*):找表中最短的列进行统计行数

count(1) count(2) count('a'):对常数列进行统计行数。它们的执行方式是一样的,没有任何区别。

很显然采用count(1) count(2) count('a')的方式,效率会更高,因为count(*)会先去算出最短的列,然后再去统计。虽然现在的Sqlserver查询分析器自动会帮我们做一些优化,但是我们必须知道它们的实现原理。

WITH (NOLOCK)

缺点:

  1.会产生脏读

  2.只适用于select查询语句

优点:

  1.有些文章说,加了WITH (NOLOCK)的SQL查询效率可以增加33%。

  2.可以用于inner join 或者left join等语句

脏读: 一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。

详细内容:

  要提升SQL的查询效能,一般来说大家首先会考虑建立索引(index)。其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。

不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read(脏读)。

例如:

SELECT o.OrderID,o.OrderDate,o.Freight,d.Quantity,d.UnitPrice
FROM [dbo].[Orders] o WITH (NOLOCK)
JOIN [dbo].[Order Details] d WITH (NOLOCK)
ON o.OrderID=d.OrderID

DELETE、INSERT、UPDATE这些需要transaction的指令就不能使用WITH (NOLOCK)。

加了WITH (NOLOCK)即告诉SQL Server,我们的这段SELECT指令无需去考虑目前table的transaction lock状态,因此效能上会有明显的提升,而且数据库系统的Lock现象会有明显的减少(包含Dead Lock)。

当使用NoLock时,它允许阅读那些已经修改但是还没有交易完成的数据。因此如果有需要考虑transaction事务数据的实时完整性时,使用WITH (NOLOCK)就要好好考虑一下。
如果不需考虑transaction,WITH (NOLOCK)或许是个好用的参考。

Sqlserver高效分页

在SQLserver2012之前,分页我们一般是使用ROW_NUMBER()。以获取第11条到第50条数据为例:

ROW_NUMBER()的实现方式:

select * from (select *, ROW_NUMBER() OVER(Order by a.OrderID DESC ) AS RowNumber from Orders as a) as bwhere RowNumber BETWEEN 11 and 50 

SQLserver2012中OFFSET & FETCH实现方式:

SELECT o.* FROM dbo.Orders o
ORDER BY o.OrderID DESC OFFSET 10 ROWS FETCH NEXT 40 ROWS ONLY

OFFSET & FETCH实现方式 更加精简更加高效。
使用 OFFSET-FETCH 中的限制

  • ORDER BY 是使用 OFFSET 和 FETCH 子句所必需的。
  • OFFSET 子句必须与 FETCH 一起使用。永远不能使用 ORDER BY … FETCH。
  • TOP 不能在同一个查询表达式中与 OFFSET 和 FETCH 一起使用。
  • OFFSET/FETCH 行计数表达式可以是将返回整数值的任何算术、常量或参数表达式。该行计数表达式不支持标量子查询 View Code

自己写的一个存储过程例子

 View Code

demo2:分页存储过程

 View Code
本文转自邹琼俊博客园博客,原文链接:http://www.cnblogs.com/jiekzou/p/5988099.html,如需转载请自行联系原作者

Sqlserver中一直在用又经常被忽略的知识点一相关推荐

  1. 简单介绍SQLserver中的declare变量用法

    这篇文章主要介绍了SQLserver中的declare变量用法,sql中declare是声明的意思,就是声明变量的,这个一般是用在函数和存储过程中的.感兴趣的可以来了解一下 平时写SQL查询.存储过程 ...

  2. sqlserver中能用when_sqlserver中if语句顶替when.case.语句

    sqlserver中if语句替代when...case..语句 create table Employees ( EmployeeID char(6) primary key not null, Na ...

  3. 关于Sqlserver中 BCP命令,实现数据导出功能。

    关于Sqlserver中 BCP命令,实现数据导出功能. exec master..xp_cmdshell 'bcp "select 账号 ,姓名, 账号 from datat.dbo.个人 ...

  4. SQLSERVER中统计所有表的记录数

    SQLSERVER中统计所有表的记录数 利用系统索引表sysindexes中索引ID indid<1的行中的rows列存有该表的行数这一特点.    方法是利用隐藏未公开的系统存储过程sp_MS ...

  5. 我是如何在SQLServer中处理每天四亿三千万记录的

    原文地址:http://www.cnblogs.com/marvin/p/HowCanIHandleBigDataBySQLServer.html 首先声明,我只是个程序员,不是专业的DBA,以下这篇 ...

  6. SQLServer中使用Split功能分割字符串

    一般的开发语言中,都有Split函数,可以将某个字符串按照分隔符进行分割,返回一个数组,非常方便. 但在SQLServer中,却没有默认提供Split函数,不过总有解决方案,以下是某大牛写的,比起网上 ...

  7. SQLSERVER中的网络配置

    关于sqlserver中的网络配置,以前也用sqlserver2005做过东西,有时连接出错时,不是baidu就是google,对于这些常见的东西,一点都不明白是什么意思,惭愧啊,今天看了本书,写的不 ...

  8. sqlserver中,如果正确得到中文的长度

    sqlserver中,如果正确得到中文的长度:             len('wangzhq')=7          len('代码')=2             正确:       data ...

  9. SQLServer中进行sql除法运算结果为小数时显示0的解决方案

    SQLServer中进行sql除法运算结果为小数时显示0的解决方案 参考文章: (1)SQLServer中进行sql除法运算结果为小数时显示0的解决方案 (2)https://www.cnblogs. ...

最新文章

  1. linux kvm usb设备,KVM客户机使用主机USB设备
  2. postDelayed总结
  3. 动圈耳机振膜_耳机中的动圈、动铁、圈铁都是什么意思 买哪种最好?
  4. python多线程队列和池_Python3 从零单排28_线程队列进程池线程池
  5. 【转】GitHub上README.md教程
  6. MyBatis foreach语句批量插入数据
  7. data fastboot 擦除_fastboot使用教程
  8. 使用思维导图提高工作效率的秘诀:6种工作思维导图模板分享
  9. 产品升级|10月产品捷报频传,解锁更多新成就!
  10. 饮料自动售货机模拟(小项目)
  11. wuc-tab标签点击不了_微信公众号新增标签功能,格力被中国移动取消竞标资格,全国电子无偿献血证上线,QQ新增辣椒酱表情,这就是今天的其他大新闻!...
  12. 阿里 + 京东 Java 岗面试题概要(面试须知
  13. linux 原子类型变量,linux 原子变量 - osc_m4jd02jn的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. ACL20|MART: Memory-Augmented Recurrent Transformer for Coherent Video Paragraph Captioning
  15. 服务器光信号闪红灯是什么意思,路由器上光信号闪红灯是什么意思
  16. 服务器显示正在重新连接,远程连接提示正在重新连接服务器
  17. OI中组合数学公式和定理90%歼灭
  18. Windows各个版本系统的官网地址
  19. 数据恢复陶工西数500GWD5000AAKX-08U6AA0摔敲盘不认紫色线圈磁头开盘恢复数据
  20. 刚给msn加上了对话自动翻译

热门文章

  1. 程序员如何优雅地使用 Mac? - OS X - 知乎
  2. Android 工程报错解决 Unable to resolve target 'android-17'
  3. WPS 导致 EXCEL 文件下载问题
  4. [C] zintrin.h: 智能引入intrinsic函数 V1.01版。改进对Mac OS X的支持,增加INTRIN_WORDSIZE宏...
  5. ios 小数保留位数
  6. ORACAL去除表中null转化为0
  7. matlab对矩阵的单个元素修改,怎么修改矩阵中的某些元素 或者简单点说保留矩阵中的元素...
  8. 横河压力变送器选型_压力变送器的原理和选型技巧
  9. topic是短语还是句子_英语七下unit 5 topic 3短语句子
  10. 在不久的将来,脑控机器人可以给我们喂水、给我们喂食