0

私は2つのテーブルを持っています:

1. PersonAddressList [About 5,000 records]
   Columns:
   ID int
   TITLE varchar
   CITY varchar

2. CityList [About 5,000 recods]
   Columns:
   ID int
   City_Name varchar
   City_State int //[RK to State]

以前の設計者は、テーブル 1 [personaddresslist] に都市名を直接追加していました。今、私はそれを正規化し、表1の都市名を表2の都市IDに置き換えています

私が使用したクエリ:

personaddresslist を更新し、CityList を CITY = cityList.ID に設定します。ここで、CITY = City_name

上記のクエリは、テーブルのデータが少ない場合は適切に実行されますが、両方のテーブルに大量のデータがある場合はローリングを続けます。私の実際のシナリオでは、各テーブルに約 5000 レコードの中程度のデータ セットを作成します。

では、どうすればうまく調整できるでしょうか。

よろしく、カビンドラ

編集 1: 上記のクエリの結果については、スクリプトの実行を完了するのに 40 分近くかかりました。他のテーブルでも同様のスクリプトを実行する必要があるため、微調整して高速化したいと考えています。

4

1 に答える 1

0

テーブルを高速化するには、いくつかの変更とインデックスが必要です。

  • 最初cityPersonAddressList テーブルに格納していて、データ型はvarcharインデックス化されていても、両方のテーブルでデータ型が異なるため、決して使用しません。
  • 次に、適切なインデックスを使用します。

私はから始めます

alter table PersonAddressList add index city_idx(CITY);
alter table CityList add index City_Name_idx(City_Name);

次に、次の更新コマンドを使用します

update PersonAddressList p 
join CityList c on c.City_Name = p.CITY
set p.CITY = c.ID

上記のクエリは高速になります。インデックスを適用する前に、 と の両方が同じサイズの同じデータ型であることを確認してCITYくださいCity_Name

データが更新されたら、構造を修正する必要があります

drop index city_idx from PersonAddressList ;

alter table PersonAddressList change CITY CITY int ;

alter table PersonAddressList add index city_idx(CITY);

最後に、CityList IDインデックスが作成されていることを確認し、主キーである可能性が最も高い場合は、デフォルトでインデックスが作成されます。

于 2014-12-23T07:31:04.800 に答える