[转]SQL Server 高性能写入的一些总结
1.1.1 摘要 在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效、有可能是硬件或网络问题,也有可能是数据库设计的问题。 本篇博文将针对一些常用的数据库性能调休方法进行介绍,而且,为了编写高效的SQL代码
1.1.1 摘要
在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效、有可能是硬件或网络问题,也有可能是数据库设计的问题。
本篇博文将针对一些常用的数据库性能调休方法进行介绍,而且,为了编写高效的SQL代码,我们需要掌握一些基本代码优化的技巧,所以,我们将从一些基本优化技巧进行介绍。
本文目录 1.1.2 正文假设,我们要设计一个博客系统,其中包含一个用户表(User),它用来存储用户的账户名、密码、显示名称和注册日期等信息。
由于时间的关系,我们已经把User表设计好了,它包括账户名、密码(注意:这里没有考虑隐私信息的加密存储)、显示名称和注册日期等,具体设计如下:
-- ============================================= -- Author: JKhuang -- Create date: 7/8/2012 -- Description: A table stores the user information. -- ============================================= CREATE TABLE [dbo].[jk_users]( -- This is the reference to Users table, it is primary key. [ID] [bigint] IDENTITY(1,1) NOT NULL, [user_login] [varchar](60) NOT NULL, [user_pass] [varchar](64) NOT NULL, [user_nicename] [varchar](50) NOT NULL, [user_email] [varchar](100) NOT NULL, [user_url] [varchar](100) NOT NULL, -- This field get the default from function GETDATE(). [user_registered] [datetime] ()), [user_activation_key] [varchar](60) NOT NULL, [user_status] [int] 0)), [display_name] [varchar](250) NOT NULL )上面,我们定义了Users表,它包含账户名、密码、显示名称和注册日期等10个字段,其中,ID是一个自增的主键,user_resistered用来记录用户的注册时间,它设置了默认值GETDATE()。
接下来,我们将通过客户端代码实现数据存储到Users表中,香港服务器租用,具体的代码如下:
//// Creates a database connection. var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN1"].ToString()); conn.Open(); //// This is a massive SQL injection vulnerability, //// don't ever write your own SQL statements with string formatting! string sql = String.Format( @"INSERT INTO jk_users (user_login, user_pass, user_nicename, user_email, user_status,display_name, user_url, user_activation_key) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}')", userLogin, userPass, userNicename, userEmail, userStatus, displayName, userUrl, userActivationKey); var cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); //// Because this call to Close() is not wrapped in a try/catch/finally clause, //// it could be missed if an exception occurs above. Don't do this! conn.Close(); 代码中的问题上面,我们使用再普通不过的ADO.NET方式实现数据写入功能,但大家是否发现代码存在问题或可以改进的地方呢?
首先,我们在客户端代码中,创建一个数据库连接,它需要占用一定的系统资源,当操作完毕之后我们需要释放占用的系统资源,服务器空间,当然,我们可以手动释放资源,具体实现如下:
//// Creates a database connection. var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN1"].ToString()); conn.Open(); //// This is a massive SQL injection vulnerability, //// don't ever write your own SQL statements with string formatting! string sql = String.Format( @"INSERT INTO jk_users (user_login, user_pass, user_nicename, user_email, user_status,display_name, user_url, user_activation_key) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}')", userLogin, userPass, userNicename, userEmail, userStatus, displayName, userUrl, userActivationKey); var cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); //// If throws an exception on cmd dispose. cmd.Dispose(); //// conn can't be disposed. conn.Close(); conn.Dispose();假如,在释放SqlCommand资源时抛出异常,那么在它后面的资源SqlConnection将得不到释放。我们仔细想想当发生异常时,可以通过try/catch捕获异常,所以无论是否发生异常都可以使用finally检查资源是否已经释放了,具体实现如下:
SqlCommand cmd = null; SqlConnection conn = null; try { //// Creates a database connection. conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN1"].ToString()); conn.Open(); //// This is a massive SQL injection vulnerability, //// don't ever write your own SQL statements with string formatting! string sql = String.Format( @"INSERT INTO jk_users (user_login, user_pass, user_nicename, user_email, user_status,display_name, user_url, user_activation_key) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}')", userLogin, userPass, userNicename, userEmail, userStatus, displayName, userUrl, userActivationKey); cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); } finally { //// Regardless of whether there is an exception, //// we will dispose the resource. if (cmd != null) cmd.Dispose(); if (conn != null) conn.Dispose(); }通过上面的finally方式处理了异常情况是很普遍的,但为了更安全释放资源,使得我们增加了finally和if语句,那么是否有更简洁的方法实现资源的安全释放呢?
其实,我们可以使用using语句实现资源的释放,具体实现如下:

熱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)

