我正在重构数据库。有一个过程在两个表中的一个中插入一行,并且 id 需要在两个表中是唯一的。
目前,应用层会遍历预定的键数组。
我正在考虑 aSequence生成下一个 id,与 a 相关联SELECT MAX(id) + 1。
使用 Sequence 是否可以实现任何性能提升?
查看性能数据,我意识到在 VMWare 上运行的 Sql Server 2016 SP1 上的页面预期寿命突然下降,消耗 58982 MB 的 64 GB RAM。PLE 的先前值约为 133,000,突然下降到 7,300 秒。
看起来候选人只有一个查询会导致这种情况。我上传了执行计划。
该查询在早上很早就运行,因此看起来系统上几乎没有其他活动。它需要 01:27 m:s 运行时间并导致 600,000 次读取。
为什么这个查询会导致 PLE 的下降?
下降的后果是什么?
我正在尝试使用左外连接从两个表中返回数据。MetaKnight 拥有最多的 storeNames,我希望所有这些都返回,当然还有来自 KnightNinja 的相应数据。我把下面的语法放在一起,但我的语法只返回两个表中符合条件的商店的名称。例如,应该返回 Store D 和 Store E,因为日期是 2017 年 1 月 - 但语法不会返回它。为什么?
这是示例垃圾 DDL 和查询
Create Table MetaKnight
(
storeName varchar(500) NOT NULL
,storeNumber varchar(100) NOT NULL Primary Key
,openDate date NOT NULL
)
Create NonClustered Index snIndex
On MetaKnight (storeName ASC)
Create Table KnightNinja
(
storeName varchar(500) NOT NULL
,ssID varchar(100) NOT NULL Primary Key
,c1 int not null Default(0)
,c2 int not null Default(0)
,c3 int not null Default(0)
,c4 int not null Default(0) …Run Code Online (Sandbox Code Playgroud) 我有一种情况,我对 TempDB 的大小有限制,不能超过 350 GB。我autogrowth 10在 TempDB 上使用(百分比),因为我读到它应该是超过 500 MB 的数据库的最佳实践。
当我使用
dbcc checkdb with estimateonly
Run Code Online (Sandbox Code Playgroud)
在每个数据库上,我注意到 TempDB 的估计需求比我目前的需求低得多。将 返回的值相加dbcc checkdb with estimateonly得到大约 75 GB 的值。
TempDB 的大小目前为 300 GB。我无法进一步增加 TempDB 的允许大小。
我听说我们公司以前有一个 SQL 作业,如果它超过某个值,它会自动缩小 TempDB,但它没有在我们的新环境中使用。然而,我很矛盾,对缩小 TempDB 过于宽松可能会导致问题。
使用这篇文章中的信息,如果当前大小超过 200 GB 左右,将 TempDB 自动收缩到 200 GB 大小是否存在任何重大风险,看到dbcc checkdb with estimateonly返回的估计最小大小为 75 GB,这将导致这一个相当高的相对缓冲?
我读过这不是缩小 TempDB 的最佳做法,但在这种情况下,参考 TempDB 的估计最小大小,它可能更“合法”吗?
编辑
我做了以下查询,例如,internal object MB space, internal object dealloc MB space, statement text(查询), total …
我在 SQL Server 2008 上运行的数据库现在空间不足,错误如“由于文件组 'PRIMARY' 中的磁盘空间不足,无法为数据库 'database' 分配新页面。通过删除对象中的对象来创建必要的空间文件组,向文件组添加其他文件,或为文件组中的现有文件设置自动增长。” 是常见的。
如果我查询 FILEPROPERTY('SPACEUSED') 以获取主文件组上唯一的文件,我得到的空间不到 10MB,仅剩下 0.1% 的可用空间。所以,系统有理由抱怨。
我通过在 SSMS 上右键单击数据库来调查表占用的空间,运行一些有关磁盘使用情况的报告,并检测到有一个表占用了大量空间。我不明白为什么在 TRUNCATE 表之后, FILEPROPERTY('SPACEUSED') 返回完全相同(非常小)的数量。除非我弄错了,TRUNCATE 的工作原理是在引擎盖下,删除并重新创建表
但是,有关磁盘使用情况的标准报告表明该表不再占用大量空间。我预计免费空间会增加,而丑陋的“无法分配新页面...”消息会消失,但事实并非如此。
我在这里缺少什么?
以下是相关表格:
Table_B
B_ID(PK) Name A_Id
1 A 1
2 B 1
Table_C
C_ID B_Id(FK)
1 1
2 1
Run Code Online (Sandbox Code Playgroud)
现在我想Table_B从它的子表中删除行Table_C。以下是我正在触发的查询:
delete from Table_B where A_Id = 1
Run Code Online (Sandbox Code Playgroud)
我也想从其子项中删除所有行。可以用触发器吗?我在 上做了一个触发器Table_B,但它只删除了一行;所以我必须运行一个循环。
谢谢。
我们正面临日志驱动器 ( E :) 经常被填满的问题。
我们的 DBMS 是设置了 AOAG 的 SQL Server 2014 SP1。
我们有每周维护任务:
我们没有看到任何繁重的事务处理。
但是我们可以看到E:被填满了。
以下是自动增长设置:
注意:由于这是 AOAG 环境,我们每 30 分钟安排一次事务日志备份。
我的问题:
在这种情况下,是什么让E:被填满了?
为什么我的日志没有被截断?
在这种情况下,我们需要扩展 E: 吗?
截断我的日志的行动计划应该是什么?
截至目前,在我们决定下一个扩展驱动器的计划之前,我们不时缩小文件以释放空间。
请建议。
sql-server backup transaction-log availability-groups sql-server-2014
sql server 中是否有一个选项可以在数据库级别配置标识列的默认起始值(种子)。
我希望默认情况下,每个使用标识列创建的表,第一个值将从 3000 开始。而不是从 1 。我知道如何在表级别执行此操作。但是在数据库级别有可能吗?
10倍
我有一个查询,我想在其中检索不同的Child行,但按Parent. 如果我执行以下操作,则会收到错误消息,因为 中指定的列ORDER BY未包含在DISTINCT列表中:
SELECT
DISTINCT c.foo, c.bar
FROM Parent p
JOIN Child c on c.parentId = p.id
ORDER BY p.createdDate
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加p.createdDate到选择列表中,我将失去Child行的独特性,因为p.createdDate它们都不同。
如果我使用 CTE 或子查询首先进行排序,然后从中选择不同的行,则外部查询不保证它将保持内部/cte 查询的顺序。
有没有办法实现这一目标?
我想执行以下查询,该查询基本上显示计算的位置 >= .70 或 <= -.70 但是,我收到错误
消息 147,级别 15,状态 1,第 8 行
聚合可能不会出现在 WHERE 子句中,除非它位于包含在 HAVING 子句或选择列表中的子查询中,并且被聚合的列是外部引用。
这是示例 DDL - 编写此查询的合适方法是什么?
Declare @Hamburger Table (empName varchar(200), e float, a float, saleid varchar(10))
Insert Into @Hamburger (empName, e,a, saleid) Values
('Jake', 362, 233, 'E111'), ('Jake', 1431, 2702, 'E112'), ('Blue', 849, 280, 'R222'), ('Blue', 1418, 299, 'R390')
Select empName, e, a, saleid, AmtGained = Sum(Coalesce(e,0))-Sum(Coalesce(a,0)),
DiscountPercent = Sum(Coalesce(e,0)-Coalesce(a,0))/NullIf(Sum(Coalesce(e,0)),0)
From @Hamburger
where ((Sum(Coalesce(e,0)-Coalesce(a,0))/NullIf(Sum(Coalesce(e,0)),0) >= .70)
OR (Sum(Coalesce(e,0)-Coalesce(a,0))/NullIf(Sum(Coalesce(e,0)),0) <= -.70))
Group By empName, …Run Code Online (Sandbox Code Playgroud)