none
sql server 2008 分区表的另外一个问题 RRS feed

  • 问题

  • 源表 source_table ,分区表 partition_table,主键和索引都一致

    主键为DATE, CUST_CODE, OCCUR_DATE, SERIAL_NO, ORDER_NO, CURRENCY_TYPE,非聚集

    非聚集索引1 CUST_CODE, 非聚集索引2 DATE 

    分区列是DATE,分区函数为RANGE RIGHT('20101101','20101201','20110101','20110201')

    SELECT DATE FROM source_table    WHERE DATE BETWEEN '20101201' AND '20101230'  --语句1

    SELECT DATE FROM partition_table WHERE DATE BETWEEN '20101201' AND '20101230'  --语句2

    这两句语句执行下来 语句1要快于语句2,查看执行计划,都用到了索引2,分区表查询语句中实际分区计数是5,也就是分区表的查询并没有区分查询的到底是哪个分区

    疑问:请问查询语句中的列完全被索引覆盖,为什么语句2 不能分清楚到底是查哪个分区呢?

    SELECT TOP 20000 * FROM source_table   WHERE DATE BETWEEN '20101201' AND '20101230' --语句3

    SELECT TOP 20000 * FROM partition_table WHERE DATE BETWEEN '20101201' AND '20101230' --语句4

    这两句语句执行下来 语句4要快于语句3,查看执行计划,都是全表扫描,分区表查询语句中实际分区计数是1,也就是分区表的查询分清了使用哪个分区

    疑问:语句4都没使用到索引,怎么会分清使用了哪个分区?

    初学分区表,目前对分区表的一些查询上有很多疑问,故想请教一下高手,请帮忙解答一下我的问题,谢谢。

    2011年12月19日 8:41

答案

  • Regarding query 4, optimizer will not use non-clustered index if found that costs more than table scan. Since table is partitioned by date, sql got rows from specific partition. For 2nd query, I'll double check index on date since it doesn't touch any other columns.
    2011年12月20日 20:54

全部回复