我需要编写一个只插入一行的查询,即使该查询运行多次。作为 SQL 的新手(以及新的),我做了一个,if not exists(...)但一个朋友说他更喜欢删除该行,如果它存在,然后再次添加它。
EXISTS或反之亦然可能有什么好处?想要从一天中获取所有记录。所以2013-03-05 00:00:00.000和之间的一切2013-03-05 23:59:59.999。我们在后端与发生在2013-03-06 00:00:00.000.
因此,在测试中,我在 SSMS 中运行:
select cast('2013-03-05 23:59:59.999' as datetime)
select cast('2013-03-05 23:59:59.996' as datetime)
select cast('2013-03-05 23:59:59.994' as datetime)
Run Code Online (Sandbox Code Playgroud)
并得到:
2013-03-06 00:00:00.000
2013-03-05 23:59:59.997
2013-03-05 23:59:59.993
Run Code Online (Sandbox Code Playgroud)
毫秒部分会稍微回落。在第一行的情况下,它真的很重要。因为我不想要 2013-03-06 00:00:00.000 - 我想要午夜前一毫秒。
TSQL 在文档中声明它使用小数秒,而不是使用毫秒的 .Net 日期时间。这似乎只是语法上的差异,但如果您真的关心 TSQL 中的毫秒精度,您是否会被迫全面使用DateTime2。从datetime2to 转换datetime仍然会在几毫秒内把事情搞砸。
在 c# 中DateTime.Parse("03/5/2013 23:59:59.999").Millisecond仍然返回 999。
我这样解释好吗?如果我关心毫秒精度,我datetime2只坚持使用。
通常,这将是一个简单的修复,但在这种情况下,我们使用的是datetime作为参数接收的 Microsoft 系统函数。
我想计算从包含单个日期/时间字段的数据行工作所花费的时间。
给定日期的第一次出现可以被视为开始时间,下一次出现是结束时间,在任何给定日期来回交替。因此,如果我从上午 9:00 开始并在下午 12:00 吃午饭,在中午 12:30 吃完午饭返回,然后在下午 5:00 离开,我的数据将如下所示:
2013-03-07 09:00:00
2013-03-07 12:00:00
2013-03-07 12:30:00
2013-03-07 17:00:00
Run Code Online (Sandbox Code Playgroud)
这是另一个示例(在我的语言环境中,我们.用作日期分隔符):
22. 2. 2013 9:09:00
22. 2. 2013 13:28:09
25. 2. 2013 9:43:16
25. 2. 2013 15:15:19
25. 2. 2013 19:30:00
25. 2. 2013 21:30:00
26. 2. 2013 8:27:54
26. 2. 2013 16:31:51
27. 2. 2013 8:52:59
27. 2. 2013 15:08:35
28. 2. 2013 8:37:54
28. 2. 2013 16:37:08
28. 2. 2013 18:30:00
28. 2. 2013 20:30:00
Run Code Online (Sandbox Code Playgroud)
我想知道任何一天的工作总时间,并且还希望能够统计花费的时间,例如,任何给定的一周或一个月。
我们有一个在 SQL 服务器后端运行的机床应用程序。这些工具每天都在运行,我正在寻找一种方法来增量备份数据库而不会造成任何机器停机。
我见过有两台服务器的镜像解决方案,但这些解决方案对我们来说不起作用,因为成本和大小限制。是否可以以编程方式或通过某些服务将此数据库镜像到主 PC 上的备份硬盘驱动器?
一些数据丢失是可以接受的。
这两个脚本之间有区别吗?或者,第一个脚本的所有额外标记/属性(即:NONCLUSTERED,WITH...等...)是否都是 SQL Server 2008 中第二个脚本的默认值?
CREATE UNIQUE NONCLUSTERED INDEX [DEID_MAP_IDX1] ON [dbo].[DEID_MAP]
(
[VISIT_NUM] ASC
) WITH
(PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
CREATE UNIQUE INDEX [DEID_MAP_IDX1] ON [DEID_MAP]
(
[VISIT_NUM] ASC
);
Run Code Online (Sandbox Code Playgroud)
仅供参考:在执行批量数据加载之前,有 ETL 代码使用此脚本删除索引,然后最后使用上面的第二个脚本重新创建索引。
DROP INDEX [deid_map_idx1] ON [deid_map] WITH ( ONLINE = OFF );
Run Code Online (Sandbox Code Playgroud)
编辑:
应用上面的简单索引(第二个脚本)后,我得到了这个:
SQL Server Management Studio > 扩展表 …
我有一个相当简单的查询,使用sys.dm_db_missing_index_group_stats来标识我的 SQL Server 数据库中缺少的索引。这是非常常用的。我的问题是如何确定这些索引中哪些是重要的并且应该创建,我应该全部创建它们还是有任何其他秘密?我特别应该在 avg_user_impact 或 avg_total_user_cost 列中寻找什么?
这对我来说不是一个大问题,但是,我仍然想了解这里发生了什么。我的 SQL Server 2008 (10.00.1600) 上有两个数据库 - 它们是从同一个备份中恢复的(之后我们的 C# 程序完成了一些优化工作 - 两个数据库的过程相同,+ 一些少量插入/deletes 之后被执行)。
但是当我备份这些数据库时,输出文件大小不同:
Database1: 706 MB
Database2: 1690 MB
Run Code Online (Sandbox Code Playgroud)
用于进行两个备份的查询(由 SSMS 生成的脚本):
BACKUP DATABASE [DatabaseX] TO DISK = N'D:\databaseX.bak'
WITH NOFORMAT, NOINIT, NAME = N'DatabaseX-Full', SKIP, NOREWIND,
NOUNLOAD, NO_COMPRESSION, STATS = 10
Run Code Online (Sandbox Code Playgroud)
以下是数据库的文件统计信息:
Database1:
Data allocated: 1950 MB
Logs allocated: 5121 MB
Output backup size: 706 MB
Database2:
Data allocated: 1704 MB
Logs allocated: 50 MB (this was truncated in the process of my investigation :))
Output backup …Run Code Online (Sandbox Code Playgroud) 我有 SQL Server 2008 和一个具有完整恢复模型的数据库。通常,队列长度小于 1。但有时它会在几秒钟内增长到数千(3000 !!)。此时,许多写入查询以超时错误告终。
使用资源监视器,我发现此时 sqlserver.exe 将大量数据写入主数据库文件(MDF)。虽然它通常写入事务日志(LDF)。
使用 SQL Server Profiler,我发现当时没有运行大量查询。
我认为,这是某种SQL服务器的后台操作,但我想知道是哪种?
数据库还启用了 READ_COMMITED_SNAPSHOT 和镜像(同步模式)。这个事实可能是我问题的原因吗?
更新:我发现写入日志(而不是数据文件)是完全恢复模式的默认行为。并且日志只能通过备份事务日志操作复制到数据文件中。还是不明白为什么SQL server每十分钟复制一次日志...
我的数据库目前在ID每个表的列上都有一个主键/聚集索引。但是,连接到数据库的应用程序始终查看定义为:
SELECT * FROM Table WHERE DeletedDate IS NULL
Run Code Online (Sandbox Code Playgroud)
最好将 the 添加DeletedDate到聚簇索引中,还是将非聚簇索引DeletedDate作为包含的更好的做法?
index sql-server clustered-index sql-server-2008-r2 nonclustered-index
我最近在我们的 SQL Server 框中添加了一个新磁盘,并按照Microsoft 的这些步骤将 .mdf 文件移动到新驱动器。出于性能原因,我选择将日志文件保留在原始磁盘上。
当我尝试使数据库重新联机时,遇到了系统权限异常(需要管理员访问权限)。我进入了 Windows 服务并更改了 SQL Server 以作为本地系统帐户登录。这似乎解决了问题。
但是,两天后,.mdf 文件的大小与传输前的大小相同(我将其脱机,仅更改了时间戳)。我查看了日志,通常在1GB以下,发现现在已经达到了30GB。
我错过了什么吗?为什么 SQL Server 没有将任何这些新数据写入 DB 文件本身?