有关更新数据库的ColdFusion 10文档有关于ColdFusion 10中与数据库相关的增强功能的部分.那个页面提到现在有支持CF_SQL_NVARCHAR,但没有关于它们的细节.此外,cfqueryparam文档尚未更新以包含它们的存在.
cfqueryparam的ColdFusion 9文档提到CF_SQL_VARCHAR映射到varcharMSSQL中.除非ColdFusion Administrator 数据源设置已String Format启用该设置,否则这是正确的.在哪种情况下CF_SQL_VARCHAR映射到nvarchar.这个记录不完整的功能是一个hack,可能会导致 ColdFusion中的性能问题.
所以他们介绍的很棒CF_SQL_NVARCHAR,但了解它是如何工作的会很好.它只是CF_SQL_VARCHAR使它毫无意义的别名?它总是发送字符串nvarchar吗?如果是这样,CF_SQL_VARCHAR总是发送varchar?
我希望为了向后兼容,它实现如下:
如果String Format已启用CF_SQL_VARCHAR且CF_SQL_NVARCHAR两者都映射到nvarchar.
如果String Format已禁用,则CF_SQL_VARCHAR映射到varchar并CF_SQL_NVARCHAR映射到nvarchar.
这意味着任何CF10之前的站点都可以转移到CF10并运行,在CF10之前具有相同的性能考虑因素.
该重写所有查询新的网站,或者网站相匹配CF_SQL_VARCHAR,并CF_SQL_NVARCHAR与数据库设计将无法获得性能损失是不可避免的预CF10.
任何人都可以确认是否是这种情况; 如果有官方的东西更好吗?
我有以下查询在16毫秒 - 30毫秒运行.
<cfquery name="local.test1" datasource="imagecdn">
SELECT hash FROM jobs WHERE hash in(
'EBDA95630915EB80709C69089315399B',
'3617B8E6CF0C62ECBD3C48DDF8585466',
'D519A38F09FDA868A2FEF1C55C9FEE76',
'135F94C3774F7719CFF8FF3A275D2D05',
'D58FAE69C559273D8427673A08193789',
'2BD7276F209768F2FCA6635659D7922A',
'B1E3CFBFCCFF6F5B48A849A050E6D424',
'2288F5B8A797F5302E8CA24323617236',
'8951883E36B5D38A4643DFAA0396BF13',
'839210BD564E30BE1355D1A6D4EF7081',
'ED4A2CB0C28B608C29576819CF7BE19B',
'CB26925A4874945B810707D5FF0B91F2',
'33B2FC229F0CC797A02AD163CDBA0875',
'624986E7547DBAC0F47B3005CFDE0A16',
'6F692C289BD805CEE41EF59F83F16F4D',
'8551F0033C617BD9EADAAD6CEC4B3E9E',
'94C3C0A74C2DE085FF9F1BBF928821A4',
'28DC1A9D2A69C2EDF5E6C0E6368A0B3C'
)
</cfquery>
Run Code Online (Sandbox Code Playgroud)
如果我执行相同的查询但使用cfqueryparam它运行500ms - 2000ms.
<cfset local.hashes = "[list of the same ids as above]">
<cfquery name="local.test2" datasource="imagecdn">
SELECT hash FROM jobs WHERE hash in(
<cfqueryparam cfsqltype="cf_sql_varchar" value="#local.hashes#" list="yes">
)
</cfquery>
Run Code Online (Sandbox Code Playgroud)
该表大约有60,000行."hash"列是varchar(50)并且具有唯一的非聚集索引,但不是主键.数据库服务器是MSSQL 2008.Web服务器正在运行最新版本的CF9.
知道为什么cfqueryparam会导致性能轰炸吗?无论我刷新页面多少次,它每次都会以这种方式运行.如果我将列表配对只有2或3个哈希值,它仍然表现不佳,如150-200ms.当我取消cfqueryparam时,性能如预期.在这种情况下,有可能进行SQL注入,因此使用cfqueryparam肯定会更好,但是从索引列中找到2条记录不应该花费100毫秒.
编辑:
我们使用的hash()是非UUIDS或GUIDS 生成的哈希.散列由a生成,hash(SerializeJSON({ struct }))其中包含要在映像上执行的一组操作的计划.这样做的目的是它允许我们在插入之前和查询之前知道该结构的确切唯一ID.这些哈希充当已经存储在DB中的结构的"索引".除了哈希之外,相同的结构将散列到相同的结果,这对UUIDS和GUIDS来说是不正确的.
该查询正在5个不同的CF9服务器上执行,并且所有这些服务器都表现出相同的行为.对我来说,这排除了CF9缓存某些东西的想法.所有服务器都连接到完全相同的DB,因此如果发生缓存,则必须是数据库级别.