标签: sql-server

什么是聚集索引?

我需要对聚集索引做一个简短的解释。

  • 什么是聚集索引?
  • 使用聚集索引的最佳做法是什么?

sql-server clustered-index interview-question

15
推荐指数
1
解决办法
7764
查看次数

需要 SQL Server Frozen Ghost Cleanup 解决方法

我有几个表,行数在 5M 到 1.5G 之间

每个表都有其 BLOB 字段,其大小从 100 字节到 30 兆字节不等,并存储为“行外大值类型”= ON

表存储在不同的文件组中,每个文件组有 3-4 个文件@不同的 LUN@非常快的 SAN

这些表每天增长 5-100 Gb 和 600k - 1.5M 行

经过一段时间后,从 2 周到 6 个月不等,一些行被删除或移动到存档数据库,因此 - 工作表中没有任何超过 6 个月的行。

服务器当前配置:

  • SQL 服务器引擎是 2008 R2 SP1 Enterprise @ 24 核,@ 64Gb RAM
  • SQL Server 使用额外的启动标志运行:

-T 3640; (消除了为存储过程中的每个语句向客户端发送 DONE_IN_PROC 消息。这类似于 SET NOCOUNT ON 的会话设置,但是当设置为跟踪标志时,每个客户端会话都以这种方式处理)

-T 1118;(将 tempDB 中的分配从一次 1pg(对于前 8 页)切换到一个范围。)

-T 2301;(启用特定于决策支持查询的高级优化。此选项适用于大型数据集的决策支持处理)

-T 1117;(一次增长所有数据文件,否则依次增长。)

-E; (增加为文件组中每个文件分配的区数。此选项对于运行索引或数据扫描的用户数量有限的数据仓库应用程序可能有用)

