首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unidac 5.0性能退化

Unidac 5.0性能退化
EN

Stack Overflow用户
提问于 2013-05-17 14:00:47
回答 1查看 1.4K关注 0票数 3

我们从UniDAC 4.1迁移到5.0 (简单地用新版本重新构建或应用程序),并在我们的数据池例程中捕捉到了巨大的退化。

运行pgfouine可以捕获许多查询,如:

代码语言:javascript
复制
SELECT current_database() AS DATATYPE_CATALOG, 
n.nspname AS DATATYPE_SCHEMA,
t.typname AS DATATYPE_NAME,
t.oid AS DATATYPE_OID,
t.typlen AS DATATYPE_LENGTH,
CASE WHEN t.typtype = 'b' THEN 'base' 
    WHEN t.typtype = 'c' THEN 'composite' 
    WHEN t.typtype = 'd' THEN 'domain' 
    WHEN t.typtype = 'e' THEN 'enum' 
    WHEN t.typtype = 'p' THEN 'pseudo' 
END::varchar(9) AS DATATYPE_TYPE,
t.typrelid AS TABLE_OID, 
t.typbasetype AS DATATYPE_BASETYPE 
FROM pg_type t 
INNER JOIN pg_namespace n ON n.oid = t.typnamespace 
WHERE t.oid = '' AND t.typtype = '' 
ORDER BY n.nspname, t.typname;

它对21万个数据插入执行超过1,100,000次。为什么会发生这种情况,以及在当前版本中如何避免呢?

我们在insert循环之前执行一次TUniQuery.Prepare,并在其中重新分配查询参数。在UniDAC 4.1上,它工作得很好。

UPD。搜索最小可复制的应用程序/数据库,我发现,如果在表中使用域数据类型,就会发生这种情况。

代码语言:javascript
复制
    CREATE DOMAIN id_dom AS integer NOT NULL;
    CREATE TABLE test_table (id id_dom);

最低限度的应用:

代码语言:javascript
复制
    program minProject;

    {$APPTYPE CONSOLE}
    uses
    Messages, SysUtils, Variants,
    DB, DBAccess, Uni, UniProvider, PostgreSQLUniProvider;

    const text = 'insert into test_table (id) values (:id)';

    var
    qu:TUniQuery;
    PostgreSQL: TPostgreSQLUniProvider;
    UniConnection1: TUniConnection;
    i: Integer;
    ids: Variant;

    begin
    { TODO -oUser -cConsole Main : Insert code here }
    UniConnection1 := TUniConnection.Create(nil);
    PostgreSQL := TPostgreSQLUniProvider.Create(UniConnection1);
    UniConnection1.ProviderName := 'PostgreSQL';
    UniConnection1.Username := '';
    UniConnection1.Password := '';
    UniConnection1.Server := '';
    UniConnection1.Database := 'test';
    UniConnection1.SpecificOptions.Values['ProtocolVersion'] := 'pv30';
    ids := VarArrayOf([41750, 41751, 41752]);
    qu := TUniQuery.Create(UniConnection1);
    qu.Connection := UniConnection1;
    qu.SQL.Text := text;
    qu.Prepare;
    for I := 0 to 2 do
    begin
        qu.ParamByName('id').AsInteger := ids[i];
        qu.Execute;
    end;
    qu.Close();
    end.

如果使用通常的数据类型,一切都是可以的。

UPD2:

来自DevArt的答复:

谢谢你提供这信息。我们已经复制了这个问题,并正在进行调查。一旦有任何结果,我们会通知你的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-10 12:54:54

在5.0.1版本中添加了对域类型的完全支持(4.1版本中没有这种支持),因此我们不得不从数据库中请求额外的元数据。我们发布了一个新版本的UniDAC - 5.0.2 -它包含了一个修复程序,在处理域类型时可以提高性能。现在,UniDAC的工作速度与UniDAC 4.6.12一样快,即使查询包含具有域数据类型的字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16610947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档