结构:
pk_FeiZaiId int 主键,pk_OrderHeadId int,pk_OrderColorId int,nc_SizeCode nchar,nc_CraftCode nchar,n_Qty int
聚焦索引:pk_FeiZaiId
组合索引:pk_OrderHeadId + pk_OrderColorId + nc_SizeCode + nc_CraftCode表记录:13101693 行第一查询语句(用时0秒):
select pk_FeiZaiId,pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode from t_op_ProdOrderFZ where pk_OrderHeadId = 1608000879第二查询语句(用时38秒):
select pk_FeiZaiId,pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode,n_Qty from t_op_ProdOrderFZ where pk_OrderHeadId = 1608000879
查看执行计划,第二查询语句没有用到组合索引,于是用下面查询语句
第三查询语句(用时6秒):
select pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode,n_Qty from t_op_ProdOrderFZ with(index(IX_t_op_ProdOrderFZ)) where pk_OrderHeadId = 1608000879 三种查询语句都返回46460行,问题是我指定了组合索引为何还是要比不返回 n_Qty这列的语句要慢呢?第三种查询语句的执行计划种多了一项使用书签查找占有了全部时间,这是怎么回事啊?
pk_FeiZaiId int 主键,pk_OrderHeadId int,pk_OrderColorId int,nc_SizeCode nchar,nc_CraftCode nchar,n_Qty int
聚焦索引:pk_FeiZaiId
组合索引:pk_OrderHeadId + pk_OrderColorId + nc_SizeCode + nc_CraftCode表记录:13101693 行第一查询语句(用时0秒):
select pk_FeiZaiId,pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode from t_op_ProdOrderFZ where pk_OrderHeadId = 1608000879第二查询语句(用时38秒):
select pk_FeiZaiId,pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode,n_Qty from t_op_ProdOrderFZ where pk_OrderHeadId = 1608000879
查看执行计划,第二查询语句没有用到组合索引,于是用下面查询语句
第三查询语句(用时6秒):
select pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode,n_Qty from t_op_ProdOrderFZ with(index(IX_t_op_ProdOrderFZ)) where pk_OrderHeadId = 1608000879 三种查询语句都返回46460行,问题是我指定了组合索引为何还是要比不返回 n_Qty这列的语句要慢呢?第三种查询语句的执行计划种多了一项使用书签查找占有了全部时间,这是怎么回事啊?
然后 由行定位器找数据,当没有n_Qty列时直接由索引表取出数据了,当有这一列时SQL server综合碎片等的 影响 一般采用两种方式来查询数据:
1、选择条件良好,走索引
2、选择条件不佳,放弃索引你这种情况估计:1、碎片(碎片对索引顺序扫描影响挺大)2、sql server估算嵌套迭代太大放弃索引
sql 2000:
create index ix_01 on t_op_ProdOrderFZ (pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode,n_Qty)
sql 2005:
create index ix_01 on t_op_ProdOrderFZ (pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode)include(n_Qty)
如果有返回n_Qty列,则数据需要从通过组合索引的叶子层读到pk_OrderHeadId,pk_OrderColorId,nc_SizeCode,nc_CraftCode这些数据,然后再通过组合索引上的聚集索引键值再去聚集索引的叶子层返回n_Qty数据,多了一个步骤,就慢了。
注意组合索引所有列总长不能超过900字节。
非聚集索引應該如此使用
若查詢語句為SELECT A,B,C,D,E,F FROM TABLE WHERE A..... AND B..... AND C.....
建一個非聚集索引,索引鍵為A,B,C(按WHERE中出現的順序),包含非鍵列D,E,F
即
CREATE NONCLUSTERED INDEX **** ON TABLE (A,B,C) INCLUDE (D,E,F)
索引最好覆蓋SELECT的所有字段,但不必將所有字段設為索引鍵,只需要將查找條件出現的字段作為索引鍵就可以,其余包含進去!
游标+while。。能跑完程序算不错的了。可能到达一个瓶颈了,造成时间陡升。对这种大批量的插入操作,可以先drop索引,插完后再去重建。
以后少量插入应该影响不会很大。