只有累積,沒有奇蹟

顯示具有 SQL Server 標籤的文章。 顯示所有文章
顯示具有 SQL Server 標籤的文章。 顯示所有文章

2022年3月2日 星期三

[sharing] MS T-SQL 效能調教從放棄到入門

分享
自己在過去開發經驗都是以 C# 與 ASP.NET 為主,在與資料庫溝通時都是自己寫 T-SQL 查詢語法使用 Stored procedure 讀取需要的資料,身為工程師就必須特別留意自己撰寫語法的效能問題,盡量避免寫出來的語法效能不佳影響到 Database 或是網站的運行,自己過去工作經驗也遇到公司使用很頂級的伺服器依舊存在效能不彰的問題,因此效能調教部分個人覺得也是資深工程師的必備的技能之一。
下面是前一份工作與同事分享的投影片,主要內容是分享自己覺得在 MS SQL 語法的一些基本觀念,後面也有帶到微軟針對效能調教的一些建議方向 Improving .NET Application Performance and Scalability 以及如何觀看語法的執行計畫基本觀念,提供給有興趣的朋友也希望可以幫助到各位 :)

2019年11月29日 星期五

[NET] Execution of user code in the .NET Framework is disabled. Enable "clr enabled" configuration option.

問題 
最近運氣很旺在開發專案時常遇到詭異的案例,前幾天在家裡趕專案時在使用 Visual Studio 2019 開發專案要啟動連接到 Database 時跳出 'Execution of user code in the .NET Framework is disabled. Enable "clr enabled" configuration option.'  第一次遇到這問題覺得挺有趣的,雖然解決方法很簡單但還是簡單紀錄一下處理的過程,若是有不清楚或是錯誤的地方歡迎討論予糾正。

