关于包含列的非聚集索引的问题 (DB - MS SQL Server)。我阅读了博客优化的非聚集索引维护,其中提供了有关执行更新语句以及为表定义聚集索引和非聚集索引时的查询计划的信息。
我对包含列的非聚集索引有疑问。我指的是博主提供的相同示例
CREATE TABLE T (PK INT, A INT, B INT, C INT, D INT, E INT)
CREATE UNIQUE CLUSTERED INDEX TPK ON T(PK)
CREATE INDEX TB ON T(B)
CREATE INDEX TCD ON T(C,D)
CREATE INDEX TE ON T(E)
Run Code Online (Sandbox Code Playgroud)
-- 这是包含列的新非聚集索引
CREATE INDEX TF ON T(E) INCLUDE(A)
INSERT T VALUES(0, 10, 20, 30, 40, 50)
UPDATE T SET A = 19
Run Code Online (Sandbox Code Playgroud)
如果未定义索引 TF,则只会执行对聚集索引的更新,不会执行非聚集索引插入和删除操作。但是当定义了 TF 时会发生什么?
我的系统中有很多死锁。
我想使用快照隔离来修复它们,但我的 DBA 对此有所保留。
他的担忧之一是快照隔离会减慢写入速度。这是因为它必须先写入缓存,然后写入 TempDb(行版本),然后才能返回给调用者。
“正常”写入可以只写入缓存然后完成。
这是行版本控制的工作方式吗?或者比这更复杂?它是否以某种方式并行执行这些操作?
还是快照隔离的写入速度较慢?
sql-server-2008 sql-server sql-server-2008-r2 snapshot isolation-level
我们可以使用以下查询来更新 ANSI_NULLS 选项吗?
sp_configure 'allow updates', 1
reconfigure with override
update sysobjects set status = status | 0x20000000 where name = 'tblClient'
Run Code Online (Sandbox Code Playgroud)
我不确定它在做什么。我在寻找解决方案后得到了这个。我们的数据库是 SQL Server 2008。
但是当我运行这个时,我遇到了这样的错误 "Ad hoc updates to system catalogs are not allowed."
请提出您的建议
将值设置为变量的更好方法是什么(关于性能)?
通过SET命令:
DECLARE @VarString nvarchar(max);
SET @VarString = 'john doe';
SELECT @VarString;
Run Code Online (Sandbox Code Playgroud)通过SELECT命令:
DECLARE @VarString nvarchar(max);
SELECT @VarString = 'john doe';
SELECT @VarString;
Run Code Online (Sandbox Code Playgroud)我在 SQL Server 2008 中将一个小表(1,000 行)与一个大表(8M 行)连接起来。连接使用大表上的非聚集覆盖索引,连接可以产生三种可能的查询计划。我试图找出哪个计划更好,但我也想概括这些知识,以便下次我可以更好地了解在查看 SQL I/O 统计信息时使用什么启发式方法。
计划 #1 是一个循环连接,并为大表发出统计信息,如下所示:
Scan count 2582, logical reads 35686, physical reads 1041, read-ahead reads 23052
Run Code Online (Sandbox Code Playgroud)
计划 #2 是一个合并连接并发出如下统计信息:
Scan count 1, logical reads 59034, physical reads 49, read-ahead reads 59004
Run Code Online (Sandbox Code Playgroud)
计划 #3 是一个散列连接并发出如下统计信息:
Scan count 3, logical reads 59011, physical reads 5, read-ahead reads 59010
Run Code Online (Sandbox Code Playgroud)
覆盖索引按 排序(ID, Date)。查询返回大约 50% 的 ID 的数据,并且对于每个 ID,返回最近 3 个月数据的连续块,通常大约为每个 ID 的 1/4 或行。该查询返回索引中大约 1/8 的总行数。换句话说,查询是稀疏的,但始终如此。
我的假设是,计划 #1 对这种工作负载很糟糕,因为将磁盘磁头移动 2,500 次(甚至 1,041 次)比顺序磁盘扫描要昂贵得多。我还假设#3 …
所以我们可以使用 Windows 登录或混合模式,但是我们可以将 SQL Server 配置为仅使用内部登录并阻止所有 Windows 登录吗?
作为预防性(或反应性)过程添加所有潜在的 Windows 登录并将其设置为受限权限的唯一解决方案是什么?
我们使用文件流中的Microsoft SQL Server 2008(SP2) - 10.0.4000.0(X64)和Windows Server 2008存储数百万文件。由于有数百万个文件,所有这些文件都被分为 100 个文件组,并一个接一个地按顺序插入。现在我们在每个文件组中有大约 15K 个文件,并且预计很快会增长到 20K。所以我们想知道文件组是否有最大行数限制才能提供最佳性能,或者当我们在单个文件夹中存储或准备存储大约 <20K 个文件时,操作系统端是否有任何最大行数限制以实现最佳性能?
对正确资源的任何建议也将非常有帮助。
我有一个指向 msdn 博客的链接,其中指出
4.检查 FILESTREAM 目录容器的文件数是否不超过 300,000 个,因为 NTFS 性能下降可能是一个问题,尤其是在启用生成 8.3 文件名时。
谢谢。
有人知道我如何列出 SQL Server 实例中的准备好的语句吗?
我只是想确保我在这些概念的正确轨道上,所以任何反馈都将不胜感激。
这是我刚刚优化的查询的理论,通过反复试验和阅读 MSDN 文档的过程。
查询
DECLARE @pic_id int
SET pic_id = 1
SELECT ROW_NUMBER() OVER (ORDER BY pic_date desc) AS row_num, *
FROM tbl_pics
WHERE deleted = 0 AND map_id = 1 AND (hidden = 0 OR pic_id = @pic_id)
Run Code Online (Sandbox Code Playgroud)
指数
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
Run Code Online (Sandbox Code Playgroud)
pic_id上还有一个PK索引
理论
键列是这样,因为它们用于 WHERE 子句(但不用于 OR 情况)或 ORDER BY。
非键 (INCLUDE) 列也是如此,因为它们在 WHERE 中使用,但因为它们用于 OR 场景,它们不能(不能 = 不会提高性能)成为键列。
这些假设正确吗?如果没有,我错过了什么?
谢谢!
当尝试连接到网络中另一个系统上的 SQL Server 数据库时,两者都在工作组中,当尝试使用带有 Windows 身份验证的 SQL Server Management Studio 连接到 SQL Server 2008 实例时,我连接上了。
但是当尝试从我的应用程序连接时,我收到以下错误
(登录失败。登录来自不受信任的域,不能用于 Windows 身份验证。)本机 = 18452)。
如果 SQL Server Management Studio 可以连接,我的应用程序需要什么才能连接?
sql-server-2008 ×10
sql-server ×8
filestream ×1
index ×1
performance ×1
security ×1
snapshot ×1
t-sql ×1