【发布时间】:2013-02-21 07:44:36
【问题描述】:
假设我有一张表,上面有 5 个可以为空的外键。对于每一行,其中只有 1 个具有值。
现在,这个表已经增长了很多,并且包含大约 220 万条记录。
在大多数情况下,我只对查询表 c.q 的“部分”感兴趣。那些可以为空的外键具有值的记录。毫不奇怪,仅获取所需的子集需要很长时间,使用以下查询:28 秒来获取一个特定子集的 170 万条记录。
SELECT * FROM Table WHERE Col IS NOT NULL
我真的很感兴趣如何加快速度,尤其是在不更改数据模型的情况下是否可以实现这一点。
【问题讨论】:
-
哪种类型的 RDBMS?还是您打算将 [sql] 表示为 [sql-server]?
-
1.7 / 2.2 约为 75%。这表明您的查询可能必须获取 每个 磁盘页面。仅当您的工作集适合核心(可能确实如此)时,索引才会有所帮助
-
如果 1.7m 行代表一个子集,它必须比其他子集大得多(总共约 0.5m 行)。在调整具有如此大量数据的查询时,您的选择有限。
-
是的,这是一个极端情况:tje 子集真的这么大:(
-
您是从编程语言中调用它吗?当我从 Ruby on Rails 调用数据库时,ActiveRecord 需要很长时间,尽管数据库响应很快。
标签: sql sql-server optimization normalization