【发布时间】:2012-05-02 21:49:56
【问题描述】:
我们的数据库中有一个存储过程,它通过使用 where 条件连接 30 列上的 2 个表来更新表。 SQL 的一般格式为:
UPDATE Target
SET col1 = Source.col1
INNER JOIN Source
on
ISNULL(Target.Col2, '') = ISNULL(Source.Col2, '') and
ISNULL(Target.Col3, '') = ISNULL(Source.Col3, '') and
.
.
.
ISNULL(Target.Col31, '') = ISNULL(Source.Col31, '') and
这是查询计划。将其保存到您的 PC 并重新打开,以便更好地扩展。
Source 表有 65M 记录,Target 有 165M。以前它曾经在几分钟内运行。考虑到查询的丑陋和潜在的低效,我觉得这很令人惊讶。这个月它运行了 1.5 小时,使用了 100% 的处理器,我们不得不杀死它。
对如何即兴发挥以下查询并使其按时运行有什么建议吗?
我们在 30-col 连接条件中使用的一些列上有单列索引。
我知道 ISNULL 函数和 30 列上的连接是疯狂的,这是一个糟糕的设计。别怪我,我继承了这个经济。
很遗憾,没有时间重新设计。有什么建议吗?
【问题讨论】:
-
自上个月以来发生了什么变化?
-
将所有 NULL 更新为
'',然后在没有 ISNULL 的情况下运行查询。但是 Remus 的问题非常中肯,那段时间发生了哪些变化? -
您是否考虑过将其重写为合并?您是否考虑过使这些列不可为空以消除 60 个 ISNULL 调用?
-
您可以检查查询计划并尝试修改查询以确保使用最有效的索引
-
@erikxiv - 由于 ISNULL,我不认为索引将被用于最大效果。
标签: sql sql-server-2008 join isnull