-2

我想知道以下查询是否优化?

 select 
  SUM(payments.paid_amt) as paid_amt, 
  SUM(payments.copay_amt) as copay_amt,
  SUM(payments.CO_INSURANCE_AMT) as co_ins_amt,
  payor_group.PAYOR_GROUP as payor_group,
  DATEPART(MM,accession.XIFIN_LOAD_DATE) as load_month,
  DATEPART(yyyy,accession.XIFIN_LOAD_DATE) as load_year

  from 
  [F_PAYOR_PAYMENTS_monthly] payments

  join D_PAYOR payor
  on payor.PAYOR_ID=payments.PAYMENT_PAYOR_ID

  join D_PAYOR_GROUP payor_group
  on payor.PAYOR_GROUP_KEY=payor_group.PAYOR_GROUP_KEY

  join F_ACCESSION_DAILY accession
  on accession.ACCESSION_ID=payments.ACCESSION_ID

  group by  payor_group.PAYOR_GROUP, DATEPART(MM,accession.XIFIN_LOAD_DATE),
  DATEPART(yyyy,accession.XIFIN_LOAD_DATE)

它现在已经执行了大约 1.5 小时。还没有任何表上的索引!

每个表大约有 10,000,000 行。

有什么办法可以简化此查询以提高执行时间?

非常感谢您的指导和时间。

4

3 回答 3

2

每个有 10m 行的表上没有索引很可能会影响您的性能。任何运行一个小时的查询都没有优化,需要注意。大多数查询应该在几秒钟内运行。

我建议开始在您的关键列上添加索引(payor.payor_id、payments.payment_payor_id、payor.payor_group_key、paygor_group.payor_group_key、payments.accession_id)。之后,尝试在启用“包括实际执行计划”选项的 SSMS 中运行您的查询(在查询文件菜单下)。运行您的查询,它会向您建议其他索引,您应该考虑应用这些索引。

您的表是否承受其他进程的大量负载?他们是否接受大量传入数据?

在您将重点放在更改查询语法或进行任何“其他”优化之前,您需要应用索引。在您放入索引并以正常速率(<1 分钟)执行查询后,您可以查看额外的索引调整或在需要时添加表/查询提示。

于 2012-06-15T17:50:43.010 回答
1

在您的第一个查询中,您分组依据accession.XIFIN_LOAD_DATE而不是该日期的月/年,这就是您需要第二个分组依据的原因。如果你解决了这个问题,那么它只是一个查询。这应该会提高性能,但索引将是最大的帮助。

于 2012-06-15T18:04:07.773 回答
1

为什么要使用 With 呢?

  select 
  SUM(payments.paid_amt) as paid_amt, 
  SUM(payments.copay_amt) as copay_amt,
  SUM(payments.CO_INSURANCE_AMT) as co_ins_amt,
  payor_group.PAYOR_GROUP as payor_group,
  DATEPART(MM,accession.XIFIN_LOAD_DATE) as load_month,
  DATEPART(yyyy,accession.XIFIN_LOAD_DATE) as load_year

  from 
  [F_PAYOR_PAYMENTS_monthly] payments

  join D_PAYOR payor
  on payor.PAYOR_ID=payments.PAYMENT_PAYOR_ID

  join D_PAYOR_GROUP payor_group
  on payor.PAYOR_GROUP_KEY=payor_group.PAYOR_GROUP_KEY

  join F_ACCESSION_MONTHLY accession
  on accession.ACCESSION_ID=payments.ACCESSION_ID

  group by  payor_group.PAYOR_GROUP, DATEPART(MM,accession.XIFIN_LOAD_DATE),
  DATEPART(yyyy,accession.XIFIN_LOAD_DATE)
于 2012-06-15T18:09:41.227 回答