1

これは、実際の SQL アプリケーションの問題の例です。私は SQL の新しいユーザーです。

SELECTミシガン州に住むすべての非テスト アカウントの名前のリストを返し、それが返すものを含む(SQL) ステートメントを設計します。

Table: CustomerAcct_tab 

  id    first_name  last_name   address_id  account_type_code
 234    John        Smith       123         A
 342    Mary        Ryan        223         C
 210    Mark        Jackson     398         B
 678    Bill        Monroe      232         C
 789    JoAnne      Hill        300         D

 Table: Address_tab 

  id    State   
 123    MI  
 223    TX  
 398    CA  
 232    MI  
 300    CA  

 Table: AccountType_tab 

 code   is_test_account 
   A    TRUE    
   B    FALSE   
   C    FALSE   
   D    TRUE    

私の解決策:

SELECT first_name, Last_name
FROM CustomerAcct_tab
INNER JOIN Address_tab ON CustomerAcct_tab.address_id = Address_tab.id 
INNER JOIN AccountType_tab ON CustomerAcct_tab.account_type_code = AccountType_tab.code 
WHERE is_test_account = FALSE AND Address_tab.State = MI

しかし、それは正しくないかもしれないと思います。

私の同僚は、CustomerAcct_tab のいくつかのインデックスを作成する必要があることを提案しました。

4

2 に答える 2

1

このクエリに合わせてインデックスを作成する方法と場所を尋ねている場合は、次のことをお勧めします。

create index Address_tab_State_index on Address_tab(State);
create index CustomerAcct_tab_address_id_index CustomerAcct_tab(address_id);

クエリをリファクタリングして、これらのインデックスに最も有利な順序でテーブルを選択します。

SELECT first_name, Last_name
FROM Address_tab
JOIN CustomerAcct_tab ON CustomerAcct_tab.address_id = Address_tab.id
JOIN AccountType_tab 
    ON CustomerAcct_tab.account_type_code = AccountType_tab.code 
    AND is_test_account = FALSE
WHERE Address_tab.State = MI

このクエリは、実行中のできるだけ早い段階で一致しない行を除外するため、後続のテーブルから最小数の行を結合します。

句ではなく句で条件is_test_account = FALSEを使用していることに注意してください。これにより、実行のオーバーヘッドが少し削減されます (結合された結果でのフィルタリングが回避されます)。ONWHERE

また、これは外部キー列であるため、おそらく既に定義済みのインデックスがあることに注意してください。CustomerAcct_tab(address_id)

于 2012-05-18T01:21:01.337 に答える
-1

私があなたの質問を正しく理解していれば、あなたの同僚が指摘した問題は、account_type コードが文字や文字列ではなく数字であるべきだということです。文字列を外部キーとして索引付けすることは可能ですが、一般的ではありません。
これは正しいクエリです:

SELECT first_name, Last_name FROM CustomerAcct_tab

INNER JOIN Address_tab ON CustomerAcct_tab.address_id = Address_tab.id

INNER JOIN AccountType_tab ON CustomerAcct_tab.account_type_code = AccountType_tab.code

WHERE AccountType_tab.code <> 'A' AND Address_tab.State = MI
于 2012-05-18T00:47:57.687 に答える