【发布时间】:2017-10-20 09:03:45
【问题描述】:
我收到了一个要运行的查询(如下),在我创建的应用程序中,起始日期可以在运行时更改。因此,如果我运行“2010 年 1 月 1 日”的开始日期,我会检索更多数据(返回 216620 行),然后如果我使用 3 天前的日期“2017 年 10 月 17 日”(返回 1006 行),但是由于某种原因,该查询需要很长时间,并且在我的应用程序中它会超时。
是否应该以某种方式优化此查询,或者这可能是服务器/硬件问题?我只是觉得这很奇怪,过去 3 天的查询比跨多年的数据查询花费的时间要长得多,不幸的是在我的 WinForms 应用程序中超时
SELECT AC.account_and_parents As Account,
TR.IBLoad as [Load ID],
LD.load_inboundBOL as [Customer Details],
TR.ItemNumber as ITEMNUM,
IT.[Description] As[Description],
TR.ToPalletID As[Pallet ID],
Format(TR.Receivedate, 'MM/dd/yyyy') as Receive_Date,
TR.QTY as NETWEIGHT,
TR.WeightGross as [Gross Weight],
TR.ContainerType,
TR.InvenType,
TR.Route,
tr.ToWarehouse as Warehouse,
tr.category as Category,
tr.FGatIntake as [FG at Intake],
CASE
When TR.FGatIntake = 1
THEN
(SELECT TOP 1 tr.ItemNumber FROM [databaseName].[dbo].[Transaction] TR1 WHERE TR1.ToPalletID = TR.ToPalletID and TransCode = 'FRCPT')
END As[Finished Good]
FROM [databaseName].[dbo].[Transaction] TR
INNER JOIN [databaseName].[dbo].[Item] IT
on tr.ItemNumber = IT.ItemNumber
INNER JOIN som5.dbo.Loads LD
on TR.IBLoad = LD.OID
INNER JOIN [SOM5].[dbo].[Accounts] AC
on ld.load_Account = AC.OID
-- PROBLEM IS HERE. Lots or records (January start) are fast,
-- but few records (October start) are *very* slow.
WHERE (TransDateTime Between '10/16/2017' and '10/19/2017')
and Transcode = 'BRCPT'
and ToPalletID not in (Select FromPalletID FROM [SOM5].[dbo].[Transaction] where TransCode = 'UNBRCPT')
ORDER BY Receive_Date,[Load ID],[Pallet ID]
【问题讨论】:
-
您有我们可以看到的用于识别瓶颈的查询计划
-
我编辑了我的帖子以提出查询计划。希望能给你足够的信息。
-
不确定您的事务表有多大,但是在它的两侧都有聚集索引扫描的嵌套循环可以从事务表上的至少一个(如果不是两个)NCI 中受益。跨度>
-
96% 的执行时间用于索引扫描。也许更快的日期更容易访问。碎片化情况如何?磁盘上的 io 速度变慢了吗?
-
Transaction 表共有 492443 行。没有任何 IO 问题或碎片问题。我正在考虑使用索引视图,但从我读到的内容来看,这在写入少、读取多的情况下会更好。但这张表每天大约有 250 次写入。
标签: sql sql-server database optimization