【发布时间】:2012-08-13 18:51:55
【问题描述】:
我是试图优化 Sybase 查询的 SQL Server 开发人员。我正在尝试寻找非聚集索引,但它一直在进行扫描,只是想确认在 Sybase 中是否可以“寻找”如果是,如何实现非聚集索引寻找?
我有一个如下查询(* 实际上是大约 32 列)
选择 t.* FROM dbo.g1_positions t WHERE t.source_date = (select max(source_date) from g1_positions)
我在下面的表上有 3 个非聚集索引(无聚集索引)
- entity_id、bgnref、retnum、source_date 列上名为 primary_key 的索引
- entity_id、source_date 列上名为 idx_entdte 的索引
- bgnref、source_date 列上名为 idx_bgndte 的索引
内部查询(计算最大值并在 idx_entdte 上进行索引扫描),默认情况下外部索引进行表扫描,如果我强制索引它进行索引扫描和一些额外的事情,由 “对数据页使用 2 KB 的 I/O 大小。 数据页的 MRU 缓冲区替换策略。 "
我的猜测是这相当于我们在 SQL Server 中的“查找”。 强制索引后,我没有看到性能提升,我只是想知道我能做些什么来提高性能。
我无法对表进行任何更改,例如创建/删除/修改索引。
只是为了说明 SQL Server 工作中的查找。
假设我们有包含 4 条记录的表 Employee。
如果查询在 Emp_id 上使用非集群索引,它将到达叶节点并获取实际数据将使用指针来读取堆上的实际数据(行)。这个使用指针的过程称为 LookUp
【问题讨论】:
-
你希望它寻找什么?索引将 source_date 作为第二列或第四列。
-
同意,如果没有以
source_date作为第一列的索引,引擎将无法搜索任何内容。 -
@ta.speot.is 可以做些别的事情来提高查询的性能。
-
@Paciv 还有其他提高查询性能的技巧吗?
-
你可以在 source_date 上放一个索引
标签: sql-server sap-ase seek non-clustered-index