在尝试将下面这个问题的内容应用于我自己的情况时,如果可能的话,我对如何摆脱运算符 Hash Match (Inner Join) 感到有些困惑。
SQL Server 查询性能 - 消除对哈希匹配(内部联接)的需要
我注意到 10% 的成本,并想知道我是否可以减少它。请参阅下面的查询计划。

这项工作来自我今天必须调整的查询:
SELECT c.AccountCode, MIN(d.CustomerSID)
FROM Stage.Customer c
INNER JOIN Dimensions.Customer d ON c.Email = d.Email
OR (
c.HomePostCode = d.HomePostCode
AND c.StrSurname = d.strSurname
)
GROUP BY c.AccountCode
Run Code Online (Sandbox Code Playgroud)
添加这些索引后:
---------------------------------------------------------------------
-- Create the indexes
---------------------------------------------------------------------
CREATE NONCLUSTERED INDEX IDX_Stage_Customer_HOME_SURNAME_INCL
ON Stage.Customer(HomePostCode ,strSurname)
INCLUDE (AccountCode)
--WHERE HASEMAIL = 0
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go
CREATE NONCLUSTERED INDEX IDX_Dimensions_Customer_HOME_SURNAME_INCL
ON Dimensions.Customer(HomePostCode ,strSurname)
INCLUDE (AccountCode,CustomerSID)
--WHERE HASEMAIL = …Run Code Online (Sandbox Code Playgroud) performance index sql-server execution-plan sql-server-2014 query-performance
我创建了一个 SSIS 包,它将 Excel 文件导入到 SQL Server 表中。
当我在我的机器上本地运行 SSIS 包时,它运行没有任何问题,但是当我在计划包的服务器上运行它时,我收到以下错误(从我输出错误的文本文件到使用 SSIS 日志记录)。
经过研究,我能找到的唯一建议是将 Run64BitRuntime 属性设置为 false,我做了但仍然没有运气。我怀疑这是导致我错误的原因,因为错误没有指定任何关于 64 位的内容(就像我发现的文章中的情况一样)。
我还认为可能是服务器没有合适的 Excel 驱动程序,但我也不认为是这种情况,因为通常错误消息会说明驱动程序未注册。
我目前无权访问远程服务器。我只能将包上传到一个文件夹,然后它由应用程序运行,因此我能看到的唯一错误消息是我创建的文本错误日志中的内容。
错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。对连接管理器“Envision”的 AcquireConnection 方法调用失败,错误代码为 0xC0209303。在此之前可能会发布错误消息,其中包含有关 AcquireConnection 方法调用失败原因的更多信息。
“Envision”是我的 excel 连接管理器的名称。
我使用表达式填充 Excel 文件路径和连接字符串。
连接字符串表达式如下所示:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+@[User::SourceFilePath] +";Extended Properties=\"EXCEL 12.0 XML;HDR=YES\";"
SSIS 包由 Windows 用户名/帐户执行。我认为这可能是一个网络服务帐户。(BDS_sprtIIS)
有没有人对如何解决仅在我的本地计算机上运行但在将部署包的实际服务器上不起作用的包的这个问题有任何解决方案或建议?
我在另一个论坛上找到了以下答案,请问是什么导致了我的问题?他们基本上是说 Excel 连接管理器出于某种原因尝试访问用户临时文件夹,如果它无权访问该文件夹,则它将失败:
我也注意到 Microsoft.JET.OLEDB.4.0 驱动程序将尝试读取登录用户配置文件下的临时目录。
.
...我们使用较低级别的域帐户运行我们的 SQL 代理,并使用代理帐户运行我们的 SSIS 包。你是对的,因为 Procmon 也为我证实了这一点。我将代理帐户权限授予了配置文件的临时目录 (C:\Documents and Settings\SQLAgentDomainAccount\Local Settings\Temp) 并且它起作用了!
我没有使用 SQL Server 作业或代理帐户。该包由 Windows 帐户很可能通过命令行脚本简单地执行。
Windows 帐户可以访问该文件,但我不确定它是否可以访问它的“TEMP”文件夹(我从未在包中引用它,所以我不知道为什么它需要访问该文件夹) ...
这是我第六次问这个问题,也是最短的一次。之前的所有尝试都产生了更类似于博客文章而不是问题本身的东西,但我向您保证,我的问题是真实的,只是它涉及一个大主题,并且没有这个问题包含的所有细节,它将是不清楚我的问题是什么。所以这里...
我有一个数据库,它允许以一种奇特的方式存储数据,并提供我的业务流程所需的几个非标准功能。特点如下:
可能还有其他功能我忘了提及。
所有用户数据都Items以 JSON 编码字符串 ( ntext) 的形式存储在表中。所有的数据库操作都通过两个存储过程进行GetLatest和InsertSnashot,它们允许类似Git是如何操纵源文件中的数据进行操作。
结果数据在前端链接(JOINed)成完全链接的图,因此在大多数情况下不需要进行数据库查询。
也可以将数据存储在常规 SQL 列中,而不是以 Json 编码形式存储。然而,这增加了整体复杂性压力。
GetLatest结果与指令形式的数据,请考虑下图进行解释:
该图显示了对单个记录所做更改的演变。图上的箭头显示了编辑所依据的版本(假设用户正在离线更新一些数据,与在线用户进行的更新并行,这种情况会引入冲突,基本上是两个版本的数据而不是一个)。
因此,GetLatest在以下输入时间跨度内调用将产生以下记录版本:
GetLatest 0, 15 => 1 <= The data is created upon it's first occurance
GetLatest 0, 25 => 2 <= Inserting another version on top of first one overwrites the existing version
GetLatest 0, 30 => 3 <= The overwrite …Run Code Online (Sandbox Code Playgroud) 编辑:为什么会话报告被阻止但等待PAGELATCH_*,而不是LCK_M_相关的等待类型?
我之前假设 SQL Server 只会在 blocks_session_Id 列中报告阻塞会话。如果被阻塞的会话正在等待逻辑锁而不是其他任何东西,例如PAGELATCH_*.
是否有 SQL Server 2008 等效于 Oracle 中的 USING INDEX 子句?特别是对于构造:
CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
Run Code Online (Sandbox Code Playgroud)
在关于唯一索引的 Sql Server文档中,它指出(强调):
唯一索引通过以下方式实现:
PRIMARY KEY 或 UNIQUE 约束
当您创建 PRIMARY KEY 约束时,如果表上的聚集索引尚不存在并且您没有指定唯一的非聚集索引,则会自动创建一个或多个列上的唯一聚集索引。主键列不能允许 NULL 值。
这似乎意味着有一种方法可以指定主键应该使用什么索引。
我从 System Center Operations Manager (SCOM) 收到错误消息。
如何解决这个错误?
SQL DB 2012 Engine Stolen Server Memory 过高。
我运行查询并得到这个计数器:
???????????????????????????????????????????????
? Stolen Server Memory (MB) ? 7354.773437 ?
? Lock Memory (MB) ? 106.195312 ?
? Free Memory (MB) ? 64.632812 ?
? Connection Memory (MB) ? 24.203125 ?
? Log Pool Memory (MB) ? 14.085937 ?
? Optimizer Memory (MB) ? 2.351562 ?
? Granted Workspace Memory (MB) ? 1.296875 ?
? Cursor memory usage ? 0.000000 ?
? Cursor memory …Run Code Online (Sandbox Code Playgroud) 我正在尝试诊断一个间歇性需要很长时间的查询。我怀疑它可能在尝试获取锁时被阻止。我无权在遇到问题的环境中使用探查器。
有什么方法可以让我在不使用外部分析器的情况下获取有关此单个查询被阻止多长时间的统计信息?
在 SQL Server 2012 中,我有一个表值函数,它连接到另一个表,我需要计算这个“表值函数”的行数。当我检查执行计划时,我可以看到左连接表。为什么?左连接表如何影响返回的行数?我希望数据库引擎不需要在 SELECT count(..) 查询中评估左联合表。
Select count(realtyId) FROM [dbo].[GetFilteredRealtyFulltext]('"praha"')
Run Code Online (Sandbox Code Playgroud)
执行计划:
表值函数:
CREATE FUNCTION [dbo].[GetFilteredRealtyFulltext]
(@criteria nvarchar(4000))
RETURNS TABLE
AS
RETURN (SELECT
realty.Id AS realtyId,
realty.OwnerId,
realty.Caption AS realtyCaption,
realty.BusinessCategory,
realty.Created,
realty.LastChanged,
realty.LastChangedType,
realty.Price,
realty.Pricing,
realty.PriceCurrency,
realty.PriceNote,
realty.PricePlus,
realty.OfferState,
realty.OrderCode,
realty.PublishAddress,
realty.PublishMap,
realty.AreaLand,
realty.AreaCover,
realty.AreaFloor,
realty.Views,
realty.TopPoints,
realty.Radius,
COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X,
COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y,
realty.krajId,
realty.okresId,
realty.obecId,
realty.cobceId,
IsNull(CONVERT(int,realty.Ranking),0) as Ranking,
realty.energy_efficiency_rating,
realty.energy_performance_attachment,
realty.energy_performance_certificate,
realty.energy_performance_summary,
Category.Id AS CategoryId,
Category.ParentCategoryId,
Category.WholeName,
okres.nazev AS …Run Code Online (Sandbox Code Playgroud) 我们有一个 Always On 可用性组,其中包含一个主要和一个已启用读取的次要。我们有一个实施团队的用户,他使用数据库来检查他们打算放入数据库的数据的正确性。
用户只有从数据库读取的权限,但是当他们通过 AG 侦听器连接(通过 SSMS)时,他们总是连接到活动节点。
我试图让他们直接访问只读实例,但他们坚持自己的方式,一两天后他们又回到了活动节点上。
SQL Server 有没有办法说这个用户总是打算只读并将他们重定向到那里?
注意:我已经尝试在附加连接参数中设置“ApplicationIntent = ReadOnly”,但这似乎没有重定向到辅助节点,并且不是理想的解决方案,因为他们不可避免地会忘记为新的初学者设置它。
SQL Server 2012 Enterprise,可用性组 1 主要,1 可读次要同步提交。
我不打算让用户连接到链接服务器,或通过任何其他服务器。用户通过 SSMS(没有其他应用程序)直接连接到数据库,我希望 AG 侦听器(或那里的其他东西)能够将该用户引导到一个可用的辅助节点(因为它只有读取访问权限)访问主节点是没有意义的)而用户无需做任何事情,因为他们在机器周围移动并且会忘记添加应用程序意图。此外,我发现将其添加到其他连接参数并不总是将您定向到辅助节点。
sql-server configuration sql-server-2012 listener availability-groups
我有一个涉及在多个数据库之间执行各种命令的过程 - 但是,当我使用动态 SQL 通过“使用 @var”更改数据库时,它实际上并没有更改数据库。
在 [test_db] 中执行:
declare @currentDB varchar(max)
declare @sql varchar(max)
set @currentDB = DB_NAME()
set @sql = 'use [' + @currentDB +']'
use master
exec(@sql)
select DB_NAME()
Run Code Online (Sandbox Code Playgroud)
返回 [Master] 作为当前数据库名称 - 如果我将其use [test_db]作为命令而不是动态放置,则它返回正确的名称。
有没有办法做到这一点,可以在数据库之间正确切换?
sql-server ×10
performance ×2
blocking ×1
constraint ×1
count ×1
dynamic-sql ×1
index ×1
listener ×1
locking ×1
memory ×1
optimization ×1
oracle ×1
primary-key ×1
ssis ×1
wait-types ×1