SQL Server索引统计信息未及时更新,导致排序混乱
2010-04-22 14:37
375 查看
今天,遇到了这样的一个例子:
SQL Server索引统计信息未及时更新,导致排序混乱
我们知道,在sql
server上创建索引后,同时会对该索引上的值进行排序,但对于新增加的值,如果未能及时更新统计信息,将有可能导致排序的混乱,也就是没有排序。
这是产生问题的语句:
Select * From V_L_IcStockProInEntry Where FInterID= '329482'
V_L_IcStockProInEntry是一个视图,其语句如下:
SELECT t2.FInterID, t2.FSeq,
t2.FItemID, t2.FMustQty, t2.FQty
FROM dbo.IcStockProIn AS t1 INNER JOIN
dbo.
IcStockProInEntry
AS t2 ON t1.FInterID = t2.FInterID LEFT OUTER JOIN
dbo.t_IcItem AS t3 ON t2.FItemID = t3.FItemID LEFT OUTER JOIN
dbo.IcProductTrace AS d ON t2.FTraceInterid = d.FInterID LEFT OUTER
JOIN
dbo.t_IcItemPrimary AS e ON d.FMainItemID = e.FItemID LEFT OUTER JOIN
dbo.t_EventType AS t10 ON t2.FQulityID = t10.FID LEFT OUTER JOIN
dbo.t_Customer AS h ON t2.FCustID = h.FID LEFT OUTER JOIN
dbo.V_WorkItem AS i ON t2.FStWorkItemID = i.FitemID LEFT OUTER JOIN
dbo.IcShopMo
AS G ON
G.FinterID = t2.FSourceInterID
查询的结果是finterid对应的多个fseq值未能正常排序。
finterid和fseq
属于icstockproinentry表的列,在这两列上有个聚集索引,所以会自动的排序。但由于数据更新较快,新插入的值未能及时有效排序,所以导致
了排序的混乱。
首先来看下统计信息:
dbcc show_statistics('IcStockProInEntry',PK_IcStockProInEntry)
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS
AVG_RANGE_ROWS
3 0 1 0 1
...
....
282987 101155 6 27942 3.620178
288803 18440 1 5253 3.510375
296886 24587 6 7468 3.292314
303529 18433 19 5799 3.178652
329478 71674 6 23077 3.105863
329480 0 4 0 1
可以看到,当前的RANGE_HI_KEY 的值未329480,而查询语句中的finterid值未329482,并未纳入统计。
而查询329480前的值,其排序是正常的。
如果更新下聚集索引的统计信息,就可以发现又正常了。
更新某个索引的统计信息可用
UPDATE STATISTICS
来进行。
SQL Server索引统计信息未及时更新,导致排序混乱
我们知道,在sql
server上创建索引后,同时会对该索引上的值进行排序,但对于新增加的值,如果未能及时更新统计信息,将有可能导致排序的混乱,也就是没有排序。
这是产生问题的语句:
Select * From V_L_IcStockProInEntry Where FInterID= '329482'
V_L_IcStockProInEntry是一个视图,其语句如下:
SELECT t2.FInterID, t2.FSeq,
t2.FItemID, t2.FMustQty, t2.FQty
FROM dbo.IcStockProIn AS t1 INNER JOIN
dbo.
IcStockProInEntry
AS t2 ON t1.FInterID = t2.FInterID LEFT OUTER JOIN
dbo.t_IcItem AS t3 ON t2.FItemID = t3.FItemID LEFT OUTER JOIN
dbo.IcProductTrace AS d ON t2.FTraceInterid = d.FInterID LEFT OUTER
JOIN
dbo.t_IcItemPrimary AS e ON d.FMainItemID = e.FItemID LEFT OUTER JOIN
dbo.t_EventType AS t10 ON t2.FQulityID = t10.FID LEFT OUTER JOIN
dbo.t_Customer AS h ON t2.FCustID = h.FID LEFT OUTER JOIN
dbo.V_WorkItem AS i ON t2.FStWorkItemID = i.FitemID LEFT OUTER JOIN
dbo.IcShopMo
AS G ON
G.FinterID = t2.FSourceInterID
查询的结果是finterid对应的多个fseq值未能正常排序。
finterid和fseq
属于icstockproinentry表的列,在这两列上有个聚集索引,所以会自动的排序。但由于数据更新较快,新插入的值未能及时有效排序,所以导致
了排序的混乱。
首先来看下统计信息:
dbcc show_statistics('IcStockProInEntry',PK_IcStockProInEntry)
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS
AVG_RANGE_ROWS
3 0 1 0 1
...
....
282987 101155 6 27942 3.620178
288803 18440 1 5253 3.510375
296886 24587 6 7468 3.292314
303529 18433 19 5799 3.178652
329478 71674 6 23077 3.105863
329480 0 4 0 1
可以看到,当前的RANGE_HI_KEY 的值未329480,而查询语句中的finterid值未329482,并未纳入统计。
而查询329480前的值,其排序是正常的。
如果更新下聚集索引的统计信息,就可以发现又正常了。
更新某个索引的统计信息可用
UPDATE STATISTICS
来进行。
相关文章推荐
- SQL调优--记一次表统计信息未及时更新导致查询超级慢
- SQL调优--记一次表统计信息未及时更新导致查询超级慢
- 更新所有数据库索引统计信息
- SQL Server 2005/2008遍历所有表更新统计信息
- SQL Server 数据库表的统计信息的更新
- SQL Server 自动更新统计信息的基本算法
- SQL Server 数据库统计信息更新对性能优化的切身体会
- SQL2008R2的 遍历所有表更新统计信息 和 索引重建
- SQL Server 2005/2008遍历所有表更新统计信息
- SQL Server 数据库表的统计信息的更新
- 收集统计信息导致索引被监控
- 10g r2后impdp 导入仅数据结构导致 索引等统计信息锁定
- MySQL索引统计信息更新相关的参数
- SQL Server 更新统计信息出现严重错误,应放弃任何可能产生的结果
- SQL Server 统计信息的创建与更新
- 【SQL Server学习笔记】索引调优、统计信息、查询调整、资源调控
- MySQL索引统计信息更新相关的参数
- SQL Server 自动更新统计信息的基本算法
- 错误的索引统计信息导致oracle expdp导500多G的大分区表时hang住
- MySQL索引统计信息更新相关的参数