2011-11-30 28 views
3

我有一個UPC數據庫的12位UPC-A格式條形碼(1,900,000條記錄)。目前它們由於前導零而被存儲爲varchar(13)。我正在使用SQL Server 2008 R2。什麼是在數據庫中搜索UPC代碼的最佳方式?

我也有一個WCF 4.0 API方法,用於根據UPC-A條形碼匹配查詢數據庫。

  • 什麼是改善基於UPC查詢
  • 什麼是存儲12位UPC-A條碼的最佳途徑性能的最佳方式。我的假設是使用varchar(12)好嗎?

編輯:更多信息

產品

  • 的ProductID (INT)
  • 條碼(VARCHAR(12))
  • 名稱(VARCHAR(50 ))
  • 的ImageUrl (VARCHAR(255))

我的代碼:

public JsonResult GetProductByCode(string code) 
{ 
    DBEntities db = new DBEntities; 

    Product product = (from prod in db.Products 
        where prod.Barcode == code 
        select prod).FirstOrDefault(); 

    return Json(product , JsonRequestBehavior.AllowGet); 
} 
+0

當你沒有向我們展示你現在正在做什麼時,很難建議改進性能。 :)另外,請定義「大量」。 –

+0

@KenWhite有一些信息給你! –

+0

...是的,但正在執行什麼**查詢**? – Matthew

回答

4

予取條形碼列作爲一個給定的索引。

如果將代碼存儲爲數字,則可以節省空間。空間是時間,因爲更少的字節可以更快地讀取。另外,查找應該在數字上更快。由於UPC-A是一個固定長度的代碼,因此可以在需要時重建前導零。

+3

空間不是一個問題在這裏。它只有1個。9M行,並且由於它們是固定寬度,所以它更具有零填充,並且爲顯示目的進行轉換而不是僅使用字符。在搜索之前,您還必須將用戶輸入的條碼(字符串)轉換爲數字,再次增加開銷。 –

+5

但數字搜索更快,所以它應該是一個整體的淨收益... – Randy

+0

@Ken空間總是一個問題。在UPC代碼上劃分索引的物理大小可能會決定位於第三級高速緩存或RAM中的索引的所需部分。你瞭解緩存層次結構的含義嗎? –

1

我認爲存儲爲varchar(12)可能是好的。爲確保條形碼查詢的性能,您可以做的第一件事是確保您在條形碼列上有一個索引。根據您對數據的使用情況,您可能會考慮將其設置爲clustered index

+0

如果你有寫道,我**不會推薦聚集索引。這將迫使你的整個190萬行表在「INSERT」上重新排序,因爲你不是「插入」順序數據。 – Matthew

+1

我會用char(12)而不是varchar - 如果它始終是12個字節的數據,則不需要每個字段的雙字節開銷。當然,它只有兩個字節,當然它只有190萬行......但它也位於索引中,而且你關心性能,所以一切都很重要。 –

+0

@MthethePK:我不同意你的「整個190萬」部分。即使UPC被指定爲聚簇索引,大多數插入可能會導致只有非常小的一部分數據被重新排序。但是,對UPC使用聚簇索引對我來說很刺激,但是ɹǝʇǝd的說法受到「取決於您對數據的使用...」的保護。 (如果數據被加載一次並且從不插入/更新/刪除,加上唯一可能的查詢類型在整個UPC上,那麼使用聚簇索引是一個不錯的選擇。) – Codism

1

確保您的sql搜索條件不包含函數,否則您的查詢不是可靠的。

我猜測你的讀取數量遠遠超過了你的寫入數量,如果數據是沒有前導零的數值,我會承擔在寫入時截斷它們並搜索確切值的代價。此外,UPC-A僅爲數字數據。我希望在數字數據上搜索的次數比varchar更多,因爲您聲稱空間不是問題,所以如果您願意,您甚至可以存儲兩個值。

您還需要列上的索引。

相關問題