我将一些备份文件移到了新位置。但是,SQL Server 似乎认为它们仍在原来的位置。(也就是说,当我使用 SSMS 还原数据库向导时,它仍然使用旧位置提出还原计划。)
有没有办法移动文件以便 SQL Server 收到有关通知?
我将一些备份文件移到了新位置。但是,SQL Server 似乎认为它们仍在原来的位置。(也就是说,当我使用 SSMS 还原数据库向导时,它仍然使用旧位置提出还原计划。)
有没有办法移动文件以便 SQL Server 收到有关通知?
我目前正在浏览《Pro SQL Server 2019 管理:现代 DBA 指南》,发现一件事让我有些困惑。
在第 5 章:配置实例中,有关最小和最大服务器内存的部分(第 139-140 页)说:
在许多环境中,您可能希望为最小和最大服务器内存提供相同的值。这将避免 SQL Server 动态管理其保留的内存量的开销。
但是,如果您有多个实例,则动态内存管理可能会有所帮助,以便在任何给定时间具有最重工作负载的实例可以消耗最多的资源。
...假设您有一个实例并且没有其他应用程序(例如 SSIS 包)在服务器上运行,您通常会将最小和最大内存设置设置为
- 内存 - 2 GB
- (内存/8)* 7
然而,“为最小和最大服务器内存提供相同的值”的建议与文档相矛盾,文档说:
不建议将最大服务器内存 (MB) 和最小服务器内存 (MB) 设置为相同或接近相同的值。
在什么情况下最好将最大服务器内存和最小服务器内存设置为相同的值?
或者我对建议有什么误解?
系统视图sys.dm_db_index_usage_stats
有几个列反映系统查询对索引的使用情况。但是,这是什么意思?为什么系统要查询我的表?
该文档不是特别有帮助:
栏目名称 | 数据类型 | 描述 |
---|---|---|
系统搜索 | 大整数 | 系统查询的查找次数。 |
系统扫描 | 大整数 | 系统查询的扫描次数。 |
系统查找 | 大整数 | 系统查询的查找次数。 |
系统升级 | 大整数 | 系统查询的更新次数。 |
我有具有树结构的表(由hierarchyid
列定义),我想选择特定记录的所有后代。为此,我正在使用hiearchyid.IsDescendantOf()
方法。
我预计,由于我不进行简单的比较,但我正在执行操作(在本例中我调用该IsDescendantOf()
方法),那么我将得到一些带有索引扫描等的可怕执行计划。
然而,SQL Server 将其优化为漂亮的小索引查找。
我很困惑为什么以及如何。
CLR 类型上的调用方法通常会被优化吗?我假设 SQL Server 将 CLR 类型视为不透明的黑匣子,因此无法发挥其魔力。(因为它也无法在本机 SQL 函数上执行此操作。)
或者这仅适用于该特定方法?(由于这些hieararchyid
值是按深度优先排序的,因此我只需通过比较就可以获得类似的结果。)
演示:
CREATE TABLE dbo.HierarchyExample (
Id INT PRIMARY KEY,
Hieararchy HIERARCHYID NOT NULL
);
INSERT INTO dbo.HierarchyExample(Id, Hieararchy)
VALUES
(1, hierarchyid::Parse('/1/')),
(2, hierarchyid::Parse('/1/1/')),
(3, hierarchyid::Parse('/1/2/')),
(4, hierarchyid::Parse('/1/3/')),
(5, hierarchyid::Parse('/1/3/1/')),
(6, hierarchyid::Parse('/1/3/2/')),
(7, hierarchyid::Parse('/1/3/3/')),
(8, hierarchyid::Parse('/1/4/')),
(9, hierarchyid::Parse('/1/4/1/')),
(10, hierarchyid::Parse('/1/4/2/'));
CREATE INDEX IX_HierarchyExample_Hierarchy
ON dbo.HierarchyExample (Hieararchy);
SELECT descendant.*
FROM HierarchyExample ancestor
INNER JOIN HierarchyExample descendant
ON descendant.Hieararchy.IsDescendantOf(ancestor.Hieararchy) = 1
WHERE ancestor.Id = 1
DROP TABLE IF EXISTS dbo.HierarchyExample;
我试图理解这种奇怪的行为。
SELECT 1;
SELECT 1
FROM NonexistentTable;
SELECT 1;
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'NonExistentTable'
)
BEGIN
SELECT 1
FROM NonExistentTable;
END
SELECT 1;
EXECUTE sp_nonexisting_procedure;
SELECT 1;
SELECT NonexistentColumn
FROM sys.databases;
CREATE TABLE ExistingTable(Id INT, [Name] NVARCHAR(255));
GO
然后运行这个↓↓↓↓。这完全失败了,甚至没有选择 1 。
SELECT 1;
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'ExistingTable'
AND COLUMN_NAME = 'NonexistingColumn'
)
BEGIN
SELECT NonexistingColumn
FROM ExistingTable;
END
GO
为什么在发送查询后立即检查列的存在,甚至没有尝试先执行查询的有效部分?
让我更加困惑的是,只有当执行到达时才会检查表。(天真地,我希望表格更重要,因此得到更严格/更早的检查。)