小编Stu*_*ler的帖子

case 与 isnull 与合并

我只是在阅读 SQL Server 2012 考试的文档,我看到了以下几点:

case 与 isnull 与合并

现在,我知道如何使用每一种,但我不知道何时使用每一种。请一些机构澄清。谢谢。

附言。请问我们可以有一个考试问题的标签吗?

sql-server sql-server-2012

9
推荐指数
1
解决办法
6057
查看次数

在 SQL Server 中实现应用程序锁(分布式锁定模式)

在我的应用程序中,我必须执行分布式锁定模式。因为我们已经有一个 SQL Server 实例可以使用,所以我们决定在我们的 Web 应用程序的 SQL 层实现锁定是最容易的。

可以根据多种条件获得锁,包括:

  • 请求的锁类型
  • 任意应用程序标识符

出于所有意图和目的,将上述两个条件视为int数据类型。

在这种模式中,我们希望将我们所有的锁都视为 FIFO,我相信SERIALIZABLE隔离级别会给我们带来这种好处。

以下是我们建议如何执行“锁定”:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

IF EXISTS (SELECT 1 FROM locks WHERE LockType = @LockType AND ApplicationIdentifier = @ApplicationIdentifier)
    BEGIN
        -- Awesome, the lock will be acquired
        INSERT INTO locks OUTPUT INSERTED.LockId VALUES (2,3)
    END
ELSE
    BEGIN
        -- Someone already has the lock
        SELECT -1
    END

SET TRANSACTION ISOLATION LEVEL READ COMITTED
Run Code Online (Sandbox Code Playgroud)

和“解锁”:

DELETE FROM locks WHERE LockId = @LockId
Run Code Online (Sandbox Code Playgroud)

所以我的问题有两个方面: …

sql-server locking isolation-level

7
推荐指数
1
解决办法
7352
查看次数

带有日期列的建议 SQL Server 2005

我在 SQL Server 2005 中有两个日期时间列,我需要在没有日期时间的时间部分的情况下进行查询。目前,我的查询看起来像这样(只是一个例子):

WITH Dates AS ( 
        SELECT [Date] = @StartDate
        UNION ALL SELECT [Date] = DATEADD(DAY, 1, [Date])
        FROM Dates WHERE [Date] < @EndDate
) 
SELECT DISTINCT ID
FROM table t
CROSS APPLY DATES d
WHERE d.[Date] BETWEEN CONVERT(DATETIME, CONVERT(VARCHAR, t.StartDate, 103)) AND CONVERT(DATETIME, CONVERT(VARCHAR, t.EndDate, 103))
Run Code Online (Sandbox Code Playgroud)

现在这会导致完整的聚集索引扫描(惊喜,惊喜)。我正在想办法让这个更快(实际查询需要 3 分钟:O)。我曾想过执行以下操作,但由于时间不够,还没有尝试过:

  1. 使用仅包含日期部分的计算列
  2. 索引表示计算列(不确定这是否可能?)
  3. 使用索引视图(同样,不确定这是否可行,是否可行?)

最简单的方法是更新列并删除所有时间信息,但我不能这样做:(

有任何想法吗?

更新

感谢您到目前为止的所有答案。我认为问题的重点被忽略了,因为我对自己想要什么有点不清楚。我的错。我只是想优化查询的日期转换部分,因为我处理的数据量实际上很小(在一年长的日期范围内交叉应用后 < 500,000)。很抱歉对此造成混淆。

对于那些为我优化其余查询的人,我可以通过使用看到人们在说什么,< >但请考虑以下几点:

  1. 传入的参数是一个日期范围(例如,从1日到本月末)
  2. 表格中的开始日期可以出现在参数日期范围之前或期间(例如,只有结束日期在日期范围内)
  3. 表格中的结束日期可以出现在参数日期范围内或之后(例如,只有开始日期在日期范围内)
  4. 最后,表中的开始和结束日期在参数日期范围内。

就个人而言,鉴于上述情况,我永远无法找到< >工作的解决方案。我可以让它正常工作并且不会错过任何东西的唯一方法是使用 CTE 并说明 where d.[Date] …

performance sql-server-2005 query

6
推荐指数
1
解决办法
1031
查看次数

是否建议清除查询计划缓存

和标题描述的差不多。我刚刚检查了一个 SQL Server 并注意到有很多查询计划膨胀可以通过适当的参数化来修复。

对代码进行更改后,是否建议我们清除查询计划缓存并让其自行重建?还是会及时清除?

注意:在前 50 个最大的查询中,有 47 个相同但参数不同。

performance sql-server-2008 sql-server query-performance

6
推荐指数
1
解决办法
309
查看次数

Tempdb 自动增长设置

继我最近在 Tempdb 上提出的一个问题之后。我想知道在添加和移动 tempdb 文件时如何正确设置自动增长属性?

我问这个问题是因为我想让 SQL Server 使用循环算法将工作负载分散到每个文件上。据我了解,如果文件大小不相等,那么 SQL Server 将使用空间最大的文件,从而增加导致闩锁争用的机会。我这里的理解正确吗?

干杯,

sql-server tempdb

5
推荐指数
1
解决办法
2万
查看次数

通过 SQL Server 中的数据库邮件进行健康检查

我有一些 SQL 脚本,希望每天在我的 SQL Server 上运行。如何多次查询并获得类似于以下内容的输出:

Health check for <server>

Query Title 1:

<query results 1>


Query Title 2:

<query results 2>
Run Code Online (Sandbox Code Playgroud)

我正在检查诸如上次良好备份、正常运行时间等内容,因此它们彼此不相关。我计划在 SQL Server 作业中使用 sp_send_db_mail。这是完成这项任务的最佳方式吗?

理想情况下,我只想要一封电子邮件。

更新

经过多年的战斗!!!到目前为止,我找到的解决方案是将其放入存储过程,然后像这样执行存储过程:

EXEC msdb.dbo.sp_send_dbmail
        @recipients = N'<email>',
        @body = @body, 
        @subject = @subjectt,
        @profile_name = @ProfileName,
        @query ='exec test..sp_checks'
Run Code Online (Sandbox Code Playgroud)

这可以用于多个选择语句吗?

sql-server-2005 sql-server-2008

2
推荐指数
1
解决办法
421
查看次数

表值函数与 UDF SQL Server

我目前正在看这个Entity Framework 上视频,大约 15 分钟后,演讲者说表值函数偶尔会执行 UDF。

我的问题是在什么情况下 TVF 会执行 UDF?

sql-server

1
推荐指数
1
解决办法
492
查看次数