SqlDataAdapter.Fill слишком медленный даже для одной записи - PullRequest
6 голосов
/ 04 января 2012

У меня есть таблица с primarykey в MS SQL 2005, которая содержит несколько сотен тысяч записей. Когда я запрашиваю запись в Management studio для записи, это происходит очень быстро, но когда я использую код ниже, чтобы найти его, это занимает много секунд. Я должен использовать набор данных, так как мне нужно обновить строку. Как я могу улучшить производительность?

objData . ProcName ="myProcName"
objData . CreateCommand()
objData . Parameters("@BName", SqlDbType. VarChar, 20, "MyBranch1")
SqlDataAdapter da = objData . createAdapter()
da . Fill(ds,"MyTable1")

Хотя код процедуры очень прост:

select * from MyTable1 Where BranchName = @BName

в этом наборе данных будут открыты 5 таблиц одинаково, поэтому общее время больше минуты

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Вы должны рассмотреть возможность использования datareader вместо набора данных и выполнить обновление вручную с помощью sqlcommand.

U также следует рассмотреть возможность ограничения количества извлекаемых записей путем возможного предоставления дополнительных критериев

1 голос
/ 19 декабря 2012

Я видел очень похожее поведение задержки с использованием SQLDataAdapter, который возвращал ответ в течение многих секунд, по сравнению с выполнением точно такой же процедуры в SQL Server Mgmt Studio (на том же клиентском компьютере), который мгновенно возвращал ответ.

Я перестроил индексы для затронутых таблиц, и ответ от SQLDataAdapter был мгновенным.

Я никогда не видел такого поведения задержки с SQLDataReader. Я часто использую SQLDataReader и просто делаю MyTable.Load (MySQLDataReader). Кажется, у него меньше накладных расходов, чем у SQLDataAdapter.

...