2014-12-31 73 views
0

我無法找到這個問題的解決方案,因爲它似乎非常複雜的一個如何有查詢之間的適當的,它使用散列/索引結構

在這裏,我有1和表3列

CodeVal_1 bigint Unchecked 
CodeVal_2 bigint Unchecked 
CountryCode char(2) Unchecked 

CodeVal_1和CodeVal_2一起構成主鍵

因此,這表保存數據如下面

CodeVal_1 CodeVal_2 CountryCode 
7602176  7864319  AT 
16777216 16777471 AU 
16777472 16778239 CN 
16778240 16779263 AU 
16779264 16781311 CN 
16781312 16785407 JP 
16785408 16793599 CN 

現在我需要查詢該表作爲

select CountryCode from tblCountryCodes where 215454 between CodeVal_1 and CodeVal_2 

這完全工作在SQL服務器但它是緩慢的,使每一個查詢電話。所以,我想使在整個C#代碼這項工作有一些預加載等

但是我找不到這將加快工作速度比SQL服務器2014

正確的方法是,可能與某種實現它雙索引(我不知道這只是扔思想觀念),哈希表,字典等

等待您的意見和建議

+1

它看起來像'CodeVal_2'總是大於'CodeVal_1'?如果'CodeVal_2'已排序,則可以執行縮寫搜索。當CodeVal_2大於或等於您正在檢查的數字時,您可以隨時查看記錄。甚至可以將記錄分成多個列表(也許number_of_lists = number_of_records除以100或1000或某物),找到搜索數字將落入的列表,然後在該列表上執行上述縮寫搜索。 – itsme86

+0

itsme86可以詳細說明如何在csharp上以更快的方式檢查大於或等於?有沒有這樣的索引結構或等,而不是每次掃描整個內存? – MonsterMMORPG

+2

你的桌子有多少行?他們是否都適合記憶? –

回答

0

通過「讓每一個查詢電話」你的意思是,你正在多個調用不同的底塗215454的值?

如果是這種情況,您可以通過逗號分隔的字符串(由函數分割),xml或表值參數爲您的存儲過程提供多個值,以允許您在單次調用中檢索多個值。例如:

CREATE PROCEDURE [dbo].[usp_Table_SetVisibility] (
    @TableIds VARCHAR(MAX), 
    @IsVisible BIT 
) 
AS 

    UPDATE e 
    SET  e.IsVisible = @IsVisible 
    FROM dbo.udf_SplitString(@TableIds, ',') s 
     INNER JOIN dbo.[Table] e ON e.TableId = s.Value; 

GO 
+0

ty for answer然而每次單個查詢具有不同的值。我非常期待非SQL服務器解決方案,因爲它是最大的優化atm – MonsterMMORPG