下面的查询使用 StackOverflow2010 示例数据库:
DECLARE @Id INT = 18471
SELECT c.UserId FROM dbo.Comments AS c
INNER HASH JOIN dbo.Users AS u
ON c.UserId = u.Id
AND c.UserId = @Id
Run Code Online (Sandbox Code Playgroud)
使用散列连接提示,它返回以下错误:
由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询
当我添加时它有效 OPTION(RECOMPILE)
用字符串文字或替换变量。
什么可能导致这个问题?
为什么在通过链接服务器更新时使用 ISNULL() 使用远程扫描来检索所有行并在本地进行过滤,而不是通过远程查询进行过滤?
UPDATE LINKEDSERVER1.database1.dbo.table1 WITH(ROWLOCK)
SET number = ISNULL(number,0)
WHERE accounts = '123'
UPDATE LINKEDSERVER1.database1.dbo.table1 WITH(ROWLOCK)
SET number = number
WHERE accounts = '123'
Run Code Online (Sandbox Code Playgroud)
该表确实有一个针对帐户列的非聚集唯一索引,但 ISNULL() 未用于帐户列并且该索引应该仍然可用。我在这里错过了什么吗?
我有一个包含 307200 条记录的表,其中 f_column 为 VARCHAR(30)。缺失索引 dmv 中不会显示缺失索引,也不会在执行计划中建议缺失索引。
SELECT f_column, f_column2 FROM t_table WHERE f_column = '23BE46F3-E9A9-4526-A2F8-3F51818025B5'
Run Code Online (Sandbox Code Playgroud)
该查询返回 5 个结果,花费了 9958 次逻辑读取。对于下面的索引,需要 3 次逻辑读取。
CREATE NONCLUSTERED INDEX IX_t_Table_f_column ON t_table (f_column) INCLUDE (f_column2)
Run Code Online (Sandbox Code Playgroud)
当添加索引会给查询带来巨大好处时,什么可能导致缺失索引不会出现在缺失索引 dmv 和执行计划中?
我最初怀疑统计数据,并更新了表的所有统计数据,但问题仍然存在。由于某种原因,添加或更改表上的列将导致 SQLServer 恢复正常,并且缺失的索引会出现在缺失索引 dmv 中以及查询下次执行的执行计划中。
我需要更改一些数据库的名称,但是这些数据库被多个不同团队管理的许多应用程序使用。所有应用程序完成更改连接和数据库名称引用需要一些时间。有没有办法让更改无缝完成?正在查看同义词以暂时允许引用重命名的数据库,但不幸的是它仅适用于数据库级别。