【问题标题】:How to run multiple simple select statements independently of each other simultaneously in SQL Server?如何在 SQL Server 中同时独立运行多个简单的 select 语句?
【发布时间】:2021-12-25 12:01:24
【问题描述】:

我在 ubuntu 上安装了一个 SQL Server,只有一个表(通过 sqlcmd 访问)有近 2 万亿行。它目前在列索引A 上有一个聚集索引(这对我没用)。

我想对数据做一个选择语句

select b, c, d, e, f 
from table 
where b = 'a vehicle number'

并将结果写入.csv 文件。但即使在 b 列上创建了非聚集索引后,此查询也需要大约 20 分钟才能在计算机上运行。

我必须对 400 个不同的车辆编号运行相同的查询,并且需要几天时间才能执行。

我怎样才能使这个过程更快?我可以以某种方式同时运行两个 select 语句(用于两辆车),以便这两个语句在 20 分钟内完成吗? (不是 20 + 20 = 40)?

我有一台功能强大的 PC,配备 128 GB RAM、40 个内核、Intel xeon 4210 @ 2.2Ghz。

【问题讨论】:

  • select b,c,d,e,f from table where b = 'a vehicle number' -- 如果您在列 b 上有唯一索引,则应该非常快(几毫秒)。即使索引不是唯一的,我怀疑会有很多冲突(具有相同值的多行);它应该仍然非常快。
  • 表有多大,以 Mbs 为单位?您希望每个查询返回多少行?您是否尝试过使用 where b in (‘vehicle number 1','vehicle number 2', etc..) order by b 并进行后处理以拆分 csv
  • 您好,感谢您的回复。 b 上的值不是唯一的。将有大约几百万行具有相同的 b。 @TheImpaler
  • 是否使用索引很大程度上取决于数据分布和统计数据的准确性,例如,如果 SQL Server 认为“车辆编号”可能占表的 75%,它可能会选择扫描表反正。您可能会发现在b 上创建一个覆盖的索引要快得多,然后在完成后将其删除。
  • @HoldMyStack 听起来您的服务器资源不足,那么您应该有至少 1.5 倍的额外空间用于此类操作;我有一个 2TB 的 USB 驱动器,你的数据库可以放在我的手机上!

标签: sql sql-server database parallel-processing rdbms


【解决方案1】:

创建一个表来存储车辆编号并将其连接到另一个表中,这样单个查询将检索您感兴趣的所有行,并且您可以枚举结果。

select t1.b, t1.c, t1.d, t1.e, t1.f 
from table1 as t1
inner join table2 as t2 on t1.b = t2.b

您也可以尝试将主键/聚集索引设为 a、b 的组合。有这么多行,它可能不实用,但也许值得一试。

另外,好像有什么问题,使用 DBCC 检查完整性并定期重建索引。

我认为他们不提供带有 linux 版本的 Sql Server Management Studio?如果他们这样做了,使用它来显示查询成本,它会将其分解为每个步骤,并为您提供每个步骤的计算和 i/o 成本值。

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多