1

私は現在、テレコム分析プロジェクトとクエリ最適化の初心者に取り組んでいます。ブラウザーに結果を表示するには、わずか 45,000 件のレコードにアクセスするのに丸 1 分かかります。結果を表示する時間を短縮する方法を提案してください。

age-group人のcall-duration を見つけるために、次のクエリを書きました。

    sigma=0
    popn=len(Demo.objects.filter(age_group=age))
    card_list=[Demo.objects.filter(age_group=age)[i].card_no
                for i in range(popn)]
    for card in card_list:
        dic=Fact_table.objects.filter(card_no=card.aggregate(Sum('duration'))
        sigma+=dic['duration__sum']
    avgDur=sigma/popn

上記のコードは for ループ内にあり、年齢層を反復処理します。

モデルは次のとおりです。

class Demo(models.Model):
    card_no=models.CharField(max_length=20,primary_key=True)
    gender=models.IntegerField()
    age=models.IntegerField()
    age_group=models.IntegerField()



class Fact_table(models.Model):
    pri_key=models.BigIntegerField(primary_key=True)
    card_no=models.CharField(max_length=20)
    duration=models.IntegerField()
    time_8bit=models.CharField(max_length=8)
    time_of_day=models.IntegerField()
    isBusinessHr=models.IntegerField()
    Day_of_week=models.IntegerField()
    Day=models.IntegerField()

ありがとう

4

2 に答える 2

4

それを試してください:

sigma=0
demo_by_age = Demo.objects.filter(age_group=age);

popn=demo_by_age.count() #One

card_list = demo_by_age.values_list('card_no', flat=True) # Two

dic = Fact_table.objects.filter(card_no__in=card_list).aggregate(Sum('duration') #Three
sigma = dic['duration__sum']

avgDur=sigma/popn
于 2013-07-26T02:12:43.720 に答える