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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...