2012-03-26 5 views
1

XMLファイルにinactive_productsのリストがあります。私は非アクティブな製品のリストに基づいてDBにある製品の "アクティブ"(ブール値)フィールドを更新する必要があります。しかし、非アクティブな製品のリストには、私のDBにさえいない多くの製品が含まれています。アクティブでない製品のリスト全体でWHERE IN句を使用してUPDATE文を実行するほうが速いのでしょうか?または、非アクティブな製品のリストをアクティブな製品のCSVファイルと最初に比較して関連する非アクティブな製品を取得し、代わりにこのフィルタリングされたリストをすべて含むUPDATE文を実行しますか?WHERE IN句を使用したSQL更新クエリは、パフォーマンスに問題がある可能性のある行IDが多分含まれていますか?

私の最初の考えは、SQLにそのフィルタリングされたリストを処理させるだけで、技術的に正しい答えは何ですか?

答えて

1

IN演算子の値の長いリストを回避する1つの方法は、代わりに一時テーブルにジョインすることです。 OracleがINに対して1000以上の値をサポートしていなかったのを回避する回避策でした。

あなたはこの

SELECT * FROM mytable WHERE column IN (value1, value2, ..., valueN) 

のようなクエリは、その後でそれを交換している場合:漸近的に、これは(少なくともOracleの中で)を使用するよりも良好に機能する必要があり

CREATE TEMPORARY TABLE temp_table AS 
SELECT column FROM <source that contains value1, value2, ..., valueN> 

SELECT * FROM mytable JOIN temp_table ON (mytable.column = temp_table.column) 

+0

ソースがXMLファイルであり、SQLテーブルではない場合はどうなりますか? XMLファイルから一時テーブルを作成するだけですか?また、2つのテーブルの間で一致する行を更新するには、どのステートメントを実行できますか? – blacktie24

+0

xmlはxmlです - あなたはそのデータを何らかの方法でデータベースに取得する必要があります(何とかそれらをあなたのsql IN演算子に手に入れましたか?) – topchef

+0

すぐにgoogled "update join mysql" //www.electrictoolbox.com/article/mysql/cross-table-update/ – topchef

1

SQLをフィルタリングすることをお勧めします。これは、基本的にはデータベースを大変なものにしてしまいますが、より良いパフォーマンスを得るためにはidカラムにインデックスがあることを確認してください。

これが遅すぎる場合は、最初にリストをフィルタリングすることができます。

関連する問題