sql server 如何判断一个函数是否是确定性的?
考虑下面的函数,我认为它是确定性的(因为它最终是一个整数运算),但是当我调用它的 objectproperty 方法时,sql server 返回 0。
了解它是如何工作的将帮助我理解为什么我对这个功能的评估是错误的。
CREATE FUNCTION dbo.EndOfPreviousMonth ( @Date date )
RETURNS date
AS BEGIN
RETURN DATEADD(day, 0 - DAY(@Date), @Date);
END;
SELECT dbo.EndOfPreviousMonth('2010-01-01'); --Usage example
--Returns 0, I expected it to return 1
SELECT OBJECTPROPERTY( OBJECT_ID( 'dbo.EndOfPreviousMonth' ), 'IsDeterministic' );
Run Code Online (Sandbox Code Playgroud) 我们最近将我们的 Intranet 生产数据库从 SQL Server 2008 迁移到了全新的 SQL Server 2008 R2 服务器。
由于 DBCC 错误(检查数据库完整性任务),备份作业自迁移以来一直失败。
昨天我尝试在生产数据库上使用 repair_rebuild 选项运行 DBCC CHECKDB,随后的 DBCC CHECKDB 没有显示任何错误。针对生产数据库的 DBCC CHECKDB 再次显示错误消息,备份已完成,但维护计划当然失败了:我有(一长串)以下错误消息:
Table error: page (1:1100029), whose header indicates that it is allocated to object ID 373210913, index ID 1, partition ID 72057701886525440, alloc unit ID 72057702118457344 (type In-row data), is allocated by another object.
Msg 2534, Level 16, State 2, Line 1
Table error: page (1:1100030), whose header indicates that it is allocated to object …Run Code Online (Sandbox Code Playgroud) SQL Server 是否有任何简单的方法来获取有关给定查询在执行过程中取出多少(以及可能是什么类型)锁的指标?
基本原理...
我正在重写一个相当讨厌的存储过程,它大量使用游标。基于集合的解决方案是可能的,因此我得到了三个版本:原始版本、带有表变量的基于集合的版本和完全基于 CTE 的基于集合的版本。我正在为基于 CTE 的解决方案获得良好的指标,但由于 CTE 版本创建的查询的大小和复杂性,我对发布它持谨慎态度,直到我对它进行了尽可能多的尽职调查。
现在我意识到 SQL 取出的锁是它认为需要在给定时间点取出的锁,并且在加载的生产服务器上它的行为可能会有所不同,但我希望它能给我一种感觉它会表现。
目前我正在使用探查器并保持事务打开以便我可以运行sp_lock,但想知道我是否遗漏了 SQL Server 2008 中的一个技巧。
或者,我试图说服自己分析器在插入表变量时返回大量读取是可以的(对于给定的值 Ok),但我没有说服自己。CTE 解决方案的读取次数是 table-var 版本的一半,而 table-var 版本的高读取计数似乎完全取决于插入。在持续时间方面,CTE 和表 var one 大致相同,执行时间比基于游标的方法快 150-200%。
背景:用户在 Active Directory 中将其名称从 Domain\oldname 更改为 Domain\newname 并使用 Domain\newname 成功登录到网络,但 Domain\oldname 出现在 Profiler 的 LoginName 和 NTUserName 列中。
用户的 SQL Server 权限是通过在 SQL Server 安全中设置的组授予的。
问题:有没有人观察到这种行为并知道为什么 SQL Server 仍然选择 Domain\oldname(sp_who2 显示相同的信息)?
顺便说一句,在这里发布问题之前已经花了大量时间进行研究,在我看来,Profiler/SQL 2008 R2 并不是真正的问题。
我需要一种快速、同步、持续时间最短的插入表的方法。我试过的(“盲”)是:
我使用的测试场景由 100 个连接组成,每个连接都运行一个 INSERT,然后等待 0.1 秒,然后无限期地再次等待。每个“插入器”记录执行时间。
查看执行时间,我有时会在插入时看到 1.5 秒甚至 10 秒(作为例外情况),否则我看到的是典型的 0.2 秒。
进一步的背景:
我应该在哪里寻找对此类流程性能的进一步改进?
供应商系统(即在我的控制之外)正在将一行插入到我控制的数据库中的表中。此插入中的一列将包含我不希望出现在数据库中的敏感信息。
如果我使用INSTEAD OF INSERT触发器将这一列清空,敏感信息是否仍会出现在事务日志中?
就我而言,SQL Server Management Studio 的“工具”菜单上没有它,正如一些博客和论坛中所报告的那样。显然你以某种方式得到了它,但你是如何得到它的,如果你得到了,是抽奖的运气还是什么?我是 MSDN 订阅者。
是否可以使用一些明确定义的步骤安装 Profiler?像下载 X,按菜单项 Y 并单击按钮 Z 那种处方?
[编辑附加信息] 从 SQL Server 2005 企业版升级到 Server 2008 R2 企业版没有帮助(以前,在 2008 R2 版本中,我只有速成版)。我正在尝试安装程序的各种选项,但无法从 Basic Tools(最初随 2008 R2 Express Edition 一起安装)升级到 Complete Tools,我希望其中包含 Profiler。无法在我尝试的安装选项的任何变体中选中完整工具选项。
我在一个数据库中有 50 多个表。
我不想在数据库中的每个表上使用以下 SQL。
select * from {table_name}
Run Code Online (Sandbox Code Playgroud)
那么,是否可以使用 sql 显示同一数据库中每个表的前 10 条记录?
这是 IT 资产的库存数据库。所使用的模型经过修整,以专注于手头的问题。使用 SQL Server 2008。感谢您抽出时间阅读并提供您可以提供的任何输入。
我的设计包括一个Device表格,其中包含可以输入库存的各种设备。每个设备都有一个布尔标志,CanNetwork表明设备是否具有网络能力,例如,对于大多数计算机CanNetwork = true,对于硬盘驱动器CanNetwork = false;有些打印机是真的,有些是假的。你明白了。
该CanNetwork字段确定创建库存记录时与网络相关的信息是否相关。
我的第一个设计在表上使用索引Device.DeviceID并Device.CanNetwork在外键约束中使用Asset。

