在单独的查询中使用临时表

时间:2018-01-12 07:44:17

标签: sql-server temp-tables

我有一个场景,我必须插入表格中十三个不同的用例。我主要是从" MainTable" 获取数据,我只能获得" IsLocal"来自" MainTable" 的= 1

我只是在考虑是否应该在所有13个不同的用例中直接使用表格" IsLocal" 条件,或者只使用临时表并用记录填充它来自" MainTable" 的条件" IsLocal" = 1 。哪个对我来说更好?

" MainTable" 预计会有大约100万条记录,其中很大一部分" IsLocal = 1"

2 个答案:

答案 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

中的列

注意:存储和其他问题属于您自己,所以要小心。