设置
在一个数据仓库中,我将一个事实表连接到20个维度。事实表具有3200万行和30列。这是一个临时暂存表,因此我不必与其他正在读取或写入该表的用户打交道。我从基础表中选择10列,并从各个维度中选择20列。尺寸表很小(介于3到15.000行之间)。连接的字段都是整数和nvarchars。我使用SELECT ... INTO语句。表上没有索引。
该查询的执行速度太慢,无法使用。
尝试过的解决方案
因为查询处理时间太长,所以我尝试了以下解决方案:
- 将20个联接拆分为5个表上的4个联接。但是查询性能仍然很低。
- 将索引放在外键列上。没有明显的时间减少。
- 确保联接条件的字段为整数。我注意到性能提高了25%。不完全是我要寻找的。
- 使用insert into语句代替select into。尽管数据库处于简单恢复模式,但由于日志文件增长而导致性能更差。
这些发现使我包括了实际的执行计划,该计划表明89%的成本在表插入中。其他成本是对事实表进行8%的表扫描,对内部联接进行2%的哈希匹配。
问题
- 缓慢插入表的可能原因是什么?
- 没有执行计划,有哪些方法可以识别此瓶颈?
- 我可以采取什么措施来减少表格插入的费用?