C# FirebirdSql(C)比在FlameRobin中执行脚本慢

C# FirebirdSql(C)比在FlameRobin中执行脚本慢,c#,sql,sql-server,firebird,C#,Sql,Sql Server,Firebird,我的.NET项目中有FirebirdSql dll版本4.1,它连接到Firebird Sql server版本2.1,我使用FlameRobin客户端非常方便的工具测试我的Sql脚本 无论如何,我面临的问题是,我在FlameRobin中执行的每个脚本都非常快,但是在我的.NET项目中通过FirebirdSql运行相同的脚本时,它需要更长的时间。也许这个问题没有简单的答案,有没有人知道为什么在我的C项目中这会工作得这么慢 这是我在Flamerobin中执行的sql脚本,执行需要一秒钟: 这与我的

我的.NET项目中有FirebirdSql dll版本4.1,它连接到Firebird Sql server版本2.1,我使用FlameRobin客户端非常方便的工具测试我的Sql脚本

无论如何,我面临的问题是,我在FlameRobin中执行的每个脚本都非常快,但是在我的.NET项目中通过FirebirdSql运行相同的脚本时,它需要更长的时间。也许这个问题没有简单的答案,有没有人知道为什么在我的C项目中这会工作得这么慢

这是我在Flamerobin中执行的sql脚本,执行需要一秒钟:

这与我的C项目中的脚本相同,执行只需10秒以上:


很可能您没有在FlameRobin中获取所有记录,只是查看网格中的第一个x。

谢谢您的回答@cincura.net,我在FlameRobin中进行了检查,事实上所有记录都是一次获取的。当我一步一步地阅读代码时,我注意到读取事务需要几秒钟的时间,也许有一种更快的方法来读取FbDataReader,但我并没有屏住呼吸:你所说的代码是什么意思?一个transactionReader.Read平均需要多长时间?FbDataReader是最快的方法。我的意思是通过代码,FbDataReader执行基本上需要10-12秒。无论如何,我已经测试了一些场景,似乎执行脚本的时间通常很长,有时只有5-7秒,使用不同的和更短的脚本。你可能是对的,使用FbDataReader是最快的方法。
SELECT t.S_ID, t.TR_SEQ, t.TR_DATE, t.TR_TIME, t.TR_TERM_SLA, r.DR_NAME, t.TR_DPT_NO, t.TR_EVENT, ev.ET_DESC, t.TR_DIRECTION, t.TR_TAG_CODE, m.MST_FIRST_NAME, m.MST_LAST_NAME, t.TR_TT_TYPENO, t.TR_MSTSQ, t.TR_REASON_CODE, t.TR_PROCESSED
from TRANSACK t left outer join MASTER m on t.TR_MSTSQ = m.MST_SQ, EVENT_TYPE ev, READER r
where ev.ET_TYPENO = t.TR_EVENT and r.T_ADDR = t.TR_TERM_SLA and 20140205 <= t.TR_DATE and 20140206 >= t.TR_DATE and (m.MST_LAST_NAME like '%' or m.MST_LAST_NAME is null) and (m.MST_FIRST_NAME like '%' or m.MST_FIRST_NAME is null) and t.TR_TAG_CODE like '%'
order by t.TR_DATE desc, t.TR_SEQ desc
_firebirdContext.OpenConnection();
List<Transaction> stuffFromTransactions = new List<Transaction>();

FbCommand readTransaction = new FbCommand("SELECT t.S_ID, t.TR_SEQ, t.TR_DATE, t.TR_TIME, t.TR_TERM_SLA, r.DR_NAME, t.TR_DPT_NO, t.TR_EVENT, ev.ET_DESC, " + 
    "t.TR_DIRECTION, t.TR_TAG_CODE, m.MST_FIRST_NAME, m.MST_LAST_NAME, t.TR_TT_TYPENO, t.TR_MSTSQ, t.TR_REASON_CODE, t.TR_PROCESSED " +
    "from TRANSACK t left outer join MASTER m on t.TR_MSTSQ = m.MST_SQ, EVENT_TYPE ev, READER r " + 
    "where ev.ET_TYPENO = t.TR_EVENT and r.T_ADDR = t.TR_TERM_SLA and 20140205 <= t.TR_DATE and 20140206 >= t.TR_DATE and (m.MST_LAST_NAME like '%' or m.MST_LAST_NAME is null) and (m.MST_FIRST_NAME like '%' or m.MST_FIRST_NAME is null) and t.TR_TAG_CODE like '%'" +         
    "order by t.TR_DATE desc, t.TR_SEQ desc", _firebirdContext.FbConnection);
FbDataReader transactionReader = readTransaction.ExecuteReader();
while (transactionReader.Read())
{
    Transaction transaction = new Transaction();
    if (!Convert.IsDBNull(transactionReader[0]))
    {
        transaction.S_ID = (int)transactionReader[0];
    }
    if (!Convert.IsDBNull(transactionReader[1]))
    {
        transaction.TR_SEQ = (int)transactionReader[1];
    }

    // ...
    // abbreviated
    // ...

    if (!Convert.IsDBNull(transactionReader[16]))
    {
        transaction.TR_PROCESSED = (Int16)transactionReader[16];
    }
    stuffFromTransactions.Add(transaction);
}
transactionReader.Close();
_firebirdContext.CloseConnection();
return stuffFromTransactions;