我在SQL Server 2000中遇到了一個奇怪的問題,我無法想到發生這種情況的原因。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] [表1] [PK_table1。 ](48%)
- 羣集索引查找[分貝] [DBO] [表2] [PK_table2](51%)
- 嵌套循環(內加入)(1%)警告:。NO聯接謂詞
- 選擇(0%)
現在,如果我這樣做(注意NVARCHAR字符串!):
SELECT t1.Foo, t2.Bar
FROM table1 t1 INNER JOIN table2 t2 ON t1.VarcharKey = t2.VarcharKey
WHERE t1.VarcharKey = N'Foo'
我得到:
- Clustered Index Scan [db]。[dbo]。[table1]。[PK_table1](98%)
- Clustered Index Seek [db]。[dbo]。[table2]。[PK_table2](1%)
- 嵌套循環(內部連接)(1%)沒有警告這裏
- 選擇(0%)
這種行爲讓我有點摸不着頭腦。
- 爲什麼會出現「NO連接謂詞」的警告,爲什麼會消失,當我改變
'Foo'
到N'Foo'
?我的鍵列不是NVARCHAR類型的,所以這不應該有什麼區別,或者它應該如何? - 此警告的存在是否有負面影響,或者我可以忽略它嗎?
- 爲什麼它從索引搜索切換到索引掃描?
一些背景信息:表基數爲約25,000記錄一張桌子,約。另一個是12,000個記錄。數據庫兼容級別爲80(SQL Server 2000)默認排序規則爲SQL_Latin1_General_CP1_CI_AS
,如果這樣做有任何區別的話。
這裏是@@VERSION
內容:
的Microsoft SQL Server 2000 - 8.00.2273(英特爾X86)2008年3月7日22時19分58秒版權所有(C)1988-2003微軟公司企業版在Windows NT上5.0(Build 2195:Service Pack 4)
PS:我知道KB322854,但顯然這不是。
我遇到了與SQL Server 2000相同的問題:當您嘗試在已索引的非Unicode列中搜索unicode字符串時,SQL Server 2000無法將前者轉換爲後者。因此它確實索引掃描而不是索引查找。 FWIW:在這種情況下,SQL Server 2005更智能。 – Yarik 2008-11-15 09:37:22