查询不使用索引查找

时间:2011-07-12 18:27:14

标签: tsql

我有一张桌子说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进行索引扫描,但不使用Index seek。 MyFunc是一个用户 定义函数,它返回模式的表变量(ElementValue VARCHAR(MAX))。为简单起见,我跳过了传递给MyFunc的变量。但是,如果我运行以下查询,它将很快并使用索引搜索

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

MyFunc还将'Test'作为单个col和单行的表变量返回。

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

请建议任何替代方案,以使其快速。

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

1 个答案:

答案 0 :(得分:0)

如果myfunc()总是返回一行,也许你可以做类似......的事情 select @myvar = elementvalue from dbo.myfunc()
select t11.id from table1 t11 where t11.field1 = @myvar