我每天都在使用MS Access 2010,我想知道SQL Server中是否有公用表表达式的替代方法,以及它如何影响性能?
例如,创建子查询是否更好,或者更好地从另一个查询调用查询,这基本上非常相似...
示例:
SELECT A.field1,A.Date
FROM (SELECT * FROM TABLE B WHERE B.Date = Restriction )
或
SELECT A.field1,A.Date
FROM SavedQueryB
SavedQueryB:
SELECT * FROM TABLE B WHERE B.Date = Restriction
我觉得有多个查询可以让它更容易调试和管理,但是当数据集非常大时会影响性能吗?
另外,我已经看过一些关于通过VBA实现查询的视频,但是我不太习惯这样做。
本质。 什么是更有效或更好的做法?有关更好做法的任何建议或建议吗? 我大多是自学,通过视频,书籍和一些编程背景(VB.NET)
答案 0 :(得分:4)
对于最简单的查询,例如您问题中的查询,我怀疑您会看到子查询与“堆叠查询”(使用另一个已保存查询作为其数据源)方法之间的显着性能差异。也许db引擎甚至会对两者使用相同的查询计划。 (如果您有兴趣,可以使用SHOWPLAN来检查查询计划。)
这两个示例的主要性能驱动因素是db引擎是否可以使用索引检索来获取满足WHERE
限制的行。如果TABLE.Date
未编入索引,则查询将需要全表扫描。这对于一个非常大的数据集来说会非常糟糕,而完整扫描对性能的影响应该远远超过子查询和堆叠查询之间的任何差异。
情况可能与复杂的子查询不同Allen Browne explains:
具有许多记录的表上的复杂子查询可能运行缓慢。
在子查询性能问题的潜在修复中,他建议......
使用堆叠查询而不是子查询。创建单独保存 查询JET首先执行,并将其用作输入“表” 你的主要问题。这种预处理通常(但不总是) 比子查询更快。同样,尝试在一个中执行聚合 查询,然后创建另一个在聚合上运行的查询 结果。这种后处理速度可以比a快几个数量级 尝试使用子查询在单个查询中执行所有操作的查询。
我认为你最好的答案将来自测试更复杂的现实世界的例子。您问题中的查询非常简单,从中得出的结论可能不适用于那些真实世界的查询。
答案 1 :(得分:2)
我不记得在哪里,但有关于嵌套或子查询的主题的讨论。基本上他们都建议保存查询,然后引用保存的查询。
从个人经验来看,嵌套查询很难在以后进行故障排除或修改。此外,如果它们太深,我会遇到性能损失。
Allen Browne列出了here
列出的一些提示和技巧我使用嵌套查询的一个地方是动作查询的标准。这样我就没有任何连接,可以限制一些“无法执行此操作”的问题。
最后,在VBA中使用查询字符串。我发现构建参数查询要容易得多,然后在VBA中为QueryDef设置一个变量并添加参数而不是在VBA中构建查询字符串。以后更容易进行故障排除和修改。
只是我的两分钱。
答案 2 :(得分:2)
这实际上是依赖于上下文的,因为许多场景将决定最有效的结果,包括数据类型,连接表,索引等。从本质上讲,对于像发布SELECT
statmeents这样的简单查询,这两个查询是等价的,但Jet / ACE(MS Access的底层引擎)查询优化器可能会根据结构需求再次决定不同的计划。查询。可能,调用外部查询会在执行计划中添加一个步骤,但子查询可以作为自包含表执行,然后链接到主表。
回想一下SQL的一般操作顺序,它与类型顺序不同,因为每个步骤都涉及一个虚拟表(参见SQL Server):
FROM clause --VT1
ON clause --VT2
WHERE clause --VT3
GROUP BY clause --VT4
HAVING clause --VT5
SELECT clause --VT6
ORDER BY clause --VT7
可以说是存储的查询对象,MS Access分析和缓存优化的"最佳计划"版。这通常是在VBA字符串查询上使用存储查询的参数,后者在执行之前未进行优化。更进一步,Access' 查询对象类似于其他RDMS' view 对象(虽然Jet / ACE确实有VIEW
和PROCEDURE
个对象。 SQL世界中的定期讨论涉及到效率和最佳实践的问题:views vs subqueries通常答案返回"它取决于"。因此,需要进行实验。
这里的CTE被视为"内联视图"由WITH
子句表示(在JET / ACE中尚不支持)。 SQL程序员可以使用CTE来提高可读性和可维护性,因为您可以避免在语句体中多次引用相同的语句。总而言之,使用适合您的编码仪式和项目要求的内容,然后根据需要进行调整。
资源
MS Access 2007 Query Performance Tips - 关于子查询效果的说明
Intermediate Microsoft Jet
SQL
- 关于子查询的说明(刚刚了解了ANY/SOME/ALL
)
Microsoft Jet 3.5 Performance White Paper - 关于查询计划的说明