Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL大型只读表性能筛选和排序_Sql_Sql Server_Performance_Tsql_Indexing - Fatal编程技术网

SQL大型只读表性能筛选和排序

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

我有一个10亿行的表格,其中包含了目标设定计划的可能解决方案。 每列值的组合将创建一个成功的目标路径。我想筛选记录以显示按用户选择排序的前10行。有些人可能想要最低的退休年龄,然后是最低的存款额。其他人可能想要最高的生存机会,然后是最高的结束平衡。。。 以下是我的专栏:

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)等等,它的性能要好得多。当您查看执行计划时,它是否告诉您它使用的是哪个索引?