【发布时间】: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