在開發過程中,我們不時會遇到系統性能瓶頸問題,而引起這一問題原因可以很多,有可能是代碼不夠高效、有可能是硬件或網絡問題,也有可能是數據庫設計的問題。
本篇博文將針對一些常用的數據庫性能調休方法進行介紹,而且,為了編寫高效的SQL代碼,我們需要掌握一些基本代碼優化的技巧,所以,我們將從一些基本優化技巧進行介紹。
本文目錄假設,我們要設計一個博客系統,其中包含一個用戶表(User),它用來存儲用戶的賬戶名、密碼、顯示名稱和注冊日期等信息。
由于時間的關系,我們已經把User表設計好了,它包括賬戶名、密碼(注意:這里沒有考慮隱私信息的加密存儲)、顯示名稱和注冊日期等,具體設計如下:
1234567891011121314151617181920 | -- ============================================= -- 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] NOT NULL CONSTRAINT [DF_jk_users_user_registered] DEFAULT (getdate()),
[user_activation_key] [ varchar ](60) NOT NULL ,
[user_status] [ int ] NOT NULL CONSTRAINT [DF_jk_users_user_status] DEFAULT ((0)),
[display_name] [ varchar ](250) NOT NULL ) |
圖1 Users表設計
上面,我們定義了Users表,它包含賬戶名、密碼、顯示名稱和注冊日期等10個字段,其中,ID是一個自增的主鍵,user_resistered用來記錄用戶的注冊時間,它設置了默認值GETDATE()。
接下來,我們將通過客戶端代碼實現數據存儲到Users表中,具體的代碼如下:
12345678910 | //// 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方式實現數據寫入功能,但大家是否發現代碼存在問題或可以改進的地方呢?
首先,我們在客戶端代碼中,創建一個數據庫連接,它需要占用一定的系統資源,當操作完畢之后我們需要釋放占用的系統資源,當然,我們可以手動釋放資源,具體實現如下: