我有10多个事实表。他们每个人都有一个非唯一的聚集索引Id_Config_table
。每个数据插入(来自Config_Table的ID)都分配给事实表。每个Id_Config_table
包含大约1-150万行数据。
Config_Table :
+----+-----------+----------+
| Id | FactTbl | Date |
+----+-----------+----------+
| 1 | FactTbl_1 | 20190101 |
| 2 | FactTbl_2 | 20190101 |
| 3 | FactTbl_1 | 20190101 |
| 4 | FactTbl_2 | 20190102 |
+----+-----------+----------+
日期未在上表中排序,而是按ID排序。
我的事实表如下:
事实表_1 :
+------+---------------+-----------------+
| Col1 | few_more_cols | Id_Config_table |
+------+---------------+-----------------+
| .. | .. | 1 |
+------+---------------+-----------------+
| .. | .. | 3 |
+------+---------------+-----------------+
事实表_2 :
+------+---------------+-----------------+
| Col1 | few_more_cols | Id_Config_table |
+------+---------------+-----------------+
| .. | .. | 2 |
+------+---------------+-----------------+
| .. | .. | 4 |
+------+---------------+-----------------+
当前,我正在使用以下查询:
Select
col1,
few_more_cols
from
Fact_Table_1
Where
Id_Config_table IN (Select Id
from Config_Table
where Date >= 20190101 and Date <= 20190331)
注意:Fact_Table_1或Fact_Table_2中的数据使用Id_Config_table
排序,而不是使用Date
排序,这就是为什么我需要使用子查询的原因。我的事实表每个Id_Config_table
包含1-150万行数据。
现在,我打算添加一个新列,它是int格式的Date,并使其成为新的聚集索引。我无法删除Id_Config_table
列,因为它已在其他地方使用。
事实表_新:
+------+---------------+-----------------+----------+
| Col1 | few_more_cols | Id_Config_table | Date |
+------+---------------+-----------------+----------+
| .. | .. | 8 | 20190101 |
| .. | .. | 7 | 20190102 |
| .. | .. | 1 | 20190103 |
+------+---------------+-----------------+----------+
在这种情况下,数据将按日期排序。我现在可以删除子查询
Select
col1, few_more_cols
from
Fact_Table_1
Where
Date >= 20190101 AND Date <= 20190331
如果我使用新索引使用第二个查询,是否会提高查询性能?