【发布时间】:2016-01-18 19:07:20
【问题描述】:
我在 Sql Server 中开发了一个插入语句。它利用了几个连接和一个内部选择。由于内存不足,它导致我的数据库出现问题。
尽管只插入了几百行,它也需要几分钟才能运行。是否有人对我如何改进此查询以使其在不更改最终结果的情况下更有效地运行有建议?谢谢!
insert into This_Table
select distinct *
from fv
join lv on lv.field1 = fv.field1
join sa on sa.field1 = fv.field2
where field3 + field2 not in (select distinct field3 + field2
from fv
join lv on lv.field1 = fv.field1
join This_Table T on fv.field2 COLLATE SQL_Latin1_General_CP1_CI_AS + case
when COMPONENT_PART COLLATE SQL_Latin1_General_CP1_CI_AS like 'S%' or `COMPONENT_PART COLLATE SQL_Latin1_General_CP1_CI_AS like 'T%' then STUFF(field3 COLLATE SQL_Latin1_General_CP1_CI_AS, 1, 1, '') else COMPONENT_PART COLLATE SQL_Latin1_General_CP1_CI_AS end like T.field4 + case when field5 like 'S%' or field5 like 'T%' then STUFF(field5, 1, 1, '') else T.field5 end + '%')`
and SA.field6 <> 'EXPIRED'
order by field3
【问题讨论】:
-
这只是我的观察,更改 distinct > GROUP BY,将 'NOT IN' > 更改为左连接,所有 'WHERE' 条件都在 JOIN 处使用它...如果你扔桌子架构和数据示例有人可能会帮助您
-
带有插入的
ORDER BY是多余的,因为表中的数据没有排序。NOT IN子句中的DISTINCT也是多余的,可能会导致 DBMS 做不必要的工作。那么如何使用DISTINCT删除重复记录?来自三个表的select *;其中之一是否包含重复记录?如果是这样,为什么?如果不是这样,为什么DISTINCT? -
您加入列表达式 (
fv.field2 + case when ... end like T.field4 + case when ... end) 而不仅仅是列,这很可能表明数据库模型不好。 -
@Veljko89: No. (1.)
GROUP BY用于数据聚合(SUM、COUNT等)。如果您只想要不同的行,请使用直接的DISTINCT,以便尽可能少地给 DBMS 工作。 (2.) 反连接模式是一种用于不知道如何有效处理[NOT] IN/[NOT] EXISTS的弱 DBMS 的技巧。我怀疑当前版本的 SQL Server 会那么弱。 (3.) 在ON或WHERE中是否有内部联接标准不会影响性能。这只是可读性的问题。但是,是的,(4) 表定义和示例数据可能会有所帮助:-) -
您可能会在SO's dba site 上找到更多帮助。在询问查询性能时,如果包含执行计划总是有帮助的。
标签: sql sql-server optimization insert query-optimization