我有一张桌子说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时,查询优化器正确选择了索引
答案 0 :(得分:0)
如果myfunc()总是返回一行,也许你可以做类似......的事情
select @myvar = elementvalue from dbo.myfunc()
select t11.id from table1 t11 where t11.field1 = @myvar