【问题标题】:Merge Query takes long time合并查询需要很长时间
【发布时间】:2013-11-11 20:59:12
【问题描述】:
MERGE dimS AS T
USING ccservertbl AS S 
        ON (T.iAID = S.ServerID) OR (T.iAID = S.SID) 
        WHEN NOT MATCHED BY TARGET  
          THEN INSERT (
                iAID,
                ConfigItemName,
                PropertyName,
                NetWorkDomainName,
                DataCenterTLA,
                RetireValueIND,
                AssetOnlyInd,
                LastUpdatedDtim,
                ODataServerID) 
           VALUES (
                S.SID, 
                S.Name, 
                S.PropertyDimension, 
                S.NetworkDomain,
                S.datacenterCode, 
                S.RetiredvalueInd, 
                S.IsAssetonly, 
                S.Modified,
                S.ID)
        WHEN MATCHED 
         THEN UPDATE 
            SET T.ConfigItemName = S.Name,
                T.PropertyName = S.PropertyDimension, 
                T.NetWorkDomainName = S.NetworkDomain,
                T.DataCenterTLA = S.datacenterCode, 
                T.RetireValueIND = S.RetiredvalueInd, 
                T.AssetOnlyInd = S.IsAssetonly, 
                T.LastUpdatedDtim = S.Modified,
                T.ODataServerID = S.ID;

【问题讨论】:

  • 天哪,您能正确缩进查询吗?让人难以理解。
  • 另外,发布执行计划。
  • 那么什么不要一次性获取整个数据用户 ajax 加载器用户特定数据一次就可以了
  • 上述查询耗时超过 15 小时但如果我删除 OR (T.iAdminConfigItemID = S.ServerID1) 则只需 30 秒请帮助我提高性能

标签: sql sql-server


【解决方案1】:

尽量不要访问整个对象 dimSccservertbl

例如替换

MERGE dimS AS T
USING ccservertbl AS S

;WITH TargetTable AS (
    SELECT *
    FROM dimS
    WHERE <some slicing clause>
), SourceTable AS (
    SELECT *
    FROM ccservertbl
    WHERE <some slicing clause>
)
MERGE TargetTable AS T
USING SourceTable AS S

【讨论】:

  • 总体上只会变慢。小批量也有优势,但它们几乎从来没有表现得更好。一个大查询可以得到更好的优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2018-01-09
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多