【问题标题】:activerecord-sqlserver-adapter unicode slow performanceactiverecord-sqlserver-adapter unicode 性能慢
【发布时间】:2014-09-09 19:05:08
【问题描述】:

我正在使用 Rails 3.2.18 和 MRI-Ruby-2.0.0

宝石文件:

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

$ 宝石列表 | grep -E "tds|sql"

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

数据库.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'''

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

我见过THIS QUESTION,但我真的很想告诉 sqlserver-adapter 不要将任何东西转换为 unicode。

【问题讨论】:

    标签: ruby-on-rails sql-server performance activerecord unicode


    【解决方案1】:

    找到了。

    这里已经讨论过这个问题:disabling N'...' quoting for strings #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 引用的表没有定义主键,只有 NRPIS 的索引。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2012-07-13
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多