J'utilise une requête relativement complexe pour extraire des données de l'une de nos bases de données de facturation.Pourquoi OracleDataAdapter.Fill() est très lent?
Je suis confronté à un problème où la requête semble se terminer assez rapidement lors de l'exécution avec SQL Developer, mais ne semble jamais finir lorsque vous utilisez la méthode OracleDataAdapter.Fill()
. J'essaie seulement de lire environ 1000 lignes et la requête se termine dans SQL Developer en 20 secondes environ.
Qu'est-ce qui pourrait causer de telles différences de performance? J'ai des tonnes d'autres requêtes qui s'exécutent rapidement en utilisant la même fonction.
Voici le code que je utilise pour exécuter la requête:
using Oracle.DataAccess.Client;
...
public DataTable ExecuteExternalQuery(string connectionString, string providerName, string queryText)
{
DbConnection connection = null;
DbCommand selectCommand = null;
DbDataAdapter adapter = null;
switch (providerName)
{
case "System.Data.OracleClient":
case "Oracle.DataAccess.Client":
connection = new OracleConnection(connectionString);
selectCommand = connection.CreateCommand();
adapter = new OracleDataAdapter((OracleCommand)selectCommand);
break;
...
}
DataTable table = null;
try
{
connection.Open();
selectCommand.CommandText = queryText;
selectCommand.CommandTimeout = 300000;
selectCommand.CommandType = CommandType.Text;
table = new DataTable("result");
table.Locale = CultureInfo.CurrentCulture;
adapter.Fill(table);
}
finally
{
adapter.Dispose();
if (connection.State != ConnectionState.Closed)
{
connection.Close();
}
}
return table;
}
Et voici les grandes lignes de SQL J'utilise:
with
trouble_calls as
(
select
work_order_number,
account_number,
date_entered
from
work_orders
where
date_entered >= sysdate - (15 + 31) -- Use the index to limit the number of rows scanned
and
wo_status not in ('Cancelled')
and
wo_type = 'Trouble Call'
)
select
account_number,
work_order_number,
date_entered
from
trouble_calls wo
where
wo.icoms_date >= sysdate - 15
and
(
select
count(*)
from
trouble_calls repeat
where
wo.account_number = repeat.account_number
and
wo.work_order_number <> repeat.work_order_number
and
wo.date_entered - repeat.date_entered between 0 and 30
) >= 1
J'ai rencontré des problèmes similaires avec SQL Server mais aucune résolution satisfaisante. Si vous pouvez exécuter une trace de paquet ou une trace d'application pour comparer les deux requêtes, cela pourrait éclairer le sujet. – dsolimano