从SQL Server中的datetime字段中删除时间部分时,哪种方法提供了最佳性能?
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Run Code Online (Sandbox Code Playgroud)
要么
b) select cast(convert(char(11), getdate(), 113) as datetime)
Run Code Online (Sandbox Code Playgroud)
第二种方法确实发送了更多的字节,但这可能没有转换速度那么重要.
两者似乎都非常快,但在处理数十万或更多行时速度可能会有所不同?
另外,是否有可能有更好的方法来摆脱SQL中日期时间的时间部分?
灵感来自这个问题,对于SET NOCOUNT有不同的看法......
我们应该为SQL Server使用SET NOCOUNT ON吗?如果没有,为什么不呢?
它的作用编辑6,2011年7月22日
它会在任何DML之后抑制"xx行受影响"消息.这是一个结果集,当发送时,客户端必须处理它.它很小,但可以测量(见下面的答案)
对于触发器等,客户端将收到多个"受影响的xx行",这会导致某些ORM,MS Access,JPA等出现各种错误(参见下面的编辑)
背景:
一般接受的最佳实践(我想直到这个问题)是SET NOCOUNT ON在SQL Server中的触发器和存储过程中使用.我们在任何地方都使用它,快速谷歌显示大量的SQL Server MVP也同意.
MSDN表示这可能会破坏.net SQLDataAdapter.
现在,这对我来说意味着SQLDataAdapter仅限于完全简单的CRUD处理,因为它希望"n行受影响"消息匹配.所以,我不能用:
在问题marc_s(谁知道他的SQL的东西)说不要使用它.这与我的想法不同(我认为自己在SQL方面也有一定的能力).
有可能我错过了一些东西(随意指出明显的东西),但你们有什么想法呢?
注意:我看到这个错误已经好几年了,因为我现在不使用SQLDataAdapter.
在评论和问题后编辑:
编辑:更多想法......
我们有多个客户端:一个可以使用C#SQLDataAdaptor,另一个可以使用Java中的nHibernate.这些可能会以不同的方式受到影响SET NOCOUNT ON.
如果您将存储过程视为方法,那么假设某些内部处理以某种方式为您自己的目的而工作则是不好的形式(反模式).
编辑2:触发器打破nHibernate问题,SET NOCOUNT ON无法设置
(不,它不是一个重复的这个)
编辑3:更多信息,感谢我的MVP同事
编辑2011年5月13日
编辑2011年6月14日
使用表变量打破JPA,存储过程:JPA 2.0是否支持SQL Server表变量?
编辑6:2011年8月15日
SSMS"编辑行"数据网格需要SET NOCOUNT ON:使用GROUP BY更新触发器
编辑2013年3月7日7:07
来自@RemusRusanu的更深入的细节:
SET NOCOUNT …
我想知道是否有可能做这样的事情(这不起作用):
select cast( (exists(select * from theTable where theColumn like 'theValue%') as bit)
看起来它应该是可行的,但许多应该在SQL中工作的东西不会;)我已经看到了这方面的解决方法(SELECT 1 where ... Exists ...)但似乎我应该能够将存在函数的结果转换为一点并完成它.
我需要在表A上编写一个Insert,Update Trigger,它将删除表B中的所有行,其中一列(比如Desc)的值类似于表A列中插入/更新的值(比如Col1).我将如何编写它以便我可以处理Update和Insert案例.如何确定是否为更新或插入执行了触发器.
当在select语句中用作字段值时,是否可以将1或0表示为位?
例如
在这种情况下,语句(它是select语句的一部分)ICourseBased的类型为int.
case
when FC.CourseId is not null then 1
else 0
end
as IsCoursedBased
Run Code Online (Sandbox Code Playgroud)
要使它成为一种类型,我必须转换两个值.
case
when FC.CourseId is not null then cast(1 as bit)
else cast(0 as bit)
end
as IsCoursedBased
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方式将值表示为位类型,而不必每次都进行转换?
(我正在使用MS SQL Server 2005)
是否可以在TSQL中解析JSON?我不是要创建一个JSON字符串,我的意思是解析作为参数传入的json字符串.
比较这两个查询.将过滤器放在连接条件或are子句中是否更快.我一直认为它在连接标准上更快,因为它在最快的时刻减少了结果集,但我不确定.
我将构建一些测试来查看,但我也希望得到关于哪个更清晰易读的意见.
查询1
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
INNER JOIN TableB b
ON x.TableBID = b.ID
WHERE a.ID = 1 /* <-- Filter here? */
Run Code Online (Sandbox Code Playgroud)
查询2
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
AND a.ID = 1 /* <-- Or filter here? */
INNER JOIN TableB b
ON x.TableBID = b.ID
Run Code Online (Sandbox Code Playgroud)
编辑
我运行了一些测试,结果显示它实际上非常接近,但该WHERE条款实际上稍快一点!=)
我绝对同意在WHERE条款上应用过滤器更有意义,我只是对性能影响感到好奇.
已确认的时间标准: 143016 ms
已安排时间加入标准: 143256 ms
测试
SET …Run Code Online (Sandbox Code Playgroud) 我的问题是
如何将列的值增加1.
例如,假设一列ID具有值1,2,3,4,...
现在,当我更新此表时,ID列应该增加1,
现在ID将成为2,3,4,5,..
我的SQL Server CPU在今天的大部分时间里都处于90%左右.
由于它一直在使用,我无法重新启动它.
是否有可能找出SQL中导致这种CPU过载的原因?
我已经运行了SQL Profiler,但是很多事情都很难判断是否有任何特别的原因造成它.
我已经运行了sp_who2,但我不确定一切是什么意思,如果有可能在这里找出可能的问题.
为了抢先任何"它可能只是被大量使用"的回应,这只是在今天从完全正常的活动水平开始.
我正在寻找在SQL中找到导致CPU悲痛的方法.
我想在SQL中比较两个varchars,一个是类似的Cafe,另一个Café在SQL中有一种方法可以比较两个值.例如:
SELECT *
FROM Venue
WHERE Name Like '%cafe%'
Run Code Online (Sandbox Code Playgroud)
那么,如果有一个名称的场所,Big Bobs Café Extraordinaire它将被包含在结果集中?
sql-server ×8
t-sql ×8
sql ×5
ado.net ×1
bit ×1
collation ×1
concurrency ×1
cpu-usage ×1
date ×1
datetime ×1
json ×1
performance ×1
triggers ×1