SQL参数化查询的另一个理由 命中执行计划
为了提高数据库运行的效率,我们需要尽可能的命中执行计划,这样就可以节省运行时间
1概述SQL语言的本质就是一串伪代码,表达的是做什么,而不是怎么做的意思。如其它语言一样,SQL语句需要编译之后才能运行,所以每一条SQL是需要通过编译器解释才能运行的(在这之间还要做SQL的优化)。而这些步骤都是需要运行成本,所以在数据库中有一个叫做执行计划的东西,编译器会将编译过后的SQL存入执行计划当中,当遇到同样的SQL时,就直接调用执行计划来执行,而不需要再次编译。
通过对上面执行计划的认识,为了提高数据库运行的效率,我们需要尽可能的命中执行计划,这样就可以节省运行时间。
2相关SQL
2.1查看当前数据库中所有的执行计划:
代码如下:
SELECT cp.usecounts AS '使用次数'
,objtype AS '类型'
,st.[text] AS 'SQL文本'
,plan_handle AS '计划句柄'
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
WHERE st.text not like '%sys%'
2.2删除执行计划
代码如下:
--删除所有计划
DBCC FREEPROCCACHE
2.3测试脚本(创建员工表,并向其插入1000条数据)
代码如下:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Employee]'))
DROP TABLE [dbo].Employee
GO
--人员表
CREATE TABLE dbo.Employee
(
id int,
name nvarchar(50)
);
--插入测试数据
DECLARE @I INT=0,@ENDI INT=1000;
WHILE(@IBEGIN
SET @I+=1;
INSERT dbo.Employee(id,name) VALUES(@I,'蒋大华'+CAST(@I AS NVARCHAR(20)));
END;
3测试执行计划
3.1 先执行删除所有执行计划,然后执行SELECT * FROM Employee ,最后查看执行计划(2.1中的查看执行计划脚本)如下图
即SQL SERVER会为每一条SQL建立一个执行计划,并将它缓存起来
3.2 再运行一次SQL: SELECT * FROM Employee,并查看执行计划
可以看到这个计划的重用次数为2,即这个计划被重用了;
3.3 修改SQL:SELECT * FROM Employee(在SELECT后多加一个空格),执行并查看执行计划
结果又新添加一个执行计划,即SQL SERVER认为这是两个不同的SQL语句并分别建立了执行计划;
4重用执行计划——使用参数化查询方法
4.1 未参数化SQL
代码如下:
string selectCmdText = string.Format(@"SELECT * FROM Employee WHERE name='{0}'",” 蒋大华1”);
SQLHelper.ExecuteNonQuery(SQLHelper.DefaulConnectiontString, System.Data.CommandType.Text, selectCmdText, null);
查看执行计划:
即当执行一个未参数化SQL时,SQL SERVER需要先将其转换成一个参数SQL并执行它。一共需要两执行计划
然后再执行下面的代码(查询的条件变了)
代码如下:
string selectCmdText = string.Format(@"SELECT * FROM Employee WHERE name='{0}'",” 蒋大华2”);
SQLHelper.ExecuteNonQuery(SQLHelper.DefaulConnectiontString, System.Data.CommandType.Text, selectCmdText, null);
查看执行计划
此时不需要再准备一个准备的SQL,但还是需要再产生一个执行计划,并缓存下来;
4.2 参数化SQL
代码如下:
SqlParameter[] param = { new SqlParameter("@name", txtEmployeeName.Text.Trim()) };
string selectCmdText = string.Format(@"SELECT * FROM Employee WHERE name=@name");
SQLHelper.ExecuteNonQuery(SQLHelper.DefaulConnectiontString, System.Data.CommandType.Text, selectCmdText, param);
输入参数并执行,然后查看执行计划:
只需要一个准备SQL,然后,输入不同的参数,并执行,再查看执行计划
重用执行计划,perfect...
5总结
总的来说,SQL语句在执行时,会生成执行计划并将它缓存起来,我们可以通过提高使用缓存中的执行计划次数,来减少数据库的压力。而使用参数化的SQL是一个很好的选择,参数化查询的作用不仅只有防止SQL注入,还可以提高缓存中执行计划使用次数。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

對於不熟悉的人來說,低功耗模式會減少Mac 的能源使用,可能會延長電池壽命,但會暫時犧牲性能,但它的處理得很好,對於大多數用戶來說,他們不會注意到任何特別的退化。如果您是 Mac 筆記型電腦用戶,並試圖從 MacBook Pro 或 Air 中獲得盡可能長的電池壽命,那麼這是一個非常有用的模式。從命令列啟用 Mac 低功耗模式從終端,在任何 Mac 筆記型電腦上鍵入以下命令字串:sudo pmset -a lowpowermode 1按 sudo 的要求按回車鍵並輸入管理員密碼進行身份驗證。

很多使用win10系統的小夥伴在玩遊戲或裝系統的時候有遇見過這個問題,應用程式無法啟動,因為應用程式的並行配置不正確。有關詳細信息,請參閱應用程式事件日誌,或使用命令列sxstrace.exe工具。這可能是作業系統沒有對應權限的緣故,具體的教學下面一起來看看吧。使用命令列sxstrace.exe工具的教學1、該問題通常會在安裝程式、遊戲的時候出錯,其提示為:應用程式無法啟動,因為應用程式的並行配置不正確。有關詳細信息,請參閱應用程式事件日誌,或使用命令列sxstrace.exe工具。 2、開始→

本文詳細介紹了將Ubuntu20.04升級到22.04的步驟。對於使用Ubuntu20.04的用戶,錯過了22.04版本帶來的新功能和優勢。為了獲得更好的體驗和安全性,建議及時升級到較新的Ubuntu版本。 Ubuntu22.04的代號為“傑米水母”,讓我們一起來探索如何取得最新的LTS版本吧!如何透過命令列將Ubuntu20.04升級到22.04掌握命令列會為你帶來優勢。雖然透過GUI更新Ubuntu是可能的,但我們的重點將是透過命令列。首先,讓我們使用以下命令檢查目前運行的Ubuntu版本:$

隨著Linux作業系統的廣泛應用,越來越多的人開始需要學習和了解Linux系統中的基本命令和捷徑。在本文中,我們將介紹一些常用的Linux指令和快捷方式,幫助初學者了解Linux系統,提高工作效率。常用指令1.1ls指令ls指令是Linux中最常用的指令之一。它主要用於列出目前目錄下的檔案和子目錄。常用的選項有:-l:以長格式顯示文件訊息,包括文件類型

在Python中,可以透過命令列傳遞參數給腳本。這些參數可以在腳本內部使用,以便根據不同的輸入執行不同的操作。 Python命令列參數的詳解:1、位置參數:在命令列中依照順序傳遞給腳本的參數,它們可以在腳本內部透過位置來存取;2、命令列選項:以-或--開頭的參數,通常用於指定腳本的特定選項或標誌;3、傳遞參數值:透過命令列傳遞參數值。

Django專案開啟之旅:從命令列開始,創建你的第一個Django專案Django是一個強大且靈活的網路應用框架,它以Python為基礎,提供了許多開發Web應用所需的工具和功能。本文將帶領你從命令列開始,創建你的第一個Django專案。在開始之前,請確保你已經安裝了Python和Django。步驟一:建立專案目錄首先,開啟命令列窗口,並建立新的目錄

javac不是內部或外部命令也不是可運行的程式的解決方法: 1、首先官網下載JDK的最新版本並安裝;2、進行系統環境變數配置,在path中添加jdk安裝的路徑;3、進入電腦命令行介面,輸入「java -v」出現版本號碼即可。

如何透過Linux命令列工具進行日誌聚合和統計?在管理和維護Linux系統時,日誌記錄是非常重要的一項工作。透過日誌可以查看系統運作、排查問題以及進行效能分析。而對於大規模的系統,日誌的數量往往非常龐大,如何有效率地對日誌進行聚合和統計,成為了維運人員面臨的一個挑戰。在Linux系統中,我們可以利用命令列工具來進行日誌聚合和統計。以下將介紹幾個常用的命令列
