我在使用 SQL Server 2000 时遇到了一个奇怪的问题,我只是想不出发生这种情况的原因。
有两个表,都有一个组合主键和一个聚集索引,两个键具有相同的结构:
(VARCHAR(11), INT, DATETIME) /* can't change this, so don't suggest I should */
所以,像这样加入他们很容易:
SELECT t1.Foo, t2.Bar
FROM table1 t1 INNER JOIN table2 t2 ON t1.VarcharKey = t2.VarcharKey
WHERE t1.VarcharKey = 'Foo'
查看查询执行计划,我看到:
- 聚集索引搜索 [db].[dbo].[table1].[PK_table1] (48%)
- 聚集索引搜索 [db].[dbo].[table2].[PK_table2] (51%)
- 嵌套循环(内部连接)(1%)警告:没有连接预测
- 选择 (0%)
现在如果我这样做(注意 NVARCHAR 字符串!):
SELECT t1.Foo, t2.Bar
FROM table1 t1 INNER JOIN table2 t2 ON t1.VarcharKey = t2.VarcharKey
WHERE t1.VarcharKey = N'Foo'
我得到:
- 聚集索引扫描 [db].[dbo].[table1].[PK_table1] (98%)
- 聚集索引搜索 [db].[dbo].[table2].[PK_table2] (1%)
- 嵌套循环(内部连接)(1%)这里没有警告
- 选择 (0%)
这种行为让我有点困惑。
- 为什么会出现“NO JOIN PREDICATE”警告,为什么当我更改
'Foo'
为时它会消失N'Foo'
?我的键列不是 NVARCHAR 类型,所以这不应该有任何区别,还是应该? - 此警告的存在是否有负面影响,或者我可以忽略它吗?
- 为什么它会从 Index Seek 切换到 Index Scan?
一些背景信息:表基数约为。一张表有 25,000 条记录,大约 12,000 条记录在另一个。数据库兼容级别是 80 (SQL Server 2000),默认排序规则是SQL_Latin1_General_CP1_CI_AS
,如果这有什么不同的话。
以下是 的内容@@VERSION
:
Microsoft SQL Server 2000 - 8.00.2273 (Intel X86) Mar 7 2008 22:19:58 版权所有 (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
PS:我知道KB322854,但这显然不是。