SQL-SERVER查询花费太多时间

时间:2019-06-12 11:39:58

标签: sql sql-server tsql indexing

我有一个简单的查询,但是即使选择中提到的所有列都在非聚簇索引中,也只有0.5万条记录需要1分钟。

两个表都有大约1M条记录,每个表中都有大约200列。

表中是否有很多记录或索引太多导致速度变慢。

SELECT catalog_items.id,
       catalog_items.store_code,
       catalog_items.web_code AS web_code,
       catalog_items.name AS name,
       catalog_items.name AS item_description,
       catalog_items.image_thumnail AS image_thumnail,
       catalog_items.purchase_description AS purchase_description,
       catalog_items.sale_description AS sale_description,
       catalog_items.taxable,
       catalog_items.is_unique_item,
       ISNULL(catalog_items.inventory_posting_flag, 'Y') AS inventory_posting_flag,
       catalog_item_extensions.total_cost,
       catalog_item_extensions.price
FROM catalog_items
     LEFT OUTER JOIN catalog_item_extensions ON catalog_items.id = catalog_item_extensions.catalog_item_id
WHERE catalog_items.trans_flag = 'A';

更新:执行计划显示缺少索引的索引,而该索引已经存在。为什么?

enter image description here

2 个答案:

答案 0 :(得分:2)

基于您提到从1m行的表中选择500k行,我不认为该计划当前是错误的。即使是由其他人建议的索引,从临界点(https://www.sqlskills.com/blogs/kimberly/the-tipping-point-query-answers/)来看,该索引的选择性也很弱-即使有200列,我也不希望每张表100万行中有500k会导致使用查找查找索引,在CBO的视图中进行全面扫描会更快。

缺少索引的问题-如果您仔细观察,它不仅建议在trans_flag上建议索引,还建议对字段进行索引,然后再INCUDE进行编号。我们看不到建议包含多少个索引,但我希望它是查询中的全部索引,并且基本上是建议您创建一个覆盖索引。即使在NC索引扫描方案中,这也比基表的扫描速度更快。

我们还没有关于物理布局,页面的构造方式,碎片级别等信息,甚至数据所在的磁盘类型以及总体大小也没有信息。例如,该image_thumbnail字段表明总体上存在较大的行大小,这意味着我们正在将页面外存储存储到LOB / SLOB中。

简而言之-我认为即使有查询计划,这里也没有“简单”的答案。

答案 1 :(得分:1)

对于此查询

select . . .                                    
from catalog_items ci left outer join
     catalog_item_extensions cie
     on ci.id = cie.catalog_item_id
where ci.trans_flag = 'A'

我建议在catalog_items(trans_flag, id)catalog_item_extensions(catalog_item_id)上建立索引。