2010-12-05 7 views
2

以下は、いくつかのオブジェクトの属性の大部分を取得するためのクエリです。とにかくそれを最適化し、短縮するには?ユニオンクエリの最適化と短縮

SELECT object_id, value, name FROM attr_text WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_varchar WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_int WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_decimal WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_datetime WHERE object_id IN ('43', '42', '41', '40', '39') 

結果:

43 red color1 
43 blue color2 
43 small size 
42 black color1 
42 big size 
+0

識別子でキー入力されたデータ型別の名前付き属性のリストは、SQLテーブルのジョブのように聞こえます。 – Hamish

答えて

2

あなたが作ることができる最も明白な改善が賢明なスキーマを使用することです。

これはオプションではないと私は、おそらく同じ名前と値で複数の属性を持っていないのでUNIONUNION ALLに変更することをお勧めします。 UNION [DISTINCT]は不必要な比較を実行するだけです。いずれにしても、同じ名前の属性は処理されておらず、現在のクエリではと異なるの値が使用されています。

+0

こんにちは、賢明なスキーマの詳細を説明できますか?申し訳ありませんが、英語は私のL2です。 Btw、unionは、重複したコンテンツをチェックしないため、すべてが高速になる可能性があります。ありがとうございました。 – StoneHeart

+2

@StoneHeart:あなたのアプリケーションについてもっと知らなくても、あなたのスキーマがどのようになっているかをお勧めすることはできませんが、EAVと非常によく似ていることを知っておく必要があります。それについて読むことをお勧めします。 http://en.wikipedia.org/wiki/Entity-attribute-value_modelそして、私はEAVがあなたのアプリケーションに適したアプローチであるかどうかを検討することをお勧めします。b)EAVのバリエーションが標準EAVアプローチ。 –

1

私もあなたにできる最良の改善は正気なスキーマを使用することです。あなたのようなので、あなたのオブジェクトの列の個別のリストを定義することができる場合詳述すると、それは非常にあなたのSQLを簡素化し、パフォーマンスを向上させるでしょう:

create table [Object] (
    [object_id] [int] IDENTITY(1,1) NOT NULL, 
    [color1] [varchar](255) null, 
    [color2] [varchar](255) null, 
    [size] [varchar](255) null 
    ... any other properties.... 
) 

alter table Object 
add constraint PK_object_id 
primary key clustered (
    object_id 
) 

次に、あなただけの簡単な選択を使用して、すべてのオブジェクトを選択することができます。

select * from object where object_id in ('43', '42', '41', '40', '39') 
関連する問題