【问题标题】:SQL Server: SELECT * INTO takes forever to runSQL Server:SELECT * INTO 需要永远运行
【发布时间】:2016-01-16 06:38:38
【问题描述】:

我正在尝试使用如下语法使用 SELECT INTO 语句生成临时表:

SELECT [FirstName], [LastName], [Zipcode]
INTO [PeopleAndPlaces]
FROM [FirstNames] F
LEFT JOIN [LastNames] L  on F.ID = L.ID
LEFT JOIN [ZipCodes] Z on Z.ID = L.ID

此查询似乎无限期运行(现在超过 2 小时没有结果)。但是,如果我只运行一个 select 语句:

SELECT [FirstName], [LastName], [Zipcode]
--INTO [PeopleAndPlaces]
FROM [FirstNames] F
LEFT JOIN [LastNames] L  on F.ID = L.ID
LEFT JOIN [ZipCodes] Z on Z.ID = L.ID

查询在大约 4 分钟内完成。这怎么可能?

作为一项附加检查,我尝试对较小的集合运行查询,无论是否包含 into 子句:

SELECT [FirstName], [LastName], [Zipcode]
INTO [PeopleAndPlaces]
FROM [FirstNames] F
LEFT JOIN [LastNames] L  on F.ID = L.ID
LEFT JOIN [ZipCodes] Z on Z.ID = L.ID;
WHERE [Zipcode] = '1000'

SELECT [FirstName], [LastName], [Zipcode]
--INTO [PeopleAndPlaces]
FROM [FirstNames] F
LEFT JOIN [LastNames] L  on F.ID = L.ID
LEFT JOIN [ZipCodes] Z on Z.ID = L.ID
WHERE [Zipcode] = '1000'

这两个查询都需要大约 10 秒才能完成,这让我相信创建表并不一定比简单地显示结果需要更长的时间。

【问题讨论】:

  • 对于运行时截然不同的两个查询,查询计划是什么样的?我们在谈论多少行?
  • PeopleAndPlaces 的定义是什么?它的索引、约束和触发器是什么?
  • 我建议你: 1. 运行 sp_who2 并观察活动。 2. 在上面运行您的查询。 3. 当您的查询运行时,在另一个窗口中运行 sp_who2 并观察差异。你在等待什么, sp_who2 会告诉你什么(虽然它可能很神秘)。请发布您的结果。

标签: sql-server tsql


【解决方案1】:

您提到您正在尝试创建一个临时表,但我在[PeopleAndPlaces] 之前没有看到必要的#。尝试将您的查询更新为:

SELECT [FirstName], [LastName], [Zipcode]
INTO [#PeopleAndPlaces]
FROM [FirstNames] F
LEFT JOIN [LastNames] L  on F.ID = L.ID
LEFT JOIN [ZipCodes] Z on Z.ID = L.ID

更新,我在我的数据库中尝试了您的查询版本,但它不会永远运行,所以我会查看您的结果集。这需要运行多长时间?

SELECT *
FROM [FirstNames] F
LEFT JOIN [LastNames] L  on F.ID = L.ID
LEFT JOIN [ZipCodes] Z on Z.ID = L.ID

【讨论】:

  • 请注意,[#PeopleAndPlaces] 不会创建临时表。它会创建一个名为#PeopleAndPlaces 的普通表。
  • @Nick.McDermaid 在不同版本的 SQL Server 中必须不同。我刚刚再次测试,它肯定会创建一个临时表。
  • 哦!我承认我只是在没有检查的情况下发布了该内容,因为 [ 旨在“转义”该名称,但显然在这种情况下并非如此-我已得到纠正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2020-04-03
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多