4

我有一个 SQL 数据库服务器和 2 个具有相同结构和数据的数据库。我在 2 个数据库中运行相同的 sql 查询,其中一个需要更长的时间,而另一个在不到 50% 的时间内完成。他们都有不同的执行计划。

视图查询如下:

SELECT DISTINCT  i.SmtIssuer, i.SecID, ra.AssetNameCurrency AS AssetIdCurrency, i.IssuerCurrency, seg.ProxyCurrency, shifts.ScenarioDate, ten.TenorID, ten.Tenor, 
                      shifts.Shift, shifts.BusinessDate, shifts.ScenarioNum
FROM         dbo.tblRrmIssuer AS i INNER JOIN
                      dbo.tblRrmSegment AS seg ON i.Identifier = seg.Identifier AND i.SegmentID = seg.SegmentID INNER JOIN
                      dbo.tblRrmAsset AS ra ON seg.AssetID = ra.AssetID INNER JOIN
                      dbo.tblRrmHistSimShift AS shifts ON seg.Identifier = shifts.Identifier AND i.SegmentID = shifts.SegmentID INNER JOIN
                      dbo.tblRrmTenor AS ten ON shifts.TenorID = ten.TenorID INNER JOIN
                      dbo.tblAsset AS a ON i.SmtIssuer = a.SmtIssuer INNER JOIN
                      dbo.tblRrmSource AS sc ON seg.SourceID = sc.SourceID
WHERE     (a.AssetTypeID = 0) AND (sc.SourceName = 'CsVaR') AND (shifts.SourceID =
                          (SELECT     SourceID
                            FROM          dbo.tblRrmSource
                            WHERE      (SourceName = 'CsVaR')))

我已经尝试过的事情是 - 重建和重组表上的索引(tblRRMHistSimShifts - 该表有超过 200 万条记录),检查服务器上的锁或其他后台进程或错误,服务器的最大并行度为 0。

您还有什么可以解决此问题的建议吗?

4

2 回答 2

1

您在同一台服务器上有两个数据库并具有相同的数据集(如您所说)这一事实并不能确保相同的执行计划。

以下是查询计划可能不同的一些原因:

  • mdf 和 ldf 文件(对于每个数据库)位于不同的驱动器上。如果一个驱动器速度更快,那么该数据库也会更快地运行查询。
  • 停滞的统计数据。如果您有一个数据库的统计信息比另一个数据库更新,SQL 就有更好的机会选择正确(且
    更快)的执行计划。
  • 索引:我知道你说它们都是相同的,但我会检查你是否在两者上都有相同类型的索引。

专注于查看查询运行缓慢的原因或查看实际执行计划,而不是进行比较。检查慢查询的实际执行计划将提示您为什么运行较慢。

此外,我不会添加 NO LOCK 语句来解决此问题。根据我的经验,大多数慢查询可以通过代码或索引进行调整,而不是添加 NO LOCK 提示,这可能会让您修改或旧的结果集,具体取决于您的事务。

于 2013-03-18T18:32:47.387 回答
0

最好的方法是重建和重组您的请求

SELECT DISTINCT  i.SmtIssuer, i.SecID, ra.AssetNameCurrency AS AssetIdCurrency, i.IssuerCurrency, seg.ProxyCurrency, shifts.ScenarioDate, ten.TenorID, ten.Tenor, 
                 shifts.Shift, shifts.BusinessDate, shifts.ScenarioNum
FROM dbo.tblRrmIssuer AS i INNER JOIN dbo.tblRrmSegment AS seg ON i.Identifier = seg.Identifier AND i.SegmentID = seg.SegmentID 
                           INNER JOIN dbo.tblRrmSource AS sc ON seg.SourceID = sc.SourceID
                           INNER JOIN dbo.tblRrmAsset AS ra ON seg.AssetID = ra.AssetID 
                           INNER JOIN dbo.tblRrmHistSimShift AS shifts ON seg.Identifier = shifts.Identifier AND i.SegmentID = shifts.SegmentID AND shifts.SourceID = sc.SourceID
                           INNER JOIN dbo.tblRrmTenor AS ten ON shifts.TenorID = ten.TenorID 
                           INNER JOIN dbo.tblAsset AS a ON i.SmtIssuer = a.SmtIssuer 
WHERE (a.AssetTypeID = 0) AND (sc.SourceName = 'CsVaR')
于 2013-03-18T16:42:12.377 回答