1

このクエリを使用しました

SELECT  COUNT(CASE WHEN C <= 1 THEN 1 END) AS nooffamiliesHavingcount1,
        COUNT(CASE WHEN C BETWEEN 2 AND 4 THEN 1 END) AS nooffamiliesHavingcountbetween2And4,
        COUNT(CASE WHEN C > 4 THEN 1 END) AS nooffamiliesHavingcountgreaterthan3
FROM    (   SELECT  COUNT(*) AS C
            FROM    user where user_id = (select user_id from location where location_id in(select location_id from country where state_name='STATE'))
            GROUP BY House_No
        ) t

ここでサブクエリは約 10000 レコードを返します。user テーブルには 10,00,000 レコードがあります。時間がかかりすぎています。その後、サーバーがなくなったというエラーが表示されます。私はmysqlを使用しています。

グーグルで検索しましたが、うまくいきませんでした。

テーブルに必要な変更.クエリのパフォーマンスを向上させることで、このクエリを正常に実行する方法.提案してください.よろしくお願いします....

4

2 に答える 2

2

このクエリを試してください

SELECT 
  COUNT(CASE WHEN C <= 1 THEN 1 END) AS nooffamiliesHavingcount1,
  COUNT(CASE WHEN C BETWEEN 2 AND 4 THEN 1 END) AS nooffamiliesHavingcountbetween2And4,
  COUNT(CASE WHEN C > 4 THEN 1 END) AS nooffamiliesHavingcountgreaterthan3
FROM  
  (SELECT 
    COUNT(*) AS C
  FROM 
    user u,  
    location l, 
    country c 
  where 
    l.state_name='STATE' AND 
    l.some_other_column_id= 4 AND  <------- Add your condition
    c.location_id = l.location_id AND 
    u.user_id = l.user_id 
  GROUP BY 
    u.House_No) t

理解しやすいように、適切な結合を使用してください。

SELECT 
  COUNT(CASE WHEN C <= 1 THEN 1 END) AS nooffamiliesHavingcount1,
  COUNT(CASE WHEN C BETWEEN 2 AND 4 THEN 1 END) AS nooffamiliesHavingcountbetween2And4,
  COUNT(CASE WHEN C > 4 THEN 1 END) AS nooffamiliesHavingcountgreaterthan3
FROM  
  (SELECT 
    COUNT(*) AS C
  FROM 
    user u
  INNER JOIN  
    location l
  ON 
    l.state_name='STATE' AND 
    l.some_other_column_id= 4   <------- Add your condition
    u.user_id = l.user_id 
  INNER JOIN
    country c 
  ON 
    c.location_id = l.location_id 
  GROUP BY 
    u.House_No) t

編集済み

ほとんどの場合、JOIN はサブクエリよりも高速であり、サブクエリが高速であることは非常にまれです。サブクエリを使用する方がより論理的で理解しやすいことは認めますが、パフォーマンスに関しては結合ほど良くありません。結合を使用している場合、データベースはクエリを独自に最適化しますが、サブクエリの場合はそうではありません。両方のクエリに Explain を使用してみてください。クエリがどのように実行されるかが明確になります。

お役に立てれば...

于 2013-04-09T04:34:01.247 に答える
1

以下を試すことができますか:

SELECT COUNT(CASE WHEN COUNT( ) <= 1 THEN 1 END) AS nooffamiliesHavingcount1, COUNT(CASE WHEN COUNT( ) BETWEEN 2 AND 4 THEN 1 END) AS nooffamiliesHavingcount between2And4, COUNT(CASE WHEN COUNT(*) > 4 THEN 1 END) AS nooffamiliesHavingcountgreaterthan3 FROM User user Inner JOIN (場所 loc から user_id を選択します。内部結合 国 con on loc.location_id =con.location_id where state_name='STATE' ) as temp

House_No による user.user_id =temp.user_id グループ

于 2013-04-09T04:26:41.543 に答える