我有一个简单的查询,但是即使选择中提到的所有列都在非聚簇索引中,也只有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';
更新:执行计划显示缺少索引的索引,而该索引已经存在。为什么?
答案 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)
上建立索引。