sql - 当我将记录加倍时,查询需要多长时间?

标签 sql sql-server database sql-server-2008

这个问题更多是理论性的:我有一个 SQL Server 2008 R2,其中一个数据库有一个表。该表由三列组成,第一列是主键,所有三列都有一个索引。

假设有 100 万条记录,我通过引用 WHERE 子句中的主键只选择了一条记录。查询需要 1 秒才能完成。如果我再添加一百万条记录,查询需要多长时间?我假设在主键上有一个索引,主键对于所有记录都是唯一的,索引结构是一棵树,它应该是 O(n * log n) 之类的东西?

最佳答案

在聚簇索引上搜索一个条目是 B 树搜索,它是一种二叉树搜索。记录数加倍意味着再进行一次半 split 迭代。

索引查找无论如何都非常有效,处理它的额外 CPU 和 IO 量不是很多。

主键并不总是聚簇的,但 SQL Server 会默认将其聚簇。其他3个指标在这里没有任何值(value)。

在此演示脚本中,一百万行和两百万行都需要读取 3 页。即使在 xml 中查看,查询计划也是相同的

这表明索引树有可用空间来处理额外的条目,并且需要单个数据页:整个表未缓存。

CREATE TABLE dbo.foo (ID int IDENTITY(1,1) PRIMARY KEY, Other1 int, Other2 char(10) DEFAULT 'abcdefghij', Other3 varchar(52) DEFAULT 'abcdefghijklmnopqrstuvwxyz');
GO
INSERT dbo.foo (Other1) VALUES (1);
GO
INSERT dbo.foo (Other1) SELECT Other1 FROM dbo.foo;
GO 20
SELECT COUNT(*) FROM dbo.foo;
GO

-- now enable viewing of execution plans

SELECT * FROM dbo.foo WHERE id = 456789
-- Table 'foo'. Scan count 0, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
GO
-- double up rows
INSERT dbo.foo (Other1) SELECT Other1 FROM dbo.foo;
GO

SELECT * FROM dbo.foo WHERE id = 456789
-- Table 'foo'. Scan count 0, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
GO

关于sql - 当我将记录加倍时,查询需要多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17611381/

相关文章:

mysql - 查询以将选定行中的价格值增加 15%

sql-server - SQL Server 2008 中的分组和计数

c++ - 将 C++ 键/值结构转换为数据库 (sqlite3)

php - 从数据库/验证返回 ID

mysql - 如何使用 SUBSTR 优化查询

sql - 一张数据库表海量请求最优解

mysql - 如何对 MySQL 中的列求和

c# - 在 C# 中读取时来自 SQL 的 DateTime 减少了 1 秒

c# - 解析 SQL 语句以查看它是否不是 SELECT 语句?

java - 如何使用JPA和Facade?