【发布时间】:2020-02-23 09:50:49
【问题描述】:
我通过 Visual Studio 2008 + ADO(不是 ADO.net)编写了一个 C++ 应用程序。它将一一完成以下任务:
- 在SQL Server数据库中创建表,如下:
CREATE TABLE MyTable
(
[S] bigint,
[L] bigint,
[T] tinyint,
[I1] int,
[I2] smallint,
[P] bigint,
[PP] bigint,
[NP] bigint,
[D] bit,
[U] bit
);
通过
BULK INSERT插入5,030,242条记录在表上创建索引:
CREATE Index [MyIndex] ON MyTable ([P]);
- 启动一个查找 65,000,000 次的函数。每次查找都使用以下查询:
SELECT [S], [L]
FROM MyTable
WHERE [P] = ?
每次查询要么不返回任何内容,要么返回一行。如果用 [S] 和 [L] 获取一行,我会将 [S] 转换为文件指针,然后从 [L] 指定的偏移量读取数据。
第 4 步需要很长时间。所以我尝试分析它并找出查找查询花费的时间最多。每次查找大约需要 0.01458 秒。
我尝试通过执行以下任务来提高性能:
使用参数化 ADO 查询。见第四步
仅选择所需的列。最初我在第 4 步中使用“Select *”,现在我使用
Select [S], [L]。这将性能提高了约 1.5%。尝试了 [P] 的聚集索引和非聚集索引。看来使用非聚集索引会好一些。
还有其他空间可以提高查找性能吗?
注意:[P] 在表格中是唯一的。
非常感谢。
【问题讨论】:
-
我的建议是不要一次看每个。RBAR 几乎总是很慢
-
一旦你有了S和L,你会用它做什么?查找值 6500 万次并不是一个好的设计模式。
-
您可以设置许多选项来加快查找速度,也许 sql server 中的分区可以帮助您。如果您想以最佳速度加载数据,您可以使用 In-Memory OLTP 技术。在下一个级别,您可以配置 hadoop。在执行此解决方案之前,请检查您的硬件瓶颈,例如旧存储 (hdd) 或网络工作负载
-
您也可以在您的应用程序中而不是 SQL Server 中进行所有查找。这可能是最快的。
-
@alancc,如果您要批量加载 65M 行并执行基于集合的查询,SQL Server 将为 5M 行表构建一个哈希表,然后执行 65M 哈希查找。您可以在您的应用程序中执行相同的操作,而无需将数据推送到 SQL Server。 SQL Server 确实适用于关系数据库 DML,但您在 x-y question 中没有提到 RDBMS 持久性要求。
标签: sql-server select indexing lookup