Tally接近未来30年的打印天数 - 为什么要添加主键约束来计算?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

这是我用来打印未来30年所有日子的查询。

SELECT TOP 11000 --number of days for 30 years
       IDENTITY(INT,1,1) AS N
INTO #Tally
FROM Master.dbo.SysColumns sc1,
     Master.dbo.SysColumns sc2

declare @endDate datetime = '2049-01-01'
       ,@tmpDate datetime = '2019-01-01'

select dateadd(day, t.N - 1, @tmpDate)
from #Tally t
where t.N - 1 <= DATEDIFF(day, @tmpDate, @endDate)

它运作良好。但是,我建议SQL专家在我创建#Tally的第一部分下面添加这些查询。

ALTER TABLE #Tally
ADD CONSTRAINT PK_Tally_N 
PRIMARY KEY CLUSTERED (N) WITH FILLFACTOR = 100

如果我运行上面select * from #Tally的“ALTER”查询,结果表中没有变化。

我想知道我应该添加ALTER查询的原因是什么(不能问他)?那是什么意思?我看到它正在添加一个主键约束,但为什么要使用clustered(n)fillfactor=100

谢谢!

提问于
用户回答回答于

我个人会采用不同的方法来创建一个计数表。我将此作为我的系统的视图。它闪电般快速,你永远不必担心存储。这是我从Jeff Moden那里学到的一种技术,他从Itzik Ben-Gan那里了解到了这一点。如果您需要超过10,000个,则可以将其扩展为包含更多行。

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally
用户回答回答于

ERAY,

为了简单起见,FILLFACTOR属性告诉SQL Server有多少百分比的页面(构成索引)填充了数据。如果这是一个永远不会改变的表(不需要重建索引); 将此值设置为100是有意义的,因为任何小于100的值都会降低可以存储在每个数据页上的数据量的容量(尽管程度很小)。

从MS的口中; 当“未来指数可能增长”时,他们认为这很重要:

https://docs.microsoft.com/en-us/sql/relational-databases/indexes/specify-fill-factor-for-an-index?view=sql-server-2017

有关详细信息,请参阅:https//www.brentozar.com/archive/2013/04/five-things-about-fillfactor/

扫码关注云+社区

领取腾讯云代金券