2011-07-29 121 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