SQL大型只读表性能筛选和排序
我有一个10亿行的表格,其中包含了目标设定计划的可能解决方案。 每列值的组合将创建一个成功的目标路径。我想筛选记录以显示按用户选择排序的前10行。有些人可能想要最低的退休年龄,然后是最低的存款额。其他人可能想要最高的生存机会,然后是最高的结束平衡。。。 以下是我的专栏:SQL大型只读表性能筛选和排序,sql,sql-server,performance,tsql,indexing,Sql,Sql Server,Performance,Tsql,Indexing,我有一个10亿行的表格,其中包含了目标设定计划的可能解决方案。 每列值的组合将创建一个成功的目标路径。我想筛选记录以显示按用户选择排序的前10行。有些人可能想要最低的退休年龄,然后是最低的存款额。其他人可能想要最高的生存机会,然后是最高的结束平衡。。。 以下是我的专栏: age tinyint retirement_age tinyint retirement_length tinyint survival smallint
age tinyint
retirement_age tinyint
retirement_length tinyint
survival smallint
deposit int
balance_start int
balance_end int
SLOW 10 MIN QUERY:
select top(10) age,retirement_age,retirement_length,survival,deposit,balance_start,balance_end
from TABLE
where
age >= 30
and survival >= 8000 --OUT OF 10000
and balance_start <= 20000
and retirement_age >= 60
and retirement_age <= 75
and retirement_length >= 10
and retirement_length <= 25
and deposit >= 1000
and deposit <= 20000
ORDER BY -- (COLUMN ORDER PREFERENCES UNKNOWN)
retirement_age,
deposit,
retirement_length desc,
balance_end desc,
age desc,
survival desc
age tinyint
退休年龄
长锡
生存小点
存款整数
平衡起始整数
国际收支平衡表
慢速10分钟查询:
选择前(10)个年龄、退休年龄、退休时间、生存期、存款、余额开始、余额结束
从桌子上
哪里
年龄>=30
存活率>=8000——10000分之一
和平衡_start=60
退休年龄=10岁
和长度=1000
和存款您是否尝试过创建一个类似
CREATE INDEX IX_TABLE ON [TABLE]
(age,survival,balance_start,retirement_age,retirement_length,deposit)
INCLUDE (balance_end)
如果不是所有字段都在WHERE子句中使用,则索引字段的顺序(年龄、生存期、余额开始、退休年龄、退休长度、存款)
会有所不同,因此请确保将它们按最常用的顺序排列
此外,包含列的顺序没有任何区别
由于表值不会更改,您可以创建多个这样的索引,以提高其他查询的性能,因为它不使用
where子句中的所有字段我最终以默认顺序在我的where和order子句中的每一列上创建了单独的索引:
CREATE INDEX IX_age ON TABLE (age desc)
CREATE INDEX IX_retirement_age ON TABLE (retirement_age)
CREATE INDEX IX_retirement_length ON TABLE (retirement_length desc)
CREATE INDEX IX_survival ON TABLE (survival desc)
CREATE INDEX IX_deposit ON TABLE (deposit)
CREATE INDEX IX_balance_start ON TABLE (balance_start)
CREATE INDEX IX_balance_end ON TABLE (balance_end desc)
我想你指的是估计的执行计划是的,谢谢。估计的异常计划…:)为什么使用INCLUDE(balance\u start,balance\u end)而不是INCLUDE(balance\u end)?WHERE子句中使用了balance start。我认为INCLUDE是用于非索引列的。你是说无论我的查询首先对哪个列给予优先顺序,这个索引都会对任何列的优先顺序起作用吗?这是正确的,soory,我错过了。我计划在排序之前总是使用尽可能多的WHERE子句将数据过滤到合理的大小。将所有列放入一个索引将时间减少一半。相反,我将每一列放入它自己的索引中:创建索引IX_survival ON TABLE(survival desc)创建索引IX_age ON TABLE(age asc)等等,它的性能要好得多。当您查看执行计划时,它是否告诉您它使用的是哪个索引?