我想知道以下查询是否已优化?
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行。
有什么办法可以简化这个查询以缩短执行时间吗?
非常感谢你的指导和时间。
答案 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)