当前位置: 代码迷 >> .NET Framework >> 请问:Entity Framework与数据库索引。数据库索引在这种情况下有没有必要
  详细解决方案

请问:Entity Framework与数据库索引。数据库索引在这种情况下有没有必要

热度:91   发布时间:2016-05-01 23:28:06.0
请教:Entity Framework与数据库索引。。。数据库索引在这种情况下有没有必要?
本帖最后由 freeparadise521 于 2014-12-12 15:52:12 编辑
情况描述:

现在的项目是先建数据库/表,然后根据数据库生成entities模型,再根据各个模型写各自的类,以读取数据。通常的作法是先把某一大类的数据读取出来,后续再对这一大类的数据根据需要做进一步的筛选。每次读取使用cache对数据缓存。比如

Public Function GetOrders (IsValid as Boolean) As List (Of Order)
            Dim cacheKey As String = String.Format("Orders{0}", IsValid.ToString)
            If Not IsNothing(Cache(cacheKey)) Then
                Return CType(Cache(cacheKey), List(Of Order))
            End If

            Dim lOrders As List(Of Order) = (From lai As Oder In OrderContext.Orders() Where lai.IsValid = IsValid).ToList
            CacheData(key, lSellViews, CacheDuration)    'CacheData是基类中的一个子程序
            Return lOrders
End Function

Public Function GetOrders (IsValid as Boolean, OrderDate as Date) As List (Of Order)
            Dim cacheKey As String = String.Format("Orders{0}Date{1}", IsValid.ToString, OrderDate.ToShortDateString)
            If Not IsNothing(Cache(cacheKey)) Then
                Return CType(Cache(cacheKey), List(Of Order))
            End If

            Dim lOrders As List(Of Order) = (From lai As Oder In GetOrders(IsValid) Where lai.OrderDate  = OrderDate).ToList
            CacheData(key, lSellViews, CacheDuration)   'CacheData是基类中的一个子程序
            Return lOrders
End Function


假设数据库表中设了IsValid和OderDate两个非聚集索引。上述情况下,数据库的索引或许对第一个函数还有些用,因为是读取的数据库,第二个函数检测到有缓存的时候,就不会再读数据库,而是进内存中的缓存数据进行筛选。那么,数据库中的OrderDate索引是不是就没意义了?
------解决思路----------------------
既然没有任何地方会把OderDate作为条件,那么的确可以取消,但前提你得保证你不使用同时别人也不使用
------解决思路----------------------
就你的问题来说,显然意见,你内存中又没有用到什么数据库索引,它索引当然是没有意义的。

但是这个前提是,这里花哨的所谓缓存概念“玩儿的太过火”了。很少有公司会说“滥用内存无所谓,丢了无所谓,脏数据也无所谓,不支持多用户也无所谓,不索引也无所谓”,除非在某个培训班上个别的、拿人家项目不当回事的学生才如此。
  相关解决方案