在開發過程中,我們不時會遇到系統性能瓶頸問題,而引起這一問題原因可以很多,有可能是代碼不夠高效、有可能是硬件或網絡問題,也有可能是數據庫設計的問題。
本篇博文將針對一些常用的數據庫性能調休方法進行介紹,而且,為了編寫高效的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方式實現數據寫入功能,但大家是否發現代碼存在問題或可以改進的地方呢?
首先,我們在客戶端代碼中,創建一個數據庫連接,它需要占用一定的系統資源,當操作完畢之后我們需要釋放占用的系統資源,當然,我們可以手動釋放資源,具體實現如下:
| 1234567891011 | //// 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.Di |