我有一个SQL查询,它使用填充的登台表中的SELECT INTO语句构建分析表。这部分非常顺利,但是当我尝试将字段附加到分析表,彼此或从原始临时表中添加时,UPDATE查询将运行HOURS。
我觉得这个运行时间是没有根据的,因为每个表的最多记录是200K。我有一种感觉,这是我的日志文件管理的问题,或者我没有任何这些表的索引。我一直不愿意建立索引,因为我知道如果草率完成,它们实际上会导致更多问题。任何这些表都没有触发器。
我正在尝试找到一种方法,以便此查询一致地运行。在过去,它运行不到1小时(仍然可能太长),但今天它已经花了3个多小时。
我已经将日志文件修改为自动增长50%而不是10%,以获得无限制的MAXSIZE,我已将数据库恢复模式设置为SIMPLE并且我手动缩小了日志文件。这些都没有帮助。
我知道TABLE SCANS是大型查询中滞后的来源,这里的解决方案是为我在下面描述的LEFT JOIN中使用的所有字段创建索引吗?这些片段是准确的查询滞后的示例。我对此有透明度,因为我在LIVE QUERY STATISTICS窗口中执行脚本。
UPDATE a
SET a.[Account ID] = b.[Account ID]
FROM SFAX.dbo.Leads as a
left join SFAX.dbo.Accts as b on a.[Company Account] = b.[Account Name]
WHERE a.[Account ID] IS NULL;
-- Link by website2
UPDATE a
SET a.[Account ID] = b.[Account ID]
FROM SFAX.dbo.Leads as a
left join SFAX.dbo.Accts as b on a.url2 = b.Website2
WHERE a.[Account ID] IS NULL;
--
UPDATE a
SET a.[SFDC Account Name] = b.[Account Name]
FROM SFAX.dbo.Leads as a
left join SFAX.dbo.Accts as b on
a.[Account ID] = b.[Account ID]
WHERE a.[Account ID] IS NOT NULL;
UPDATE a
SET a.ConvertedFlag = b.[Lead ID]
FROM SFAX.dbo.WhoAnalysis1 as a
LEFT JOIN SFAX.dbo.Contacts as b ON a.WhoId = b.[Contact ID];
答案 0 :(得分:3)
注意:在上面的评论中,您表示怀疑。这很容易测试 - 在更新之前将脚本分成两半 - 运行第一部分 - 然后运行一次更新并计时。然后为该更新创建索引。再次运行它。它快了几个数量级?
如果您使用SQL,请不要害怕索引 - 喜欢您的索引。为
创建索引SFAX.dbo.Leads.[Company Account], [Account ID]
SFAX.dbo.Accts.[Account Name]
SFAX.dbo.Leads.url2, [Account ID]
SFAX.dbo.Accts.Website2
SFAX.dbo.Leads.[Account ID]
SFAX.dbo.Accts.[Account ID]
SFAX.dbo.WhoAnalysis1.WhoID
SFAX.dbo.Contacts.[Contact ID]
但请记住 - 如果您要更改数据库中的大量记录,这可能会受到I / O速度的限制
答案 1 :(得分:1)
下面有很多无意义的工作要做 - 所以不要这样做。
UPDATE a
SET a.[Account ID] = b.[Account ID]
FROM SFAX.dbo.Leads as a
left join SFAX.dbo.Accts as b on a.[Company Account] = b.[Account Name]
WHERE a.[Account ID] IS NULL;
如果b中没有匹配项,则将[a.Account ID]设置为null。但是您只在列为NULL的位置选择那些行。 不要这样做 - 你的左连接是毫无意义的额外工作。将其更改为内部联接。这有助于显着吗?在不知道数据特征的情况下无法告知。