CTE(普通表表达式)vs Temp tables或Table variables,哪个更快?
performance temp-tables common-table-expression table-variable sql-server-2008-r2
如何在SQL Server中搜索表的所有列?
我正在使用Entity Framework 4.1并且有时需要调用存储过程.其中一些返回int作为返回值.例如
CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT @@Identity
Run Code Online (Sandbox Code Playgroud)
(更新:删除返回值,不相关.我们将返回身份)
我的respository类中有以下代码:
var orderNo = context.Database.SqlQuery<int>("EXEC myProc").Single();
Run Code Online (Sandbox Code Playgroud)
这失败并显示错误消息 The specified cast from a materialized 'System.Decimal' type to the 'System.Int32' type is not valid.
如果我将上面的代码更改为
var orderNo = context.Database.SqlQuery<decimal>("EXEC myProc").Single();
Run Code Online (Sandbox Code Playgroud)
一切正常.
现在,我认为我应该能够返回一个int.这样做的正确方法是什么?
c# stored-procedures sql-server-2008-r2 entity-framework-4.1
我有一个存储过程,使用全文索引搜索产品(250,000行).
存储过程采用的参数是全文搜索条件.这个参数可以为null,所以我添加了一个空检查,查询突然开始运行速度慢了几个数量级.
-- This is normally a parameter of my stored proc
DECLARE @Filter VARCHAR(100)
SET @Filter = 'FORMSOF(INFLECTIONAL, robe)'
-- #1 - Runs < 1 sec
SELECT TOP 100 ID FROM dbo.Products
WHERE CONTAINS(Name, @Filter)
-- #2 - Runs in 18 secs
SELECT TOP 100 ID FROM dbo.Products
WHERE @Filter IS NULL OR CONTAINS(Name, @Filter)
Run Code Online (Sandbox Code Playgroud)
以下是执行计划:
查询#1

查询#2

