简化查询以缩短执行时间

时间:2012-06-15 17:44:23

标签: sql sql-server sql-server-2008

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

 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行。

有什么办法可以简化这个查询以缩短执行时间吗?

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

3 个答案:

答案 0 :(得分:2)

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

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

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

在您专注于更改查询语法或执行任何“其他”优化之前,您需要应用索引。在获得索引并且查询以正常速率执行(<1分钟)之后,您可以查看其他索引调整或在需要时添加表/查询提示。

答案 1 :(得分:1)

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

答案 2 :(得分: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)