【发布时间】: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