繁体   English   中英

activerecord-sqlserver-adapter unicode慢性能

[英]activerecord-sqlserver-adapter unicode slow performance

我在Rails 3.2.18和MRI-Ruby-2.0.0上

的Gemfile:

gem 'tiny_tds'
gem 'activerecord-sqlserver-adapter'

$ gem list | grep -E“tds | sql”

activerecord-sqlserver-adapter (3.2.12)
sqlite3 (1.3.9)
tiny_tds (0.6.2)

database.yml的:

development:
  adapter: sqlserver
  database: DBTEST
  username: domain\username
  password: somepwd
  host: myhostname
  port: 1433
  timeout: 180000

问题:查询需要很长时间才能完成。 看到:

> MyModel.find_all_by_NRPIS '12700333166'
  MyModel Load (85869.3ms)  EXEC sp_executesql N'SELECT [MyTable].* FROM [MyTable] WHERE [MyTable].[NRPIS] = N''12700333166'''

所以我看到问题出现在N unicode转换中,因为当我在没有它的情况下查询时,它真的很快,请参阅:

   >> ActiveRecord::Base.connection.select_all   "SELECT [MyTable].* FROM [MyTable] WHERE [MyTable].[NRPIS] = '12700333166'" }
   (62.5ms)  EXEC sp_executesql N'SELECT [MyTable].* FROM [MyTable] WHERE [TBCAGEDTrabalhador].[NRPIS] = ''12700333166'''

   >> ActiveRecord::Base.connection.select_all   "SELECT [MyTable].* FROM [MyTable] WHERE [MyTable].[NRPIS] = N'12700333166'" }
   (102324.0ms)  EXEC sp_executesql N'SELECT [MyTable].* FROM [MyTable] WHERE [MyTable].[NRPIS] = N''12700333166'''

这里发生了什么,我该如何解决这个问题?

我已经看过这个问题 ,但我真的想告诉sqlserver-adapter不要将任何东西转换为unicode。

找到了。

这里讨论了这个问题: 禁用N'...'引用字符串#124

问题是引用utf-8字符串。 除了上面的解决方案,也许你可以强制其他编码,以便字符串不被引用,如:

> a = MyModel.where "NRPIS = ?", '12700233166'.force_encoding("ISO-8859-1")
 MyModel Load (53.1ms)  EXEC sp_executesql N'SELECT [MyTable].* FROM [MyTable] WHERE (NRPIS = ''12700193166'')'

作为附加信息,MyModel引用的表没有定义primary_keys,只有NRPIS的索引。

我注意到,当我查询定义了primary_keys的表并且您只查询primary_keys时,索引不会被忽略,即使使用unicode引用,查询也会快速运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM