从MSDN:
如果
(SAMPLE, FULLSCAN, RESAMPLE)
未指定任何示例选项,查询优化器默认对数据进行采样并计算样本大小。
如何确定统计的默认样本量?
我浏览了 MSDN,但没有找到任何公式或方法来确定默认样本大小。到处都只有公式来触发自动统计更新。任何指针都会有所帮助。
SQL Server 统计中的直方图步数是如何决定的?
为什么即使我的键列有超过 200 个不同的值,它也被限制为 200 个步骤?有什么决定因素吗?
演示
模式定义
CREATE TABLE histogram_step
(
id INT IDENTITY(1, 1),
name VARCHAR(50),
CONSTRAINT pk_histogram_step PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
在我的表中插入 100 条记录
INSERT INTO histogram_step
(name)
SELECT TOP 100 name
FROM sys.syscolumns
Run Code Online (Sandbox Code Playgroud)
更新和检查统计信息
UPDATE STATISTICS histogram_step WITH fullscan
DBCC show_statistics('histogram_step', pk_histogram_step)
Run Code Online (Sandbox Code Playgroud)
直方图步骤:
+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 1 | 0 | 1 | 0 | 1 |
| 3 | 1 | 1 | …
Run Code Online (Sandbox Code Playgroud) 我正在尝试计算运行总数。但是当累计总和大于另一列值时它应该重置
create table #reset_runn_total
(
id int identity(1,1),
val int,
reset_val int,
grp int
)
insert into #reset_runn_total
values
(1,10,1),
(8,12,1),(6,14,1),(5,10,1),(6,13,1),(3,11,1),(9,8,1),(10,12,1)
SELECT Row_number()OVER(partition BY grp ORDER BY id)AS rn,*
INTO #test
FROM #reset_runn_total
Run Code Online (Sandbox Code Playgroud)
指数详情:
CREATE UNIQUE CLUSTERED INDEX ix_load_reset_runn_total
ON #test(rn, grp)
Run Code Online (Sandbox Code Playgroud)
样本数据
+----+-----+-----------+-----+
| id | val | reset_val | Grp |
+----+-----+-----------+-----+
| 1 | 1 | 10 | 1 |
| 2 | 8 | 12 | 1 |
| 3 | 6 | 14 | 1 …
Run Code Online (Sandbox Code Playgroud) 最近我们对我们的数据库使用了一个 sql 代码审查工具。建议使用SP_EXECUTESQL
代替EXEC
.
我知道SP_EXECUTESQL
可以帮助我们避免 sql 注入。使用EXEC
vs时性能有什么不同吗SP_EXECUTESQL
?
performance sql-server dynamic-sql t-sql exec query-performance
正在使用我的数据库中SQL SERVER 2012
有我的Auto Update Stats
ON。
从下面的链接我了解到,自动更新统计信息将针对SQRT(1000 * Table rows)
表行中的每个更改触发。
https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/
我创建了一个包含 1000 条记录的表
SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
name
INTO stst
FROM sys.objects
Run Code Online (Sandbox Code Playgroud)
创建统计信息
CREATE STATISTICS rn
ON stst (rn)
CREATE STATISTICS name
ON stst (name)
Run Code Online (Sandbox Code Playgroud)
检查创建的统计信息
DBCC show_statistics('stst', rn) -- Rows 500
DBCC show_statistics('stst', name) -- Rows 500
Run Code Online (Sandbox Code Playgroud)
按照公式
select SQRT(1000 * 500) -- 707.106781186548
Run Code Online (Sandbox Code Playgroud)
因此,如果我707.106781186548
在表中添加/修改记录,则应触发自动更新统计信息
1000
向我的表中添加更多记录,这应该足以触发auto update stats
INSERT INTO stst(rn,name)
SELECT TOP …
Run Code Online (Sandbox Code Playgroud) 是否有查询来检查在给定时间之间运行的作业。我可以检查两次之间安排的作业,但我不想要那样。
示例 我想知道在16:00:00
和之间运行的作业是什么17:00:00
在某些情况下,安排在的作业15:00:00
可能会运行超过 1 小时,我也想要这些。我在谷歌搜索过,我得到的只是安排在两次之间的工作
使用sp_updatestats
不重新采样更新表的统计信息和使用UPDATE STATISTICS
不带重新采样更新表的统计信息之间有什么区别吗?sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)
exec sp_updatestats vs 更新统计表名
使用sp_updatestats
默认值更新表NO
将使用默认采样率更新统计信息。
同样,使用UPDATE STATISTICS
withoutsample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)
更新表的统计信息也会使用默认采样更新表统计信息。
那么这两种方法有什么区别吗?我在这里错过了什么吗?
更新 :
我知道sp_updatestats
在所有表上运行,但使用UPDATE STATISTICS
我们可以更新特定表的统计信息。
我试图了解 SQL Server 中的页面拆分,阅读什么是页面拆分?发生什么了?为什么会这样?为什么要担心?通过托尼·罗杰森
CREATE TABLE mytest
(
something_to_see_in_data CHAR(5) NOT NULL CONSTRAINT pk_mytest PRIMARY KEY CLUSTERED,
filler VARCHAR(3000) NOT NULL
)
go
insert mytest ( something_to_see_in_data, filler ) values( '00001', replicate( 'A', 3000 ) )
insert mytest ( something_to_see_in_data, filler ) values( '00002', replicate( 'B', 1000 ) )
insert mytest ( something_to_see_in_data, filler ) values( '00003', replicate( 'C', 3000 ) )
go
Run Code Online (Sandbox Code Playgroud)
要检查我的表的页面:
DBCC IND ( 0, 'mytest', 1);
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE mytest …
Run Code Online (Sandbox Code Playgroud) 考虑我有一个名为 sql_login 的登录名。登录尝试失败sql_login
后,我可以锁定登录吗5
?
当我们创建登录时,我们可以看到有一个名为密码策略检查图像的选项。但是没有提到锁定密码
在N
尝试登录失败后,Sql Server 中是否有锁定登录的选项
我有很多团队,我想知道每个团队的总和的最大值。
这是我的查询:
SELECT campaign_id,
campaign_identifier,
team,
campaign_name,
Month(time) AS month,
Sum (total) AS Total
FROM campaign
WHERE Year(time) = Year(Now())
AND Month(time) = 12
GROUP BY campaign_identi,
team
Run Code Online (Sandbox Code Playgroud)
谢谢。
sql-server ×9
statistics ×4
t-sql ×2
dynamic-sql ×1
exec ×1
index ×1
jobs ×1
logins ×1
mysql ×1
page-splits ×1
password ×1
performance ×1
subquery ×1