【问题标题】:Query does not use index seek查询不使用索引查找
【发布时间】:2011-07-13 03:14:32
【问题描述】:

我有一个表说 Table1 有两列

ID       Field1
-------  -------------
INT      VARCHAR(MAX)

这张桌子大约有。 100,000 个条目 并且 ID 是主键,并且在列“Field1”上具有唯一索引。我运行以下查询

SELECT T11.ID FROM Table1 T11
INNER JOIN dbo.MyFunc() T22
ON T11.Field1 = T22.ElementValue

上述查询的 I/O 成本很高。它对 Table1 的 Field1 进行索引扫描,但不使用索引查找。 MyFunc 是一个用户 定义的函数,它返回模式的表变量 (ElementValue VARCHAR(MAX))。这里为了简单起见,我跳过了传递给 MyFunc 的变量。但是如果我运行以下查询,它会很快并使用索引搜索

SELECT T11.ID FROM Table1 T11
WHERE T11.Field1 = 'Test'

MyFunc 还返回 'Test' 作为单列单行的表变量。

请注意,我无法避免使用 MyFunc。它有一些可重用的代码,没有使用。存储过程。

请提出任何替代方案以加快速度。

编辑:我找到了问题所在。实际上是数据不匹配。在 MyFunc 中,我使用了 NVARCHAR,但 Field1 是 VARCHAR。当我将 NVARCHAR 更改为 VARCHAR 时,查询优化器正确选择了索引

【问题讨论】:

  • dbo.MyFunc() 是否总是只返回一行?
  • 它可以有多行。现在问题解决了,如何关闭或标记此问题为已关闭?
  • 您可以自己添加您的发现作为答案,并将该答案标记为正确答案。在您执行此操作之前可能会有一些时间限制。或者您可以删除问题。

标签: tsql


【解决方案1】:

如果 myfunc() 总是返回一行,也许您可​​以执行类似 ...
select @myvar = elementvalue from dbo.myfunc()
select t11.id from table1 t11 where t11.field1 = @myvar

【讨论】:

  • 它可以有多行但总是单列。我找到了问题所在。实际上是数据不匹配。在 MyFunc 中,我使用了 NVARCHAR,但 Field1 是 VARCHAR。当我将 NVARCHAR 更改为 VARCHAR 时,查询优化器正确选择了索引。
猜你喜欢
  • 2013-05-25
  • 2013-05-19
  • 2012-05-21
  • 2013-07-10
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多