我从一篇博客文章中得到了这个查询:
SELECT object_name, counter_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Buffer Manager%'
AND [counter_name] = 'Buffer cache hit ratio'
Run Code Online (Sandbox Code Playgroud)
帖子说它会给我一定比例的缓存命中率。它似乎表明它将是一个 0-100 的值(它显示的结果为 87)。
但是当我运行它时,我得到了非常高的数字。下面是一个例子:
object_name counter_name cntr_value
SQLServer:Buffer Manager Buffer cache hit ratio 9990
Run Code Online (Sandbox Code Playgroud)
这是否意味着 99.90%?
如果不是,那是什么意思?我怎样才能得到真正的价值?
注意:我得到的值低至257,高至352363
如果它是相关的,这里有一些其他服务器统计信息:
我知道,如果我EXISTS()调用 FK 查找值,那么,如果该 FK 约束是可信的,那么结果是立竿见影的。
如果它不受信任(比如我使用 来创建 FK 时WITH NOCHECK),那么 SQL Server 必须去检查表以查看该值是否确实存在。
使用我还有什么损失NOCHECK吗?
我读过,在 SQL Server 2000 之后,删除了“取消标识”标识列的能力。而且这是“按设计”(不仅仅是缺失的功能)。
这是我在博客上找到的一个例子。它涉及更新系统表。(并且在 SQL Server 2000 之后删除了该功能。)我认为通过系统表执行此操作不是一个好主意。我只是想知道为什么没有以另一种方式执行此操作的功能。
解决这个问题会给我带来大量的工作。(在不容忍停机的环境中将数亿行复制到新表中。)
所以我想我会问“为什么”。
Sql Server 2005 和更高版本中的哪些更改使这成为一件坏事?或者它总是很糟糕,只是没有被锁定?
再次将标识列设为普通列会违反什么“最佳实践”(或类似原则)?
——
更新以回答“我为什么这样做”的请求:
这是一个非常高级的摘要:我将开始向我的表添加分区。(这样我就可以存档/清除旧数据。)这很容易。但我偶尔需要将记录移动到不同的分区,这样它就不会被删除(当一个分区出现进行归档/删除时)。(我的分区列增加了 2,以便始终有空间将行移动到不同的分区。)
但是如果分区列是标识列,那么我必须删除并重新插入值(没有办法更新标识列的值)。这会导致复制问题。
所以我想使用序列而不是标识列。但是这种切换在大型数据库上非常困难。
我有一个序列,可以为系统中的对象生成跟踪编号。它已经运行良好有一段时间了。
上周我们注意到它开始重用值。
似乎发生的是,在晚上的不同时间点,它会回滚到前一天的值。然后它将继续从该点生成值。
所以例如我可以得到这样的东西:
10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...
在它发生的时间、第一次使用和第二次使用之间的持续时间(少则 10 分钟或几个小时)或回滚的次数(少至 1 次,多至数百次)方面似乎没有任何模式。
我考虑过运行跟踪(并且仍然可能),但我认为序列对象没有被直接修改。我相信这是因为修改日期是几天前的,并且指向我们手动提高值以尝试消除重复项的时间。(从那以后这个问题已经发生了好几次。)
有没有人知道什么可能导致序列回滚和每晚重用值?
更新:回答评论中的几个问题:
@@Version:
Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 2012 年 10 月 19 日 13:38:57
创建脚本:
CREATE SEQUENCE [schemaName].[SequenceName]
AS [bigint]
START WITH 410014104
INCREMENT BY 1
MINVALUE 410000000
MAXVALUE 419999999
CYCLE
CACHE
GO
Run Code Online (Sandbox Code Playgroud)我没有唯一约束(但我打算放一个)。然而,这只会帮助我知道我何时重用了一个值。不是什么导致值重置。我做了一项工作,每 5 分钟就会获得一个新值,然后将其保存。时间和价值跳跃不遵循模式。
我是一名软件开发人员。
我有一个生产数据库,我需要完全 ddl 读取访问权限,但不需要任何 ddl 写入或执行访问权限。
是否有我可以发送给我的 DBA 的脚本,该脚本将授予我完整的 ddl 读取访问权限,而不允许我影响数据库?
可以在表上设置数据压缩:
CREATE TABLE dbo.SomeTable(
SomeId [bigint] NOT NULL,
OtherId [bigint] NOT NULL,
IsActive [bit] NOT NULL,
CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED
(
SomeId Desc
)
) ON SomePartitionScheme(SomeId) WITH (DATA_COMPRESSION=PAGE)
Run Code Online (Sandbox Code Playgroud)
它可以在主键上定义:
CREATE TABLE dbo.SomeTable(
SomeId [bigint] NOT NULL,
OtherId [bigint] NOT NULL,
IsActive [bit] NOT NULL,
CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED
(
SomeId Desc
) WITH (DATA_COMPRESSION=PAGE)
) ON SomePartitionScheme(SomeId)
Run Code Online (Sandbox Code Playgroud)
但是如果你把它放在两者上,你就会得到这个错误:
DATA_COMPRESSION 选项为表指定了多次,如果表已分区,则至少为其中一个分区指定。
把它放在PK上和放在桌子上有什么区别吗?
我的系统中有很多死锁。
我想使用快照隔离来修复它们,但我的 DBA 对此有所保留。
他的担忧之一是快照隔离会减慢写入速度。这是因为它必须先写入缓存,然后写入 TempDb(行版本),然后才能返回给调用者。
“正常”写入可以只写入缓存然后完成。
这是行版本控制的工作方式吗?或者比这更复杂?它是否以某种方式并行执行这些操作?
还是快照隔离的写入速度较慢?
sql-server-2008 sql-server sql-server-2008-r2 snapshot isolation-level
我一直认为更新存储过程是我可以在用户积极使用系统时做的事情。
但是我目前正在测试对存储过程的更新,并且在执行对 sproc 的长时间运行调用时(调用时间超过 4 分钟),我更新了 sproc。(我打算在单独的窗口中尝试不同的查询计划。)
当我回到长期运行的时候,我遇到了这个错误:
The definition of object 'MySprocName' has changed since it was compiled.
Run Code Online (Sandbox Code Playgroud)
此错误似乎表示,如果更新该 sproc 的定义,则任何正在主动执行的 sproc 都会失败。(我认为一旦 sproc 开始运行,它会在剩余的运行中使用该计划,尽管定义发生了变化。)
这是真的?我是否需要停机来更新 sproc 的定义?
在这个MSDN 页面上,它说您是否应该根据碎片量重新组织或重建:
5% 到 30% -> 更改索引重组 超过 30% -> ALTER INDEX REBUILD WITH (ONLINE = ON)*
但是,我们注意到,即使大小表上的碎片非常高(超过 95%),REORGANIZE 也能正常工作。(碎片下降到不到 1%)。
为什么 MSDN 页面会这样说?它不应该像我一样工作吗?
或者我缺少什么缺点?(如果我不重建,隐藏的问题?)
假设我有一个如下所示的索引视图:
ALTER VIEW dbo.MyIndexedView WITH SCHEMABINDING
AS
SELECT ord.SomeColumn, COUNT_BIG(*) AS Count
FROM dbo.Ordered ord
WHERE ord.CreatedWhen > CONVERT(DATETIME, '2014-11-01', 121)
GROUP BY ord.SomeColumn
GO
CREATE UNIQUE CLUSTERED INDEX [CIX_MyIndexedView] ON dbo.MyIndexedView (SomeColumn)
GO
Run Code Online (Sandbox Code Playgroud)
如果我在此视图中更改日期时间值(比如“2014-11-01”),则需要重新生成聚集索引。
有没有办法让现有的视图和索引保持有效,直到新的视图和索引完全构建,然后让它们交换? 相似Online=On
index sql-server materialized-view sql-server-2012 online-operations
sql-server ×10
index ×2
compression ×1
ddl ×1
foreign-key ×1
identity ×1
performance ×1
permissions ×1
sequence ×1
snapshot ×1
t-sql ×1