小编Vac*_*ano的帖子

9990 的“缓冲区缓存命中率”是什么意思?

我从一篇博客文章中得到了这个查询:

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

如果它是相关的,这里有一些其他服务器统计信息:

  • 页面预期寿命:145
  • 页面读取/秒:1,380,009,009

performance sql-server sql-server-2012

12
推荐指数
1
解决办法
1万
查看次数

使用“WITH NOCHECK”创建外键时会丢失什么?

我知道,如果我EXISTS()调用 FK 查找值,那么,如果该 FK 约束是可信的,那么结果是立竿见影的。

如果它不受信任(比如我使用 来创建 FK 时WITH NOCHECK),那么 SQL Server 必须去检查表以查看该值是否确实存在。

使用我还有什么损失NOCHECK吗?

foreign-key sql-server t-sql

12
推荐指数
2
解决办法
9349
查看次数

为什么不支持删除列上的 Identity 属性

我读过,在 SQL Server 2000 之后,删除了“取消标识”标识列的能力。而且这是“按设计”(不仅仅是缺失的功能)。

这是我在博客上找到的一个例子。它涉及更新系统表。(并且在 SQL Server 2000 之后删除了该功能。)我认为通过系统表执行此操作不是一个好主意。我只是想知道为什么没有以另一种方式执行此操作的功能。

解决这个问题会给我带来大量的工作。(在不容忍停机的环境中将数亿行复制到新表中。)

所以我想我会问“为什么”。

Sql Server 2005 和更高版本中的哪些更改使这成为一件坏事?或者它总是很糟糕,只是没有被锁定?

再次将标识列设为普通列会违反什么“最佳实践”(或类似原则)?

——

更新以回答“我为什么这样做”的请求:
这是一个非常高级的摘要:我将开始向我的表添加分区。(这样我就可以存档/清除旧数据。)这很容易。但我偶尔需要将记录移动到不同的分区,这样它就不会被删除(当一个分区出现进行归档/删除时)。(我的分区列增加了 2,以便始终有空间将行移动到不同的分区。)

但是如果分区列是标识列,那么我必须删除并重新插入值(没有办法更新标识列的值)。这会导致复制问题。

所以我想使用序列而不是标识列。但是这种切换在大型数据库上非常困难。

sql-server identity

12
推荐指数
1
解决办法
2560
查看次数

序列正在重用

我有一个序列,可以为系统中的对象生成跟踪编号。它已经运行良好有一段时间了。

上周我们注意到它开始重用值。

似乎发生的是,在晚上的不同时间点,它会回滚到前一天的值。然后它将继续从该点生成值。

所以例如我可以得到这样的东西:

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 分钟就会获得一个新值,然后将其保存。时间和价值跳跃不遵循模式。

  • 我检查了事件日志以查看是否有错误。唯一认为正在发生的是:http : //support.microsoft.com/kb/2793634 我们今天正在应用此修复程序。我不认为这些是相关的,但它可能是。

sql-server sequence sql-server-2012

11
推荐指数
1
解决办法
4581
查看次数

查看和编写对象的权限,但不能更改它们?

我是一名软件开发人员。

我有一个生产数据库,我需要完全 ddl 读取访问权限,但不需要任何 ddl 写入或执行访问权限。

是否有我可以发送给我的 DBA 的脚本,该脚本将授予我完整的 ddl 读取访问权限,而不允许我影响数据库?

sql-server permissions ddl sql-server-2012

9
推荐指数
1
解决办法
1万
查看次数

PK 上的压缩与 Table 上的压缩有什么不同?

可以在表上设置数据压缩:

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上和放在桌子上有什么区别吗?

sql-server compression sql-server-2012

9
推荐指数
1
解决办法
1199
查看次数

SQL Server 数据库写入快照隔离是否会变慢?

我的系统中有很多死锁。

我想使用快照隔离来修复它们,但我的 DBA 对此有所保留。

他的担忧之一是快照隔离会减慢写入速度。这是因为它必须先写入缓存,然后写入 TempDb(行版本),然后才能返回给调用者。

“正常”写入可以只写入缓存然后完成。

这是行版本控制的工作方式吗?或者比这更复杂?它是否以某种方式并行执行这些操作?

还是快照隔离的写入速度较慢?

sql-server-2008 sql-server sql-server-2008-r2 snapshot isolation-level

8
推荐指数
1
解决办法
1380
查看次数

我是否需要“停机”来更新存储过程?(由于“定义已更改”错误)

我一直认为更新存储过程是我可以在用户积极使用系统时做的事情。

但是我目前正在测试对存储过程的更新,并且在执行对 sproc 的长时间运行调用时(调用时间超过 4 分钟),我更新了 sproc。(我打算在单独的窗口中尝试不同的查询计划。)

当我回到长期运行的时候,我遇到了这个错误:

The definition of object 'MySprocName' has changed since it was compiled.
Run Code Online (Sandbox Code Playgroud)

此错误似乎表示,如果更新该 sproc 的定义,则任何正在主动执行的 sproc 都会失败。(我认为一旦 sproc 开始运行,它会在剩余的运行中使用该计划,尽管定义发生了变化。)

这是真的?我是否需要停机来更新 sproc 的定义?

sql-server stored-procedures sql-server-2012

8
推荐指数
1
解决办法
615
查看次数

REORGANIZE 似乎一直和 REBUILD 一样有效

在这个MSDN 页面上,它说您是否应该根据碎片量重新组织或重建:

 5% 到 30% -> 更改索引重组  
 超过 30% -> ALTER INDEX REBUILD WITH (ONLINE = ON)*

但是,我们注意到,即使大小表上的碎片非常高(超过 95%),REORGANIZE 也能正常工作。(碎片下降到不到 1%)。

为什么 MSDN 页面会这样说?它不应该像我一样工作吗?

或者我缺少什么缺点?(如果我不重建,隐藏的问题?)

index sql-server sql-server-2012

7
推荐指数
3
解决办法
445
查看次数

“在线”更新索引视图

假设我有一个如下所示的索引视图:

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

7
推荐指数
1
解决办法
76
查看次数