我有一个场景,我必须插入表格中十三个不同的用例。我主要是从" MainTable" 获取数据,我只能获得" IsLocal"来自" MainTable" 的= 1 。
我只是在考虑是否应该在所有13个不同的用例中直接使用表格" IsLocal" 条件,或者只使用临时表并用记录填充它来自" MainTable" 的条件" IsLocal" = 1 。哪个对我来说更好?
此" MainTable" 预计会有大约100万条记录,其中很大一部分" IsLocal = 1" 。
答案 0 :(得分:1)
它主要取决于您的业务逻辑,基础架构和表定义本身。
如果要将数据存储在临时表中,它将存储在@Test
public void testGetScheduleTotalCount() {
when(jdbcTemplate.queryForObject(Mockito.anyString(),Mockito.anyMap(),Mockito.eq(Integer.class))).thenReturn(2);
}
中。所以,问题是我们是否能够在tempdb中存储这么多数据而不影响一般性能。
数据量是多少?如果您只存储了一百万tempdb
个值,那么我们可能就行了。但是,如果我们存储一百万行和多个BIGINT
值?
我们的nvarchar(max)
有多大,是否在ram磁盘上?
这个临时表的填充频率是多少?每天一次,还是每分钟几百次?
您需要考虑上述问题并实施解决方案。然后,几天或几周后,你会发现它并不好,并改变它。
在不知道您的生产环境详细信息的情况下,我只能建议您可以使用索引优化查询。您正在按tempdb
进行过滤 - 这似乎是filtering索引的一个很好的匹配(即使大多数行都有此值,我们将在读取时删除其中一些)。
此外,如果您只从表中获得少量列,则可以尝试创建查询的覆盖索引,创建包含include列的索引。使用我们需要的列索引和过滤谓词可以大大优化我们的查询。但是,你必须再次测试这一点,因为每次创建完美索引并不是一件容易的事。
答案 1 :(得分:0)
将频繁使用的数据存储在临时表和使用中绝对是更好的方法。在您的情况下,MainTable
的数据存储IsLocal = 1
的条件。它将避免一次又一次地扫描整个表格的特定数据集,因此它肯定会获得明显的性能。此外,我希望在遵循这种方法的同时为您提供一些建议:
1-使用INTO
子句存储数据 - 代替INSERT INTO
- 速度更快
SELECT a,b,c,......INTO #tmp_main_table FROM main_table
2-索引#tmp_main_table
注意:存储和其他问题属于您自己,所以要小心。