相关疑难解决方法(0)

TSQL中具有多维度的类型2有效日期指数性能

复合指数如何在有效的日期表中起作用?

利用T-SQL,假设我有一个表格,该表格与EffectiveStartDate和EffectiveEndDate相关联,该产品与产品相关联,以记录历史价格波动,因此我的表格采用以下形式:

MyTable:=(EffStartDate日期,EffEndDate日期,ProductID int,ProductPrice money),当记录当前有效时,EffEndDate = '12/31/9999'.

让我们进一步假设我在表中以以下形式实现两个索引:Clustered on(EffEndDate,EffStartDate,ProductID)Nonclustered on(EffEndDate,ProductID)

根据我的理解,聚集索引的索引创建将信息存储在由索引创建语句的列规范顺序排序的B树(可能是B +)中.因此,我设想在EffEndDate上进行表格排序,然后是EffStartDate,然后是ProductID.大多数情况下,我希望使用类似于此的查询从历史中查询此表:select*from MyTable,其中ProductID = @ProductID,EffStartDate和EffEndDate之间的@MyDate.

我试图想象B树如何实际存储与这三列相关的信息.它是否将它存储为您可以在Python中找到的元组对象,还是在索引是复合时为B树添加更多维度?例如,对于给定的EffEndDate,B树是否有多个与EffStartDates相关的分裂树,然后是多个与ProductID相关的分裂树,或者每个分裂树是否基于元组进行分割?这种反应似乎相信需要采用元组方法: 问题.

如果它采用单维方法,我发现很难概念化这些类型的索引如何为两列之间的日期范围查找提供整体价值.对于实例,我认为发生这样的情况,给定一个日期(@MyDate),我们可以使用索引的EffEndDate组件将我们的搜索限制为仅EffEndDates> = @MyDate,然后使用EffStartDate组件将我们的搜索限制为只有EffStartDate <= @ MyDate,然后在此剩余范围内搜索ProductID.这是指数的使用方式吗?

我预见到的问题是,如果我们有大约10万个产品每周非均匀地更新,我们最终会利用这个聚集索引生成一组巨大的有效日期范围,然后必须搜索每个日期我们所需ProductID实例的范围.是否有更好的索引来实现这种类型的查询?

我相信非聚集索引的存在是为了快速搜索当前的ProductID价格,因为我们只需要两个拼图,因为EffEndDate将被设置为'12/31/9999'.

或者,有没有办法实现跨越两列的多维索引,以提高T-SQL中的查询性能?

谢谢!

t-sql sql-server indexing

5
推荐指数
1
解决办法
470
查看次数

使用复合聚簇索引时,SQL Server是否会跳槽?

请考虑以下复合聚簇索引:

CREATE UNIQUE CLUSTERED INDEX ix_mytable ON mytable(a, b)
Run Code Online (Sandbox Code Playgroud)

显然,在一个单独的索引b将使搜索的特定值b更快.

但是,如果在一个单独的索引b使用,在我看来,该指数仍然可以用于查找特定值元b,而不是表扫描,通过遍历的离散值的树一个做对于本地搜索b,跳转到下一个值,等

这是SQL Server的工作原理吗?(例如,如果MSSQL对具有多列的索引使用单个哈希值,则不会这样.)

它是,并且由于其他原因已经需要复合索引,并且a的离散值的数量足够小,性能/空间权衡可能摆脱具有b的单独索引.

(以上UNIQUE和集群约束不是真正需要对于这个例子,但它们将代表的最快检索b不涉及一个单独的索引为b --the前者提供的快捷方式的每个循环一个,后者除去查找中的一个间接度).

t-sql sql-server indexing clustered-index

3
推荐指数
1
解决办法
1220
查看次数

标签 统计

indexing ×2

sql-server ×2

t-sql ×2

clustered-index ×1