Linux下system()函數的總結在Linux系統中,system()函數是一個非常常用的函數,它可以用來執行命令列指令。本文將對system()函數進行詳細的介紹,並提供一些特定的程式碼範例。一、system()函數的基本用法system()函數的聲明如下:intsystem(constchar*command);其中,command參數是一個字符

WindowsServerBackup是WindowsServer作業系統自帶的功能,旨在協助使用者保護重要資料和系統配置,並為中小型和企業級企業提供完整的備份和復原解決方案。只有執行Server2022及更高版本的使用者才能使用此功能。在本文中,我們將介紹如何安裝、解除安裝或重設WindowsServerBackup。如何重置Windows伺服器備份如果您的伺服器備份遇到問題,備份所需時間過長,或無法存取已儲存的文件,那麼您可以考慮重新設定WindowsServer備份設定。要重設Windows

解決PHP寫入txt檔案中文亂碼的技巧隨著網路的快速發展,PHP作為一種廣泛應用的程式語言,被越來越多的開發者所使用。在PHP開發中,經常需要對文字檔案進行讀寫操作,其中包括寫入中文內容的txt檔案。然而,由於編碼格式的問題,有時會導致寫入的中文出現亂碼。本文將介紹一些解決PHP寫入txt檔案中文亂碼的技巧,並提供具體的程式碼範例。問題分析在PHP中,文本

如何使用Swoole實現高效能的HTTP反向代理伺服器Swoole是一款基於PHP語言的高效能、非同步、並發的網路通訊框架。它提供了一系列的網路功能,可以用來實作HTTP伺服器、WebSocket伺服器等。在本文中,我們將介紹如何使用Swoole來實作一個高效能的HTTP反向代理伺服器,並提供具體的程式碼範例。環境配置首先,我們需要在伺服器上安裝Swoole擴展

Java中使用OpenCSV讀取和寫入CSV檔案的範例CSV(Comma-SeparatedValues)指的是以逗號分隔的數值,是一種常見的資料儲存格式。在Java中,OpenCSV是一個常用的工具庫,用於讀取和寫入CSV檔案。本文將介紹如何使用OpenCSV來實作讀取和寫入CSV檔案的範例。引進OpenCSV庫首先,需要引進OpenCSV庫到

PHP和WebSocket:建立高效能的即時應用程式隨著網路的發展和用戶需求的提升,即時應用程式變得越來越普遍。而傳統的HTTP協定在處理即時資料時會有一些限制,例如需要頻繁的輪詢或長輪詢方式來取得最新的資料。為了解決這個問題,WebSocket應運而生。 WebSocket是一種先進的通訊協議,它提供了雙向通訊的能力,允許瀏覽器和伺服器之間即時發送和接

C++是一種高效能的程式語言,可以為開發人員提供靈活性和可擴充性。尤其在大規模資料處理場景下,C++的高效率和快速運算速度是非常重要的。本文將介紹一些最佳化C++程式碼的技巧,以因應大規模資料處理需求。使用STL容器取代傳統數組在C++程式設計中,數組是常用的資料結構之一。但是,在大規模資料處理中,使用STL容器,如vector,deque,list和set等,可以更

隨著科技的不斷發展,語音辨識技術也得到了長足的進步與應用。語音辨識應用廣泛運用在語音助理、智慧音箱、虛擬實境等領域,為人們提供了更便利和智慧的互動方式。而如何實現高效能的語音辨識應用,則成為了一個值得探討的問題。近年來,Go語言作為一種高效能的程式語言,在語音辨識應用的開發中備受矚目。 Go語言具備並發性高、編寫簡潔、執行速度快等特點,非常適合用於建構高效能
