Sqlserver中一直在用又經常被忽略的知識點一

来源:http://www.cnblogs.com/jiekzou/archive/2016/10/24/5988099.html
-Advertisement-
Play Games

已經有快2個月沒有更新博客了,實在是因為最近發生了太多的事情,辭了工作,在湘雅醫院待了一個多月,然後又新換了工作...... 在平時的工作中,Sqlserver中許多知識點是經常用到的,但是有時候我們往往忽略了它們,在過去的一年裡,一直使用的是Mysql,現在又開始接觸Sqlserver了,所以就把 ...


已經有快2個月沒有更新博客了,實在是因為最近發生了太多的事情,辭了工作,在湘雅醫院待了一個多月,然後又新換了工作......

在平時的工作中,Sqlserver中許多知識點是經常用到的,但是有時候我們往往忽略了它們,在過去的一年裡,一直使用的是Mysql,現在又開始接觸Sqlserver了,所以就把一些常用又容易忽視的Sqlserver知識點總結一點,以便備忘之用。

所有的操作都將基於Northwind資料庫來進行操作。

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)或許是個好用的參考。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •  ...
  • (六)與系統交互 6.1後臺通知 1.關於後臺通知,下麵展示6種樣式。值得一提的是,筆者的小米5只能顯示基本樣式,雷軍真是良心廠商啊。 2.首先上佈局xml 3.接著是完整代碼 6.3定時執行周期任務 1.AlarmManager用來管理和執行任務,可以在程式沒有運行的時候執行。並且有多種啟動和計算 ...
  • 清理單個應用緩存 通過反射調用方法 需要許可權:android.permission.DELETE_CACHE_FILES. 以上許可權為系統許可權,手機衛士應用為用戶應用,不能拿到此許可權 換思路: 調用系統清除緩存的界面,讓用戶在系統清除緩存界面實現清除邏輯 查找系統清除緩存的界面方法: ...
  • (四)實現設備硬體交互與媒體交互 4.6自定義攝像頭覆蓋層 1.將Camera中的內容實時的繪製到SurfaceView中 若要自定義拍攝界面,只要重新定義surface的界面即可 以下展示全部代碼 2.改變拍攝方向,調用setDisplayOrientation(90)後,拍攝方向方向才會垂直顯示 ...
  • 來自sqlite3源碼 /*** Compute a string length that is limited to what can be stored in** lower 30 bits of a 32-bit signed integer.**** The value returned w... ...
  • (1):Android體繫結構; 應用程式層(Applications), 應用程式框架層(Application Framework),系統運行庫層(Librarries),Linux內核層(Linux Kernel); (2)Android項目中文件夾的作用: 存放一些資源文件的信息,用於讀取文 ...
  • 關於Android程式的構架, 當前(2016.10)最流行的模式即為MVP模式, Google官方提供了Sample代碼來展示這種模式的用法. 本文為閱讀官方sample代碼的閱讀筆記和分析. ...
  • MySQL5 中添加了存儲過程的支持。 大多數SQL語句都是針對一個或多個表的單條語句。並非所有的操作都怎麼簡單。經常會有一個完整的操作需要多條才能完成 存儲過程簡單來說,就是為以後的使用而保存的一條或多條MySQL語句的集合。可將其視為批文件。雖然他們的作用不僅限於批處理。 為什麼要使用存儲過程: ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...