我必须承认我对执行计划不太熟悉.对我来说唯一明显的区别是连接是不同的.我会尝试添加提示,但在我的查询中没有加入我不知道该怎么做.
我也不太明白为什么使用名为IX_SectionID的索引,因为它是一个只包含列SectionID的索引,并且该列不在任何地方使用.
sql-server performance sql-server-2008-r2 sql-execution-plan
我有一张桌子,上面列有国家名单.说其中一个国家是'马其顿'
如果搜索"马其顿共和国",SQL查询将返回"马其顿"记录?
我相信在linq中会有类似的东西
var countryToSearch = "Republic of Macedonia";
var result = from c in Countries
where countryToSearch.Contains(c.cName)
select c;
Run Code Online (Sandbox Code Playgroud)
现在上面的查询的SQL等价物是什么?
如果它是相反的方式(即数据库存储了国家名称的长版本),下面的查询应该工作:
Select * from country
where country.Name LIKE (*Macedonia*)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何扭转它.
附注:表中的国家/地区名称始终是国家/地区名称的简短版本
我有以下xml -
<Surveys xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ImmForm XML Schema NHS Direct.xsd"><Svy SurveyName="WeeklyFluSurveillance2012/13-NHSDirectWeek40w/e07/10/2012" OrgCode="NHS Direct"><TotCR>222.10</TotCR><PerCF>0.40</PerCF><PerCFunder1>0.20</PerCFunder1><PerCF1to4>0.30</PerCF1to4><PerCF5to14>0.50</PerCF5to14><PerCF15to44>0.40</PerCF15to44><PerCF45to64>0.20</PerCF45to64><PerCF65plus>3.60</PerCF65plus>
<PerCFNE>4.22</PerCFNE>
<PerCFNW>6.50</PerCFNW>
<PerCFYH>0.80</PerCFYH>
<PerCFEM>1.00</PerCFEM>
<PerCFWM>1.50</PerCFWM></Svy></Surveys>
Run Code Online (Sandbox Code Playgroud)
我需要在结果集中选择子节点名称及其值,其中包含2列(FieldName,FieldValue),如 -
TotCR 222.10
PerCF 0.40
...
PerCFWM 1.50
Run Code Online (Sandbox Code Playgroud)
xml中的节点会有所不同,但可能并不总是相同.甚至值也可以是整数或文本.
你们可以在SQL Server 2008 R2中使用OPENXML建议如何做到这一点吗?
我正在尝试将数据从我的生产数据库导出到我的开发数据库但是我收到此错误:
消息错误0xc0202049:数据流任务1:未能插入只读列"id".(SQL Server导入和导出向导)
有没有办法检查哪一列是因为我有20个表,所有这些表都使用列名id或至少得到更好的错误报告?
在localserver(SQL Server 2008 R2)上,我有一个名为syn_view1指向链接服务器的同义词remoteserver.remotedb.dbo.view1
此SLOW查询需要20秒才能运行.
select e.column1, e.column2
from syn_view1 e
where e.column3 = 'xxx'
and e.column4 = 'yyy'
order by e.column1
Run Code Online (Sandbox Code Playgroud)
此FAST查询需要1秒才能运行.
select e.column1, e.column2
from remoteserver.remotedb.dbo.view1 e
where e.column3 = 'xxx'
and e.column4 = 'yyy'
order by e.column1
Run Code Online (Sandbox Code Playgroud)
两个查询的唯一区别实际上是同义词的存在.显然,同义词会影响查询的性能.
SLOW查询的执行计划是:
Plan Cost % Subtree cost
4 SELECT
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0
Cost: 0.000000 0.00 3.3521
3 Filter
I/O cost: 0.000000 CPU cost: 0.008800 Executes: 1
Cost: 0.008800 …Run Code Online (Sandbox Code Playgroud) sql-server performance linked-server synonym sql-server-2008-r2
如何将SQL Server数据库图表导出为开发人员友好的SQL脚本?
对开发人员友好,我的意思是以类似于人类编写方式的方式编写,而不是现有解决方案UPDATE使用的混乱多种方式.
(请注意,此站点上的类似问题似乎只涵盖特定版本的SQL Server或图表迁移.)
t-sql sql-server-2008 sql-server-2008-r2 database-diagram sql-server-2012
我之前发过类似的东西,但我现在从另一个方向接近这个,所以我开了一个新问题.我希望这没关系.
我一直在与CTE合作,根据父母费用创建一笔费用.SQL和详细信息可以在这里看到:
我不认为我在CTE上遗漏任何东西,但是当我使用一个大数据表(350万行)时,我遇到了问题.
该表tblChargeShare包含了我需要的其他一些信息,例如InvoiceID,因此我将CTE放在视图中vwChargeShareSubCharges并将其加入到表中.
查询:
Select t.* from vwChargeShareSubCharges t
inner join
tblChargeShare s
on t.CustomerID = s.CustomerID
and t.MasterChargeID = s.ChargeID
Where s.ChargeID = 1291094
Run Code Online (Sandbox Code Playgroud)
返回几毫秒的结果.
查询:
Select ChargeID from tblChargeShare Where InvoiceID = 1045854
Run Code Online (Sandbox Code Playgroud)
返回1行:
1291094
Run Code Online (Sandbox Code Playgroud)
但查询:
Select t.* from vwChargeShareSubCharges t
inner join
tblChargeShare s
on t.CustomerID = s.CustomerID
and t.MasterChargeID = s.ChargeID
Where InvoiceID = 1045854
Run Code Online (Sandbox Code Playgroud)
需要2-3分钟才能运行.
我保存了执行计划并将它们加载到SQL Sentry中.快速查询的树看起来像这样:

慢查询的计划是:

我尝试重新索引,通过调优顾问程序和子查询的各种组合运行查询.每当连接包含除PK之外的任何内容时,查询都很慢.
我在这里有一个类似的问题:
其中使用函数来执行子行的汇总而不是CTE.这是使用CTE重写以避免我现在遇到的同样问题.我已经阅读了该答案中的回复,但我并不是更明智 - 我阅读了一些有关提示和参数的信息,但我无法使其发挥作用.我以为使用CTE重写可以解决我的问题.在具有几千行的tblCharge上运行时查询很快.
在SQL 2008 …