使用多字段公式保持数据库表排序(Microsoft SQL Server)
我有一个使用多字段公式保持数据库表排序(Microsoft SQL Server),sql,sql-server,tsql,indexing,Sql,Sql Server,Tsql,Indexing,我有一个JOB表,有两个有趣的列: 创建日期 重要性(高-3,中-2,低-1) 作业记录的优先级计算如下: Priority = Importance * (time passed since creation) 问题是,每次我都想挑选200份优先级最高的工作,我不想诉诸于谈判桌。有没有办法让行保持排序 我也在考虑有三个表格,一个是高、中、低,然后按创建日期排序;您可以根据条件查询数据,并添加索引以帮助查找所需的订单 (第一列:对表进行排序;它们按聚集索引的顺序存储。) 但忘记了“重新排序
JOB
表,有两个有趣的列:
- 创建日期
- 重要性(高-3,中-2,低-1)李>
Priority = Importance * (time passed since creation)
问题是,每次我都想挑选200份优先级最高的工作,我不想诉诸于谈判桌。有没有办法让行保持排序
我也在考虑有三个表格,一个是高、中、低,然后按创建日期排序;您可以根据条件查询数据,并添加索引以帮助查找所需的订单
(第一列:对表进行排序;它们按聚集索引的顺序存储。)
但忘记了“重新排序”数据的概念。将您的数据放入,然后(通过一些索引)让数据库服务器执行其工作以返回您想要的数据
如果您没有获得所需的数据,那么您的查询可能需要更多帮助。表没有“排序”;您可以根据条件查询数据,并添加索引以帮助查找所需的订单
(第一列:对表进行排序;它们按聚集索引的顺序存储。)
但忘记了“重新排序”数据的概念。将您的数据放入,然后(通过一些索引)让数据库服务器执行其工作以返回您想要的数据
如果您没有获得所需的数据,那么您的查询可能需要更多帮助
问题是,每次我都想挑选200份优先级最高的工作,我不想诉诸于谈判桌。有没有办法让行保持排序
行顺序与数据库无关,不建议依赖非确定性计算进行排序
假设SQL Server 2000+,则可以改用此查询:
SELECT TOP 200 t.*
FROM TABLE t
ORDER BY t.importance * (time passed since creation) DESC
问题是,每次我都想挑选200份优先级最高的工作,我不想诉诸于谈判桌。有没有办法让行保持排序
行顺序与数据库无关,不建议依赖非确定性计算进行排序
假设SQL Server 2000+,则可以改用此查询:
SELECT TOP 200 t.*
FROM TABLE t
ORDER BY t.importance * (time passed since creation) DESC
这里的问题是您描述的操作的性能。引擎将为表中的每个记录计算“重要性*(自创建以来经过的时间)”。只要函数中有一列,就会发生这种情况 一个主意。对于较大的表,获取600行然后从中获取前200行的开销比为每个查询执行计算要小得多 SQL不像(order by和unions)那样正确,但是这个想法是有效的
SELECT TOP 200 ident
FROM
(
SELECT TOP 200 ident, (GETDATE() - creation_date) * 1 AS calc_order
FROM jobs
WHERE priority = 1
ORDER BY creation_date
UNION ALL
SELECT TOP 200 ident, (GETDATE() - creation_date) * 2 AS calc_order
FROM jobs
WHERE priority = 2
ORDER BY creation_date
UNION ALL
SELECT TOP 200 ident, (GETDATE() - creation_date) * 3 AS calc_order
FROM jobs
WHERE priority = 3
ORDER BY creation_date
) x
ORDER BY
calc_order DESC
这里的问题是您描述的操作的性能。引擎将为表中的每个记录计算“重要性*(自创建以来经过的时间)”。只要函数中有一列,就会发生这种情况 一个主意。对于较大的表,获取600行然后从中获取前200行的开销比为每个查询执行计算要小得多 SQL不像(order by和unions)那样正确,但是这个想法是有效的
SELECT TOP 200 ident
FROM
(
SELECT TOP 200 ident, (GETDATE() - creation_date) * 1 AS calc_order
FROM jobs
WHERE priority = 1
ORDER BY creation_date
UNION ALL
SELECT TOP 200 ident, (GETDATE() - creation_date) * 2 AS calc_order
FROM jobs
WHERE priority = 2
ORDER BY creation_date
UNION ALL
SELECT TOP 200 ident, (GETDATE() - creation_date) * 3 AS calc_order
FROM jobs
WHERE priority = 3
ORDER BY creation_date
) x
ORDER BY
calc_order DESC
一个好的答案,但提到按排序会使它更好。一个好的答案,但提到按排序会使它更好。