N4v*_*N4v 2 sql-server best-practices
我最近开发了一个存储过程,它基本上从几个不同的表中查询数据,对其进行操作,然后将结果插入到某个表中。
它最终成为一个包含许多子查询的 INSERT 语句,大约有 300 行。代码非常高效;但是,它的可读性不是很好,并且可能还有其他缺点。
编写这样的查询是否在推荐用法内:
SELECT ...
INTO #tempfoo
FROM foo;
SELECT ...
INTO #tempbar
FROM bar;
SELECT ...
FROM #tempfoo
INNER JOIN #tempbar ON #tempfoo.id = #tempbar.id;
Run Code Online (Sandbox Code Playgroud)
或者像这样写更好,即使它可能变得有些不可读:
SELECT ...
FROM
(
SELECT ...
FROM foo
) AS foo
INNER JOIN
(
SELECT ...
FROM bar
) AS bar ON foo.id = bar.id;
Run Code Online (Sandbox Code Playgroud)
注意:我知道这是一个简单的例子,但想象一下,如果您有嵌套子查询层和四个或更多表连接。
有时,基础表上的索引不足以满足具有大量连接/应用/子查询/CTE 的特别大的查询。对于那些时候,临时表和表变量可能正是您提高性能所需要的。
通过使用临时表来存储中间结果,您可以创建改进进一步处理所需的任何索引或统计信息。当我们需要在一堆 OLTP 数据之上构建一个偶尔使用的报告时,我会时不时地遇到这个问题。表变量可以用于类似的目的,但限制是它们在索引方面几乎没有那么灵活(至少直到 2014 年,它开始消除大部分这种限制)。但他们都有点更轻,更重要的是,他们被限定在模块而不是会话,所以你不必担心命名冲突,就像您使用临时表。
当然,创建和写入临时表会产生相关开销,更不用说对代码可维护性的影响,因此,如果可以使用基于集合的操作将查询干净地编写为单个查询而不牺牲性能,那么坚持用这种方法。
| 归档时间: |
|
| 查看次数: |
10084 次 |
| 最近记录: |