2010-05-17 50 views
1

我需要檢查數據庫中是否存在一行;然而,我正在試圖找到能夠提供最佳性能的方法。最好用一個例子來總結。SQL在子集上選擇

假設我有如下表:

dbo.Person(
FirstName varchar(50), 
LastName varchar(50), 
Company varchar(50) 
) 

假設這個表有數百萬行,但是隻有列Company有索引。

我想知道是否存在FirstNameLastNameCompany的特定組合。我知道我可以這樣做:

IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company) 
Begin 
.... 
End 

但是,除非我誤會,否則會執行全表掃描。

我真正喜歡做的是它採用了索引的查詢。通過上面的表格,我知道下面的查詢將有很大的性能,因爲它使用索引:

Select * from dbo.Person where Company = @Company 

反正有做只對數據子集的搜索?例如像這樣:

select * from (
    Select * from dbo.Person where Company = @Company 
) 
where FirstName = @FirstName and LastName = @LastName 

這樣,它只會對更窄的數據集合進行表掃描。

我知道上面的查詢將不能工作,但有一個查詢,會嗎?

哦,我無法創建臨時表,因爲用戶將只具有讀取權限。

回答

0

IF EXISTS(...)是最快的方式。如果優化器計算索引將更快,那麼優化器將使用可用的索引來滿足過濾條件。只要找到一行,IF EXISTS就會退出。

確保您的統計信息是最新的......

+0

啊,非常感謝。 出於好奇,用於將我的部分問題轉化爲代碼形式的標籤是什麼? 非常感謝 – Adam 2010-05-17 04:10:15

+0

@Adam:只要把4個空格你的代碼。或突出顯示所有代碼,然後按101010圖標(下一個雙引號圖標(地球圖標旁邊)) – Hao 2010-05-17 04:16:33

+0

非常感謝所有快速回復 – Adam 2010-05-17 04:17:53

0

FWIW,這是有效的SQL:

select * 
from (select * from dbo.Person where Company = @Company) t 
where t.FirstName = @FirstName and t.LastName = @LastName 

而且通過一個別名只能從您的查詢不同。米奇在帖子中說,IF EXISTS會更快。

您可以使用查詢分析器找出優化器將決定這樣做。