【发布时间】:2014-12-20 12:45:59
【问题描述】:
我有非常大的桌子 Shelve(大约 1 亿个),其中包含书籍的 Shelve 信息。
搁置
ShevleID RangeStart RangeEnd
----------------------------------------
1 1 100
2 200 500
3 501 1000
每本书都有唯一的编号 BookID。假设您有一本书的 BookID 为 50。 那么 Book 必须保存在 Shelve 1 中,因为 50 介于 1 和 100 之间。
书籍
BookID BookName
---------------------------
1 Book1
2 Book2
.
.
50 Book3
我的查询是这样的-
SELECT
BookID,
BookName,
ShelveID
FROM
Book B
LEFT JOIN
Shelve S
ON B.BookID
BETWEEN
S.RenageStart
AND
S.RangeEND
此查询非常慢,因为查询一次只能使用 RangeStart 或 RangeEnd 列之一的索引。
这5个选项我已经试过了-
在 StartIP 上创建索引
在 EndIP 上创建索引
在 StartIP 上创建包含索引(包含列 EndIP)
在 EndIP 上创建包含索引(包含列 StartIP)
在 StartIP、EndIP 上创建索引
有人可以建议我一些方法来实现这一点吗?
【问题讨论】:
-
您的查询返回一行还是多行?
-
欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,请在文本编辑器中突出显示这些行并单击“代码编辑器工具栏上的示例”按钮 (
{ }) 以很好地格式化和语法突出显示它! -
为什么不将分配的 ShelveID 存储在 book 表中?这就是属性所属的位置,因为 Book 和 Shelve 之间的关系为零或一。非规范化设计是性能问题的根本原因,因为从性能角度来看,加入一个不等式运算符是有问题的。
-
@Gordon Linoff 此查询返回超过 1 行。每本书一行。
-
@Dan - 我们必须每 3 天左右更改一次图书的位置,并且 Shelve 表由密码填充。shelve 表定期更改,因此我们无法将 shelveID 存储在 Book 表中。我们可以优化读取部分。
标签: sql sql-server database query-optimization