NetworkStatus在此设置中,该表如下所示:
+----------------------------------------------------------------------+
| NetworkStatusID | NetworkStatus | NetworkStatusDescription |
|----------------------------------------------------------------------|
| 1 | Connected | Device connected to network. |
| 2 | Not Connected | Device not connected to network. |
| 3 | Do Not Connect | Do not connect device to network. |
+----------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
我在Asset …
也许重复,但我相信我的情况有点不同。从我在 SQL Server Central 上得到的这篇文章的答案之一,它也很方便,但不是完全相同的场景:继承数据库时要做的 9 件事
几周前开始了一份新工作。我应该担任 BI 分析师和 SQL 开发人员。但就在第一次任务中,大家注意到一般来说一切都需要很长时间才能执行。问第一天指导我的人,我的主管你可以说,他告诉我他们知道数据库是一团糟。问我是否可以看一看可以做些什么,得到了肯定的回答。
所以我开始深入研究,使用几个非常方便的脚本,例如:
正如他们告诉我的那样,我发现一团糟。例如,blitzindex 过程返回近 2000 行,其中包含大量重复索引、NC 索引,包括表中的所有列、大量堆表、非常宽的索引等等。至于备份,几个星期以来一直没有完成,询问它,IT 人员只是每晚将数据库复制到不同的服务器。几个数据库超过 100Gb,其他几个也接近这个大小。每张桌子的统计数据每天都会更新。在不太大的表(只有几百万行)上,有些报告需要一个多小时才能完成。等等。
作为测试,我花了几天时间调整几个大表以及使用它们的不同过程和查询。使用分析器准备基线。然后做了一些更改并再次运行测试查询。正如预期的那样,一个现在需要大约 8 分钟的报告在大约 1 分钟内运行,而其他几个查询现在也只用了不到一半的时间。所有这些更改都是在测试服务器上完成的,我们还有一个报告服务器和一个生产服务器。
考虑到我应该是一名 BI 和 sql 开发人员,在办公室拥有有限的新权限,而不是 DBA。为了应对这种情况,您还建议我采取哪些其他措施?有一个指定的 DBA,但似乎只是一个做一些 dba 任务的 sql 开发人员。有 DBA,但他们告诉我他大约在半年前离开了。我应该忘记这些问题吗?或者作为一个大量使用数据库的人,我必须指出问题并提出解决方案?有人遇到过同样的情况吗?
编辑
谢谢大家的评论和回答。我发这个问题已经一个月了。所以现在我可以指出更准确的问题。
我相信索引是主要问题之一,但完全禁止删除索引,至少目前是这样。即使存在具有多个相同索引的关键情况,例如在其中一个主表上,大约有 3000 万行并且还在增长,也有 3 个 NC 索引,其中包含 7 个索引列并包括所有列。我可以在非常严格的监督下创建索引,但仅此而已。
有几个禁用的索引,它们会影响 CRUD 操作的性能吗?
“优步观点”综合症。在另一个视图中的另一个视图中有很多视图。关于这一点的一些建议?
许多 sp 在 SMSS …
sql-server-2008 ×10
sql-server ×3
index ×2
performance ×2
corruption ×1
foreign-key ×1
insert ×1
locking ×1
optimization ×1
profiler ×1