以下是以下查询的简单执行计划。
询问:
SELECT TOP (25) orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
ORDER BY orderid;
Run Code Online (Sandbox Code Playgroud)
执行计划:
我的问题是如何理解执行次数
以下是所有操作符的执行次数
嵌套循环:
估计执行次数:1
实际执行次数:1
索引扫描:
估计执行次数:1
实际执行次数:1
关键查找:
估计执行次数:25
实际执行次数:25
我的问题是
为什么嵌套循环只显示 1 个执行计数?
索引扫描也只显示一个执行计数,但它在一次执行中得到 25 行。这些行是存储在行集缓存中还是某个缓存中?嵌套循环是否会从缓存中取出一行并为每一行调用键查找 25 次?
以下是来自 Itzik Ben-Gan 的解释
例如,如果告诉它停止的 Top 迭代器出现在计划的后面,索引扫描迭代器如何知道在 25 行后停止?答案是内部 API 调用从根节点开始(在我们的例子中是 SELECT 迭代器)。此根节点调用 Top 迭代器。Top 迭代器调用一个方法 25 次,从 Nested Loops 迭代器请求一行。反过来,嵌套循环迭代器调用一个方法 25 次,从索引扫描迭代器中请求一行。因此,索引扫描迭代器不会超出它扫描的前 25 行。简而言之,虽然遵循数据流顺序来解释计划通常更直观
但是为什么执行计数只显示 1。如果我遗漏了什么,请告诉我。附上执行计划
更新(2017 年 1 月):
我问过一些关于堆栈溢出的类似问题。有关相同..的更多详细信息,请参阅此答案。
https://dba.stackexchange.com/questions/134172/set-statistics-io-for-nested-loops
我已经设置了两个SQL 2014服务器之间的事务日志传送,一切似乎都正确设置但是当恢复发生时,如果.trn非常小,例如7k,它似乎失败了.
不确定这是否与它有关,但它是唯一不同的东西.
以下是还原作业的日志.
日期25/04/2016 22:59:24记录工作经历(LSRestore_IRIS_WebStock)
步骤ID 1服务器HERA作业名称LSRestore_IRIS_WebStock步骤名称日志传送还原日志作业步骤.持续时间00:00:04 Sql严重性0 Sql消息ID 0操作员已通过电子邮件发送
操作员网络已发送操作员已分页重试尝试0消息2016-04-25 22:59:28.71错误:无法将日志备份文件'E:\ ShippingLogs\WebStock\WebStock_20160425033000.trn'应用于辅助数据库'WebStock'.(Microsoft.SqlServer.Management.LogShipping)2016-04 -25 22:59:28.71错误:处理数据库'WebStock'的日志时发生错误.如果可能,从备份还原.如果备份不可用,则可能需要重建日志.恢复期间发生错误,导致数据库"WebStock"(12:0)无法重新启动.诊断恢复错误并修复它们,或从已知良好的备份恢复.如果错误未得到纠正或预期,请联系技术支持.
RESTORE LOG异常终止.数据库'WebStock'处理0页,文件'文件'WebStock'处理1页数据库'WebStock',文件'文件'WebStock_log'.(.Net SqlClient数据提供者)2016-04-25 22:59: 28.71错误:无法记录历史记录/错误消息.(Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59:28.73错误:ExecuteNonQuery需要一个打开且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73为二级数据库'WebStock'跳过日志备份文件'E:\ ShippingLogs\WebStock\WebStock_20160425033000.trn',因为该文件不能验证.2016-04-25 22:59:28.73错误:无法记录历史记录/错误消息.(Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59:28.73错误:ExecuteNonQuery需要一个打开且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73错误:恢复数据库访问模式时出错.(Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59 :28.73错误:ExecuteScalar需要一个开放且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73错误:无法记录历史记录/错误消息.(Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59: 28.73错误:ExecuteNonQuery需要一个开放且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73错误:无法将日志备份文件'E:\ ShippingLogs\WebStock\WebStock_20160425034500.trn'应用于辅助数据库'WebStock'.( Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59:28.73错误:ExecuteNonQuery需要一个开放且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73错误:无法记录历史记录/错误消息.(Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59: 28.73错误:ExecuteNonQuery需要一个开放且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73为二级数据库'WebStock'跳过日志备份文件'E:\ ShippingLogs\WebStock\WebStock_20160425034500.trn',因为该文件不能验证.2016-04-25 22:59:28.73错误:无法记录历史记录/错误消息.(Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59:28.73错误:ExecuteNonQuery需要一个打开且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73错误:恢复数据库访问模式时出错.(Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59 :28.73错误:ExecuteScalar需要一个开放且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73错误:无法记录历史记录/错误消息.(Microsoft.SqlServer.Management.LogShipping)2016-04-25 22:59: 28.73错误:ExecuteNonQuery需要一个开放且可用的连接.连接的当前状态已关闭.(System.Data)2016-04-25 22:59:28.73错误:无法将日志备份文件'E:\ ShippingLogs\WebStock\WebStock_20160425040000.trn'应用于辅助数据库'WebStock'.( Microsoft.SqlServer.Management.LogShipp
如果我删除该日志并再次运行还原,它将一直有效,直到找到另一个非常小的日志.
如果日志为空,还原会失败吗?
我有一个存储过程具有以下代码:
BEGIN TRY
--BEGIN TRANSACTION @TranName
DECLARE @ID int
INSERT INTO [dbo].[a] ([Comment],[Type_Id],[CreatedBy])
VALUES ('test',1,2)
SET @ID = SCOPE_IDENTITY()
INSERT INTO [dbo].[b] ([Can_ID],[Com_ID],[Cal_ID],[CreatedBy])
VALUES (1,@ID,null,2)
UPDATE c SET LastUpdated = GETDATE(), LastUpdatedBy = 2 WHERE b.id = @ID
--COMMIT TRANSACTION @TranName
SELECT * from [View] where a.id=@ID
END TRY
BEGIN CATCH
--ROLLBACK TRANSACTION @TranName
END CATCH
Run Code Online (Sandbox Code Playgroud)
单独运行的每个语句(现在都是)运行得很快.但是,当我们从Transaction的代码段中删除注释时,脚本运行时间从1秒增加到超过2分钟.
系统已经运行了很长一段时间了,之前这不是问题,我一直在尝试搜索有关SQL Server如何处理事务的文档,以防万一有可能影响SQL性能的事情而且这是唯一的事情.我想到的是事务日志......但理想情况下,这些单独的语句也可以在单个事务中运行,任何想法?
sql-server stored-procedures sqlperformance sqltransaction sql-server-2012
我正在尝试了解sql server的计划缓存内容.
所以我的问题是:
1.临时计划和准备计划有什么区别?
2.在尝试优化sql server计划缓存时,我应该知道什么?
我们正处于设计阶段,用于在现有Web应用程序中构建审核跟踪。该应用程序在Windows Azure上运行,并使用SQL Azure数据库。
审核日志必须按用户或对象类型过滤(例如,显示用户的所有操作,或显示对对象执行的所有操作)。
我们必须选择如何存储数据,应该使用SQL Azure还是应该使用表存储?我们更喜欢表存储(更便宜)。
但是,表存储的“问题”是如何定义分区键。我们的SQL数据库中有数千名客户(应用程序用户),每个客户都有自己的租户。使用租户ID作为分区键还不够具体,因此我们必须在分区键中添加一些内容。因此存在一个问题:给定过滤要求,我们可以在分区键中添加用户ID以简化用户过滤,或者可以添加对象ID以简化按对象过滤。
因此,我们看到两种可能的解决方案:
-使用SQL Azure代替表存储
-使用表存储并使用具有不同分区键的两个表,这意味着我们复制了所有条目
有什么想法对我们的情况最好的方法是什么?还有其他更好的解决方案吗?
当Deterministic
数据库列的特定属性引起我的注意时,我在SQL Server数据库中创建了一个表.请看下面的截图:
我已经知道确定性和非确定性SQL Server函数,但我想知道它是否以任何方式应用于SQL Server中的数据数据类型?
我之所以要问的是,我确实扫描了SQl Server v2008和v2012中可用的所有数据类型,但是Deterministic
字段的值显示Yes
了所有这些数据类型.它没有显示No
任何单一数据类型.
所以我的问题是它是SQL Server中任何数据类型的适当属性,它仍然影响值存储在列中的方式,或者它只是过去的遗留,可能来自SQL Server 2000或SQL Server 2005曾经是一些本质上不确定的数据类型.任何信息对于理解SQL Server中数据类型的这种特性非常有用.我们在SQL Server中是否有任何数据类型,这在本质上是非确定性的?
由于我没有看到No
任何数据类型,我得到了更多的困惑.我也搜索了很多,但每次搜索都会将我带到确定性和非确定性的SQL Server函数,如下所示,并且没有人讨论Non-deterministic
与SQL Server数据类型相关的特性.
https://technet.microsoft.com/en-us/library/ms178091(v=sql.110).aspx
在 Microsoft SQL Server 2014 (SP2-CU1) (KB3178925) 上 - 12.0.5511.0 (X64) 2016 年 8 月 19 日 14:32:30 版权所有 (c) Windows NT 6.1 上的 Microsoft Corporation Enterprise Edition(64 位)(内部版本 7601:服务)包 1)(管理程序)
sp_UpdateStats 实际上不存在,查询:
SELECT OBJECT_ID('sp_UpdateStats')
Run Code Online (Sandbox Code Playgroud)
返回值:-838816646
和
select * FROM sys.objects WHERE name='sp_UpdateStats'
Run Code Online (Sandbox Code Playgroud)
返回0行...
怎么会这样 ?OBJECT_ID 函数中的错误?
编辑
很高兴知道 ID -838816646 来自 sys.sysobjects 或 sys.system_objects 但更准确的问题是:
我不明白为什么这个代码
#include <iostream>
class A {
public:
void foo(){
char g = 'm';
switch(g){
case 'g':
auto f = [](){std::printf("hello world\n");};
f();
break;
// default:
// std::printf("go to hell\n");
// break;
}
};
};
int main(int iargc, char *iargv[]){
A a;
a.foo();
}
Run Code Online (Sandbox Code Playgroud)
编译(并且工作)很好,而在取消注释默认语句时
#include <iostream>
class A {
public:
void foo(){
char g = 'm';
switch(g){
case 'g':
auto f = [](){std::printf("hello world\n");};
f();
break;
default:
std::printf("go to hell\n");
break;
}
};
};
int main(int iargc, char *iargv[]){
A …
Run Code Online (Sandbox Code Playgroud) 是否可以避免在 SQL Server CTE 中指定列列表?
我想从具有许多列的表创建 CTE,以便结构相同。可能有一种方法可以在不重新列出每个列名的情况下完成此操作。
我试过(不成功):
with pay_cte as
(select * from payments)
select * from pay_cte
Run Code Online (Sandbox Code Playgroud)
msdn 文档中的这条语句鼓励我进行探索:仅当查询定义中提供了所有结果列的不同名称时,列名列表才是可选的。
https://msdn.microsoft.com/en-us/library/ms175972.aspx
Run Code Online (Sandbox Code Playgroud) 我已经在数据工厂中创建了管道我想更改管道名称但是当我在管道中更改它时我收到错误你能帮我吗?
"name": "TEST_debt",
"properties": {
"description": "Luna_debt",
"activities": [
{
"type": "Copy",
"typeProperties": {
"source": {
"type": "RelationalSource",
"query": "select * from `orbitms_live`.`debt`"
},
Run Code Online (Sandbox Code Playgroud)
我想将债务名称更改为 Lunadebt
sql-server ×7
azure ×2
sql ×2
audit-trail ×1
auditing ×1
c++ ×1
database ×1
gcc ×1
lambda ×1
log-shipping ×1
ssms ×1
t-sql ×1