2009-09-24 37 views
3

我们有很多查询,我们在字段和表名称末尾追加了一个随机别名(由于自定义ORM实现可能难以更改)。该查询是像以下的(虽然实质上更复杂,大部分时间):MS SQL Server优化器和不同的表和字段别名

SELECT fooA.field1 as field1B, 
     fooA.field2 as field1C 
FROM foo as fooA 

的后缀A,B和C是随机生成的(和长于一个字符)。这会不会损害我们查询的性能(即优化器是否能够识别由于随机部分而导致的重复查询)?我们主要使用SQL Server 2005.

回答

3

是的,优化器将需要重新编译和重新编译您的查询,因为查询哈希值将会改变。

+0

这是只适用于SQL Server吗? – 2009-09-24 14:35:34

+0

在'Oracle'和'MySQL'上也启用了查询缓存。但是,SQL Server会在计算散列时消除常量和文字,而Oracle需要逐字匹配。 – Quassnoi 2009-09-24 14:42:26

1

查询优化引擎使用通过ObjectId执行的执行计划 - 别名纯粹用于编程目的,但在执行期间不使用。所以我不认为使用不同的别名或使用小或长别名会影响性能。

Quassnoi对于查询的重新哈希提出了一个很好的观点。尽管查询性能本身没有受到影响,但整体性能环境将受到影响。

1

如果这些是即席查询,那么每个查询都将被编译并缓存为单独的查询。在SQL中,查询要与缓存计划相匹配,文本必须完全相同(低于大小写和空格)

如果您有许多仅在表别名中存在差异的查询,将会有很差的计划重用,大量的编译和非常大的计划缓存。

这只是存储过程匹配objectid缓存计划