【问题标题】:SQL Server inserts and select taking long timeSQL Server 插入和选择需要很长时间
【发布时间】:2010-12-14 01:23:21
【问题描述】:

我们有一个大约有 20 列的表格,如下所示:

我们需要插入 1000 条记录,稍后选择也会产生大约 1000 条记录。

尝试以两种方式插入:

  • parallel via parallel.For c# loop
  • sql 适配器插入填充了 1000 条记录的整个数据集。

两种情况下的插入都需要 30 多秒。我们甚至尝试在干净的桌子上这样做。这怎么能加快速度?

[之前对于普通的 10 列表,我们通过 parallel.for 在大约 60 秒内完成了 200 万条记录插入。]

选择(从 SQL mgmt 工作室测试)返回 2000 条记录也需要 30 多秒,即使在干净的表中也是如此。

时间可变:

  1. mgmt studio 已经运行了很多天:17-30 秒
  2. 关闭并重新打开 - 第一个选择在 1 秒内返回。 - 第二次和随后选择大约 7-10 秒来检索所有行。

可变大小或上限固定大小对列VARCHAR(SIZE) 有很大影响吗?

[磁盘速度很好(RAID?不确定)并且专用于此数据库]

表架构:(无 PK)

varchar(50)
varchar(2)
smallint
varchar(2048)
int
int
varchar(2048)
varchar(MAX)
varchar(MAX)
varchar(MAX)
smallint
varchar(500)
varchar(500)
varchar(MAX)
smallint
smallint
bigint
bigint
bigint
varchar(2048)
smallint
varchar(MAX)
varchar(MAX)
varchar(2048)
datetime

索引:

索引在 varchar(50) 上,非唯一非聚集

SELECT 语句:

select * 
from table 
where varchar(50) = 'value1' 
  and varchar(2) = 'value2' 
  and smallint = 'value3'

组合是每个唯一的 varchar(50) 有 5 个唯一的 varchar(2) 条目,并且对于每个 varchar(2),还有 1-3 个 smallint 条目。

【问题讨论】:

  • 在列上声明索引可能会对您有所帮助
  • 在 30 秒内插入 1000 部蓝光电影很快,但 1000 条员工记录则不然。向我们展示您尝试的表结构、插入/选择语句,并让我们了解您在做什么。您显示的数字实际上没有意义。

标签: sql-server performance


【解决方案1】:

看看SqlBulkCopy 类。不久前,我对从 .NET 到 SQL Server 的高性能数据加载进行了比较,比较了 SqlBulkCopy 与 SqlDataAdapter,底线是加载 100,000 行:

SqlDataAdapter:25.0729s
SqlBulkCopy:0.8229s

博客here

更新:
在 SELECT 性能方面,请尝试在被查询的 3 个字段上建立索引 - 这将允许执行索引查找。目前,只有 VARCHAR(50) 上的索引,它将进行扫描。当您执行 SELECT * 以返回所有列时,它必须关闭并从其他列中查找其余数据,因为它们不会包含在索引中。这可能很昂贵,因此您应该考虑不执行 SELECT * 并且只返回您实际需要的列(如果您实际上并不需要它们)。您真正需要的那些,在 SELECT 中显式命名,然后您可以将它们包含在您在 WHERE 子句中的 3 个字段上创建的索引中。 (请参阅 MDSN 参考,包括:http://msdn.microsoft.com/en-us/library/ms190806.aspx

【讨论】:

  • 我们今天正在尝试这个,刚刚recvd results.Yes。它有帮助。很有用。谢谢。
  • 谁能指导一下加快选择的想法?性能是否过多地依赖于列的大小和列数?
  • @Munish Goyal - 发布您的表架构(包括索引定义)和您正在执行的 SELECT 语句,以帮助社区回答您的问题。
  • @Munish Goyal - 一般而言,是的,您返回的列数可能会产生影响,这完全取决于您的索引(查询是否完全覆盖)。正如约翰所说,您需要发布更多信息
  • @munish goyal:请不要在 cmets 中发布表定义等 - 这完全不可读!请通过编辑更新您的原始问题并提供该信息 - 谢谢!
【解决方案2】:

加快查询速度:

  • 不要将VARCHAR(50) 设为您的主要(因此:集群)键;使用更窄的东西,以及大小固定的东西。 INT IDENTITY 效果最好

  • 为什么你的表中有 VARCHAR(8000)?这给桌子带来了很大的压力——为什么不把那些 VARCHAR(MAX) 也一样?

  • 分析您的查询并在可索引的列上创建适当的非聚集索引

【讨论】:

  • +1 - 另外,不要select * - 你正在提取你可能不需要的数据,这也会减慢速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2016-08-13
  • 2017-12-05
相关资源
最近更新 更多