2011-07-29 52 views
0

請幫我加快桌面上的UPDATE操作。 表具有唯一的ID,用於查找記錄並更新其字段。 表中有1M條記錄。沒有使用索引。只有唯一的ID。 插入需要一些時間..我期待毫秒。加快UPDATE操作

表結構:

create table customers 
(
    id int IDENTITY(1,1) UNIQUE NOT NULL, 
    phonenum varchar(15) UNIQUE NOT NULL, 
    date datetime, 
    company varchar(150), 
    full_name varchar(150), 
    address varchar(150), 
    street varchar(100), 
    zip varchar(100), 
    city varchar(100), 
    info varchar(300), 
    op_data varchar(150), 
    op_date datetime, 
    op_user_taken varchar(100), 
    op_time_taken datetime, 
    op_status varchar(100), 
    user_taken varchar(100), 
    time_taken datetime, 
    status varchar(100),   
    ); 

我使用的SqlConnection System.Data.SqlClient.SqlConnection和ExecuteNonQuery方法來更新記錄。

我的表需要重新設計還是ExecuteNonQuery太慢?

編輯:更新命令:

"UPDATE customers SET [email protected], [email protected], 
[email protected], [email protected], [email protected], 
[email protected], [email protected], [email protected], 
[email protected], [email protected] , status=\'Completed\', 
[email protected] WHERE [email protected]"; 
+1

我們可以看到UPDATE語句的例子嗎? – n8wrl

+0

向我們顯示您的更新聲明。如果您要更新所有1M行,那麼是的,這需要一些時間。 –

+0

如果你期望它發生在毫秒內,然後添加一些索引?如果必須在一百萬條記錄的表格中進行全表掃描,那麼不要指望它速度很快。 :p – Dismissile

回答

7

讓你的id列主鍵。主鍵自動成爲索引。如果你正在運行一個簡單的更新語句,例如:

UPDATE customers SET <something> WHERE id = @id 

然後這應該運行一個INDEX SEEK並且要快得多。如果沒有該索引,則使用TABLE SCAN進行更新,該索引比INDEX SEEK或INDEX SCAN(如果您要更新大量行時會發生這種情況)會更長。

另一個訣竅是採取您的更新語句,並在SQL Server中運行它並查看執行計劃。這會告訴你瓶頸在哪裏。此外,你可以去查詢選項|高級|並設置統計信息以顯示在輸出選項卡中。

+0

完全同意,這是索引的目的。 –

+1

'PRIMARY KEY'和'UNIQUE'都是約束和索引! – a1ex07

+0

是的,但是不能將UNIQUE約束集羣化。他還需要在UNIQUE約束之上添加一個聚集索引,以實現更好的大量數據索引。 – Josh

-2

嘗試 -

using (SqlCommand comm = new SqlCommand("update sql", conn)) 
{ 
     SqlDataReader results = (SqlDataReader)comm.ExecuteReader(); 
} 

只是好奇...

+0

爲什麼ExecuteReader()運行UPDATE命令?你能解釋爲什麼你認爲這種方法會更快嗎? –

0

我想這是因爲你沒有聚集索引(unique默認情況下,非聚簇),那麼SQL Server使用非聚集索引上堆找到您的記錄進行更新(UNIQUE是一個索引)。 Id應該是主鍵(默認情況下爲集羣),而不是UNIQUE