我遇到了一个奇怪的情况,附加OPTION (RECOMPILE)到我的查询导致它在半秒内运行,而省略它会导致查询花费超过五分钟.
从查询分析器或我的C#程序执行查询时就是这种情况SqlCommand.ExecuteReader().打电话(或不打电话)DBCC FREEPROCCACHE或DBCC dropcleanbuffers没有任何区别; 查询结果总是立即返回,OPTION (RECOMPILE)如果没有它,则会超过五分钟.始终使用相同的参数调用查询[为了此测试].
我正在使用SQL Server 2008.
我对编写SQL OPTION非常熟悉,但之前从未在查询中使用过命令,并且在扫描此论坛上的帖子之前不熟悉计划缓存的整个概念.我从这些帖子中了解到,这OPTION (RECOMPILE)是一项昂贵的操作.它显然为查询创建了一个新的查找策略.那么为什么然后,省略它的后续查询OPTION (RECOMPILE)是如此之慢?后续查询是否应该使用在前一次调用中计算的查找策略,其中包括重新编译提示?
拥有一个需要在每次调用时重新编译提示的查询是否非常不寻常?
对于入门级问题我很抱歉,但我无法真正做到这一点.
更新:我被要求发布查询...
select acctNo,min(date) earliestDate
from(
select acctNo,tradeDate as date
from datafeed_trans
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_money
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_jnl
where feedid=@feedID and feedDate=@feedDate
)t1
group by t1.acctNo
OPTION(RECOMPILE)
Run Code Online (Sandbox Code Playgroud)
从查询分析器运行测试时,我预先添加以下行:
declare @feedID int
select @feedID=20
declare …Run Code Online (Sandbox Code Playgroud) 我需要在表A上编写一个Insert,Update Trigger,它将删除表B中的所有行,其中一列(比如Desc)的值类似于表A列中插入/更新的值(比如Col1).我将如何编写它以便我可以处理Update和Insert案例.如何确定是否为更新或插入执行了触发器.
我听说你应该在索引声明的开头放置最具选择性的列.例:
CREATE NONCLUSTERED INDEX MyINDX on Table1
(
MostSelective,
SecondMost,
Least
)
Run Code Online (Sandbox Code Playgroud)
首先,我说的是正确的吗?如果是这样,我可能会通过重新排列索引中列的顺序来看到性能上的巨大差异,还是更像是"很好做"的做法?
我问的原因是因为在通过DTA进行查询后,它建议我创建一个索引,其中几乎所有列都与现有索引相同,只是顺序不同.我正在考虑将缺少的列添加到现有索引并调用它.思考?
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
Run Code Online (Sandbox Code Playgroud)
我明白了
"无效的列名称daysdiff".
Maxlogtm是一个日期时间字段.这是让我疯狂的小东西.
有没有办法在SQL服务器中更新多个列,就像使用insert语句一样?
就像是:
Update table1 set (a,b,c,d,e,f,g,h,i,j,k)=
(t2.a,t2.b,t2.c,t2.d,t2.e,t2.f,t2.g,t2.h,t2.i,t2.j,t2.k)
from table2 t2
where table1.id=table2.id
Run Code Online (Sandbox Code Playgroud)
或类似的东西,而不是像这样:
update table set a=t2.a,b=t2.b etc
Run Code Online (Sandbox Code Playgroud)
如果你有100多列,写起来可能很烦人.
基本上我在我的EF数据库中有一个表,它具有以下属性:
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Image { get; set; }
public string WatchUrl { get; set; }
public int Year { get; set; }
public string Source { get; set; }
public int Duration { get; set; }
public int Rating { get; set; }
public virtual ICollection<Category> Categories { get; set; }
Run Code Online (Sandbox Code Playgroud)
它工作正常但是当我将Rating的int更改为double时,我在更新数据库时遇到以下错误:
对象'DF_ Movies _Rating__48CFD27E'取决于列'评级'.ALTER TABLE ALTER COLUMN评级失败,因为一个或多个对象访问此列.
有什么问题?
我收到了一条无法解决的错误消息.它源自Visual Studio或调试器.我不确定最终的错误条件是在VS,调试器,我的程序还是数据库中.
这是一个Windows应用程序.不是网络应用程序.
来自VS的第一条消息是一个弹出框,说:"没有为任何调用堆栈帧加载符号.源代码无法显示." 当点击它时,我得到:" 检测到ContextSwitchDeadlock ",以及下面再现的长消息.
在向下扫描DataTable的循环中出现错误.对于每一行,它使用表中的键(HIC#)值作为SqlCommand的参数.该命令用于创建返回一行的SqlDataReader.数据进行比较.如果检测到错误,则将行添加到第二个DataTable.
该错误似乎与程序运行所需的时间(即60秒后)有关,而不是发现了多少错误.我不认为这是一个记忆问题.循环中没有声明变量.创建的唯一对象是SqlDataReaders,它们位于Using结构中.添加System.GC.Collect()无效.
db是同一台笔记本电脑上的SqlServer站点.
表格上没有花哨的小玩意儿或小工具.
我不知道这个过程中有什么东西与我以前做过的几十次大不相同.我以前看过这个错误,但从来没有一贯的.
任何想法,任何人?
完整错误文本: CLR无法从COM上下文0x1a0b88转换到COM上下文0x1a0cf8达60秒.拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息.这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积.为了避免这个问题,所有单线程单元(STA)线程都应该使用抽取等待原语(例如CoWaitForMultipleHandles)并在长时间运行操作期间定期泵送消息.
我有一个用户定义的表类型.我想在使用OBJECT_ID(name, type)函数编辑补丁之前检查它是否存在.
什么type从枚举应传递用户定义的表类型?
N'U' 喜欢用户定义的表不起作用,即 IF OBJECT_ID(N'MyType', N'U') IS NOT NULL
我有一个案例,使用JOIN或IN将给我正确的结果......通常有更好的性能,为什么?它取决于您运行的数据库服务器多少钱?(仅供参考我使用的是MSSQL)
我正在尝试执行此查询:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
Msg 1087,Level 16,State 1,Line 5
必须声明表变量"@tablename".
什么是动态填充表名的正确方法?
sql-server ×10
sql ×8
t-sql ×6
c# ×1
compilation ×1
database ×1
hint ×1
indexing ×1
performance ×1
sql-update ×1
tablename ×1
triggers ×1