2011-11-30 25 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更多,因为您声称空间不是问题,所以如果您愿意,您甚至可以存储两个值。

您还需要列上的索引。

相关问题