-T 834; (导致 SQL Server 对为缓冲池分配的内存使用 Windows …

sql-server sql-server-2008-r2 ghost-cleanup

15
推荐指数
1
解决办法
7928
查看次数

有什么原因我不应该将我的数据库所有者设置为 [sa]?

昨天我问了这个关于更改我拥有的多个数据库的 dbo 的问题。这种变化是有道理的,但我想说清楚。

有什么好的理由或情况为什么我不应该将数据库的 dbo 设置为 [sa]?

sql-server-2005 sql-server permissions sql-server-2000

15
推荐指数
1
解决办法
1717
查看次数

快速查看为 SQL Server 分配了多少 RAM?

使用 SQL Server 2005,您可以查看任务管理器,至少可以粗略地查看分配给 SQL Server 的内存量。

在 SQL Server 2008 中,工作集或提交大小从未真正超过 500 MB,即使 SQLServer:Memory Manager/Total Server Memory (KB) perf 计数器指出 16,732,760。

是否有设置可以在任务管理器中实际显示服务器内存?或者是因为他们改变了 SQL Server 中内存的使用方式

sql-server-2005 sql-server-2008 sql-server memory

15
推荐指数
2
解决办法
7万
查看次数

一个简单的选择查询是否获取锁?

我对 SQL Server 很陌生,想了解以下非常简单的select语句是否需要任何锁。

Select * from Student;
Run Code Online (Sandbox Code Playgroud)

请考虑语句不会在begin tran块内运行的情况。

sql-server-2008 sql-server locking

15
推荐指数
2
解决办法
5万
查看次数

在 SQL Server 中,我应该在以下情况下强制执行 LOOP JOIN 吗?

通常,出于所有标准原因,我建议不要使用连接提示。然而,最近我发现了一种模式,我几乎总能找到一个强制循环连接来表现更好。事实上,我开始使用和推荐它,以至于我想获得第二意见以确保我没有遗漏任何东西。下面是一个有代表性的场景(生成示例的非常具体的代码在最后):

--Case 1: NO HINT
SELECT S.*
INTO #Results
FROM #Driver AS D
JOIN SampleTable AS S ON S.ID = D.ID

--Case 2: LOOP JOIN HINT
SELECT S.*
INTO #Results
FROM #Driver AS D
INNER LOOP JOIN SampleTable AS S ON S.ID = D.ID
Run Code Online (Sandbox Code Playgroud)

SampleTable 有 100 万行,它的 PK 是 ID。
临时表 #Driver 只有一列、ID、没有索引和 50K 行。

我始终发现以下内容:

案例 1: SampleTable Hash Join
上的NO HINT索引扫描更高的持续时间(平均 333ms) 更高的 CPU(平均 331ms) 更低的逻辑读取(4714)



案例 2:LOOP JOIN HINT
索引在 SampleTable
循环中搜索 加入
较低的持续时间(平均 204 毫秒,减少 …

sql-server

15
推荐指数
1
解决办法
7564
查看次数

查找特定列的依赖项(现代方式,不使用 sysdepends)

我需要找到不仅使用某个表,而且使用表中特定列的所有视图和存储过程。

以下“似乎”有效,但有许多警告要小心使用此方法(由于各种原因不可靠,很快将被弃用等):

SELECT object_name(so.id) TableName, sc.name ColumnName, OBJECT_NAME(sd.id) DependentObjectName,
(SELECT xtype FROM sysobjects so WHERE so.id = sd.id) Object_Type
FROM sysobjects so INNER JOIN syscolumns sc
ON so.id = sc.id
INNER JOIN sysdepends sd
ON so.id = sd.depid and sc.colid = sd.depnumber
WHERE 
    object_name(so.id) = 'MyTableName'
AND sc.name = 'MyColumnName'
order by object_name(so.id), Object_Type
Run Code Online (Sandbox Code Playgroud)

一些经常被引用的替代方法是 sys.sql_dependencies 和 sys.sql_expression_dependencies,但它们都没有列级粒度。

有谁知道这样做的方法?(或者,即使您明确知道它实际上无法完成,知道它也会有所帮助。)

sql-server

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

压缩 NVARCHAR(MAX) 的替代方法?

我正在尝试压缩一些具有NVARCHAR(MAX)字段的表。不幸的是,压缩rowpage压缩没有预期的影响(对于 20 GB 表仅节省了大约 100/200 MB)。此外,我无法应用列存储和列存储归档压缩,因为它们不支持NVARCHAR(MAX)字段压缩。

谁能告诉我这里是否有其他选择?

我也猜测rowpage压缩没有效果,因为NVARCHAR(MAX)列的内容是唯一的。

sql-server compression sql-server-2014

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

授予对 MS SQL 中特定数据库中所有表的 Select 访问权限

我有一个服务器,其中包含多个数据库,这些数据库包含在同一个服务器/项目中。我正在使用 MS SQL Server 2012。

我设置了一个特殊角色,其中包含 3 个属于该角色的用户。我想授予 Select 对 1 个特定数据库中所有表的角色的访问权限。

有问题的数据库是一个存档数据库,其中包含过去 12 年中每个月的存档表。最初创建角色时,我通过运行以下命令授予访问权限:

GRANT SELECT ON [dbo].[myarchivetable] TO myspecialrole
Run Code Online (Sandbox Code Playgroud)

这很有效,因为我只需要更改年份和月份并将其全部作为 1 个脚本运行。

我现在发现他们需要选择访问存档数据库中的每个表。我可以执行上述方法,但是必须将所有这些都写出 132 次,很容易出错。

如何轻松地将 myspecialrole 添加到该数据库中的每个表?

sql-server permissions role sql-server-2012

15
推荐指数
2
解决办法
4万
查看次数

如何向日期时间字符串添加 1 毫秒?

基于选择,我可以像这样返回 x 行:

1   2019-07-23 10:14:04.000
1   2019-07-23 10:14:11.000
2   2019-07-23 10:45:32.000
1   2019-07-23 10:45:33.000
Run Code Online (Sandbox Code Playgroud)

我们所有的毫秒都是 0。

有没有办法将 1 x 1 毫秒加起来,所以选择看起来像这样:

1   2019-07-23 10:14:04.001
1   2019-07-23 10:14:11.002
2   2019-07-23 10:45:32.003
1   2019-07-23 10:45:33.004
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个游标甚至一个没有成功的更新。

这是获得我想要的结果的查询:

  select top 10 ModifiedOn 
    from [SCHEMA].[dbo].[TABLE]
  where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'
Run Code Online (Sandbox Code Playgroud)

有 81k 个值。该字段是DATETIME

sql-server-2008 sql-server varchar datetime

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