2011-07-29 12 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が遅いですか?

EDIT:Updateコマンド:

"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

ミリ秒で発生すると予想される場合は、いくつかのインデックスを追加しますか? 100万レコードのテーブルでフル・テーブル・スキャンを実行する必要がある場合は、それが高速であるとは思わない。 :p – Dismissile

答えて

7

あなたのID列の主キーを作成します。主キーは自動的にインデックスになります。あなたのような、単純な更新ステートメントを実行している場合:

UPDATE customers SET <something> WHERE id = @id 

次に、このINDEXはSEEKとはるかに速くなり実行する必要があります。その索引がなければ、INDEX SEEKまたはINDEX SCAN(大量の行を更新する場合に発生する)よりも長いオーダを取るTABLE SCANで更新しています。

もう1つのトリックは、更新ステートメントをSQL Serverで実行し、実行計画を確認することです。これは、ボトルネックがどこにあるかを示します。また、クエリオプション|高度な|出力タブに表示する統計を設定します。

+0

完全に同意します。それがインデックスの対象です。 –

+1

'PRIMARY KEY'と' UNIQUE'は両方とも制約とインデックスです! – a1ex07

+0

はい、UNIQUE制約はクラスタ化できません。大量のデータに対してより良いインデックスを得るためには、UNIQUE制約の上にクラスタード・インデックスを追加する必要があります。 – Josh

-2

TRY -

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

興味があるだけ...

+0

なぜExecuteReader()はUPDATEコマンドを実行するのですか?このアプローチがより速くなると思われる理由を説明できますか? –

0

私はあなたが(uniqueはデフォルトで、クラスタ化されて)インデックスをクラスタ化されていないので、SQL Serverはヒープ上の非クラスタ化インデックスを使用していますので、それはだと思います更新のためのあなたの記録を見つけるために(UNIQUEはインデックスです)。 Idは、プライマリキー(デフォルトではクラスタ化されている)でなければなりません。UNIQUEではありません。