異常現場
異常發生時跳出訊息內容如下
相信對 .NET Framework 有點熟系的都知道 / 聽過 CLR,在微軟 MSDN 與 wiki 分別都有針對 CLR 作為介紹與說明,在此引用 wiki 對 CLR 的定義如下 (相較之下微軟的說明太技術了些)
通用語言執行平台(Common Language Runtime,簡稱CLR)是微軟為他們的.NET的虛擬機器所選用的名稱。它是微軟對通用語言架構(CLI)的實作版本,它定義了一個程式碼執行的環境。CLR執行一種稱為通用中間語言的位元組碼,這個是微軟的通用中間語言實作版本。
SQL Server 2005 開始提供 CLR integration 功能,我們可以透過下列指令取得目前 clr enable 的狀況 
EXEC sp_configure 'clr enabled' 
查詢後可以看到目前系統中 clr enable 的設定
欄位說明如下

  • name : 設定的名稱
  • minimum : 設定的最小值
  • maximum : 設定的最大值
  • config_value : 配置設定的值
  • run_value : 當前設定值


  • 解決方案
    輸入以下指定,開啟 clr enable 
    EXEC sp_configure 'clr enabled', 1
    RECONFIGURE 
    更新後即可重新查詢更新後的值,即可發現更新成功


    大功告成,宣告結案  :)

    參考
    ASP.NET Core 中的 Kestrel 網頁伺服器實作
    SQL Error – Execution of user code in the .NET Framework is disabled. Enable “clr enabled” configuration option
    How to Enable SQL Server CLR Integration using T-SQL

    2019年8月14日 星期三

    [SQL] 使用 Universal Data Link (.udl) 快速測試資料庫連線

    問題 
    這幾天同事開發的應用程式佈署到 Production 機器時,發現原本在測試機器可以運行的功能到正式環境的機器後就無法正常使用,懷疑部署到的機器是否無法正常連到正式環境 Database,這篇就來分享遇到此問題時該如何進行確認 Database 連線字串的動作,也感謝之前主管傳授此密技來快速測試連線字串,這邊若有謬誤或是更快的方法歡迎留言一起討論。

    解決方案 
    一般第一個想到的方式可以開啟命令提示字元,輸入 ping 或是 telnet 查看資料庫的 IP 是否正常,這方式相信很簡單大家都懂就不在多介紹,這裡介紹另一種方式可以透過 Windows 內建的  .udl  檔案 Universal Data Link,可以不用輸入指令方便的進行資料庫連線字串的確認,使用方式如下

    新增 .udl 
    Step 1 : 在桌面按滑鼠右鍵 > 選擇新增 > 檔名輸入  connect.udl  
    Step 2 : 點擊剛剛新增好的檔案 connect.udl,會跳出熟悉的畫面
    Step 3 : 接著與一般使用方式相同,可以在選擇伺服器名稱後按右下角 測試連線 的功能,查看在此機器是否可正常連到資料庫

    另外,我個人習慣會在連線設定修改 連線逾時 的秒數設定,可以到 進階選單進行調整,以加速整個測試連線字串的時間

    透過建立 udl 檔案的方式,可以達到快速測試連線字串的目的,如果跟我有一樣的需求可以參考嘗試看看 :) 

    參考
    Universal Data Link (UDL) configura

    2019年7月15日 星期一

    2019年3月15日 星期五

    [MSSQL] 在 T-SQL 使用 PATINDEX 搜尋關鍵字

    前言
    今天接到個任務,需要在 MSSQL 資料表中找出特定規則的資料內容,看到搜尋格式直覺可以用 Regualr Expression 輕鬆解決,之前使用 Regualr Expression 都是在前端 Javascript 或是 C# 上使用,尚未在 T-SQL 中寫過,經過研究之後在 SQL 中可以使用 PATINDEX 方法可達到同樣目的且結果正確,以下就針對今天學到的內容做說明與介紹,若有問題歡迎提出一起討論或是給予指導

    PATINDEX 介紹
    一開始我們可以先來看一下 PATINDEX 方法 API 
    PATINDEX ( '%pattern%' , expression ) 
     pattern  : 要搜尋的 key word,前後需要用 %%包起來 (第一個字元或最後一個不用加%),限制 8000 字元
     expression  : 被搜尋的內容
     return  : int,搜尋內容的位置
    相信光看沒有感覺,以下列出目前所想到的情境做介紹

    Case 1 : 使用 %搜尋特定關鍵字
    在 Hello world 字串中找尋 'lo' 關鍵字,並返回關鍵字位置 
    Declare @input varchar(20) = 'Hello world!'  
    SELECT PATINDEX('%lo%', @input) 
    -- result : 4 

    Case 2 : 使用 [] 搜尋特定關鍵字
    在 A123456789 字串中找尋 英文開頭 ( 左邊沒加上%),以及英文字母在中間及最右邊位置,都可正常找到並返回關鍵字位置  
    Declare @input varchar(20) = 'A123456789'  
    SELECT PATINDEX('A-z%', @input) 
    -- result : 1
    
    Declare @input2 varchar(20) = '123456789A'  
    SELECT PATINDEX('%[A-z]', @input2) 
    -- result : 10
    
    Declare @input3 varchar(20) = '123456Q789'  
    SELECT PATINDEX('%[A-z]%', @input3) 
    -- result : 7

    Case 3 : 在 Where 中過濾條件
    使用北風資料庫的 customer 的 PostalCode 欄位,搜尋欄位內容為數字的資料
    SELECT TOP 100 *
    FROM [Northwind].[dbo].[Customers]
    WHERE PATINDEX('[0-9]%', PostalCode) > 0
    搜尋前
    搜尋後


    Case 4 : 搭配 Case When 使用
    接著繼續使用北風資料庫的 customer 的 Phone 欄位,希望搜尋欄位為 (數字) 的電話,如果是的話顯示 O不是則顯示 X,如下所示
    SELECT TOP 100 phone, 
      CASE WHEN PATINDEX('%([0-9])%', Phone) > 0
      THEN 'O' ELSE 'X' end AS 'Phone2'
    FROM [Northwind].[dbo].[Customers]
    
    搜尋結果

    Performance
    在 MSDN 有提到, PATINDEX  工作原理就像  LIKE ,因此我在上述範例四用 LIKE 語法改寫,再加上開啟 SSMS 執行計畫觀察效能情況

    -- PATINDEX
    SELECT TOP 1000 phone, 
      CASE WHEN PATINDEX('%([0-9])%', Phone) > 0
      THEN 'O' ELSE 'X' end AS 'PhoneFormat', *
    FROM [Northwind].[dbo].[Customers]
    
    -- LIKE
    SELECT TOP 1000 phone, 
      CASE WHEN Phone LIKE '(%' 
      THEN 'O' ELSE 'X' end AS 'PhoneFormat'
    FROM [Northwind].[dbo].[Customers]
    抓出來的資料相同且從執行計畫看起來兩者分別 query cost 各為 50%,就初步觀察並無太大差異,或許之後可以最更進一步的測試與研究來看 performance 的影響

    感想
    在 MSSQL 中提供很多功能可以達到想要的目的,但其實在使用的背後犧牲的或許是 CPU 或是 Memory 的成本,因此在思考時或許可以看是否可以在前端或是 API 時就進行檢查的動作,或是再使用前更加了解語法對 performance 的影響,讓 Database 可以發揮更大的作用及正確的使用方式 :)
      參考
      PATINDEX(Transact-SQL)

      Copyright © m@rcus 學習筆記 | Powered by Blogger

      Design by Anders Noren | Blogger Theme by NewBloggerThemes.com