Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.7.174] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Имею следующий код (VS2012, C#):
SqlCommand command = new SqlCommand("", sqlConnection1); SqlDataReader reader; string[] array; // Некий массив, длина которого может достигать >10000 for (int i = 0; i < array.Length; i++) { command.CommandText = "SELECT [ID] FROM [Table] WHERE [Param] = '" + array[i] + "'"; reader = command.ExecuteReader(); if (reader.HasRows) { // ... // reader.Close(); } else { // ... // reader.Close(); } } БД - локальная формата *.mdf Таблица "Table" отсортирована по столбцу "Param" (индекс тоже по этому столбцу). При длине массива "array" больше 10000 всё подвисает... Можно ли оптимизировать код? P.S. command.ExecuteScalar() дает примерно тот же результат |
Сообщ.
#2
,
|
|
|
Некоторой оптимизацией будет перенос sql кода в хранимую процедуру.
Выполнение всех 10К запросов в один заход должно также ускорить код. Все запросы в один заход можно выполнить если елементы массива сджойнить (ето кривой подход): SELECT [ID] FROM [Table] WHERE [Param] IN ('''" + array[0].Replace("'","''") + "'',''" + atrray[1]].Replace("'","''") + "'',''" ... либо создать параметр типа xml, впихнуть в него все значения массива и передат' его в хранимую процедуру. |
Сообщ.
#3
,
|
|
|
Цитата MIF @ либо создать параметр типа xml, впихнуть в него все значения массива и передат' его в хранимую процедуру. MS SQL Server и SQL CE очень медленно работают с расбором xml. Проверено на практике. Врятли это ускорит процес. Можно сделать такой вариант как предложили вы. Но я бы вибирал пачками например по 1К записей. Так и дебажить проще. |
Сообщ.
#4
,
|
|
|
Цитата Craft @ Цитата MIF @ либо создать параметр типа xml, впихнуть в него все значения массива и передат' его в хранимую процедуру. MS SQL Server и SQL CE очень медленно работают с расбором xml. Проверено на практике. Врятли это ускорит процес. Можно сделать такой вариант как предложили вы. Но я бы вибирал пачками например по 1К записей. Так и дебажить проще. И каким образом это можно сделать? Я про выбор пачками. |
Сообщ.
#5
,
|
|
|
Цитата Craft @ Цитата (Craft @ Сегодня, 11:35) Цитата (MIF @ Сегодня, 09:09) либо создать параметр типа xml, впихнуть в него все значения массива и передат' его в хранимую процедуру. MS SQL Server и SQL CE очень медленно работают с расбором xml. Проверено на практике. Врятли это ускорит процес. Можно сделать такой вариант как предложили вы. Но я бы вибирал пачками например по 1К записей. Так и дебажить проще. И каким образом это можно сделать? Я про выбор пачками. Я думал можно попробовать указывать диапазон виборки через between. Но сейчас сомневаюсь будет ли это работать быстрее. Попробуйте тот вариант что подсказал вам MIF с хранимой процедурой. У вас сложная нагрузка на выборку данных. Може хранимка хоть немного поможет. |
Сообщ.
#6
,
|
|
|
Если мне не изменяет память, то SQL CE не поддерживает хранимые процедуры.
Добавлено string[] array; // Некий массив, длина которого может достигать >10000 Плохое решение, сожрет кучу памяти на хранение условий выборки. Не понятно, для чего хранить такие объемы статической информации? |
Сообщ.
#7
,
|
|
|
а может есть способ получить этот загадочный массив на стороне сервера БД и сделать просто подзапрос в условии фильтрации?
|
Сообщ.
#8
,
|
|
|
Цитата а может есть способ получить этот загадочный массив на стороне сервера БД и сделать просто подзапрос в условии фильтрации? У ТС локальная база. |
Сообщ.
#9
,
|
|
|
не вижу связи если предположим что Table и таблица из которой получено 10000 записей находятся в одной БД то всё классно будет работать на уровне БД, ведь никто не написал откуда взялось такое здоровенное количество параметров, вряд-ли через UI
|
Сообщ.
#10
,
|
|
|
Цитата если предположим что Table и таблица из которой получено 10000 записей находятся в одной БД то всё классно будет работать на уровне БД В таком случае, не понятно вообще зачем фетчить 10к строк в память... |
Сообщ.
#11
,
|
|
|
вот и я том - откуда то они взялись, может не проблема сервера БД что он как то плохо работает с таким адским скриптом, а в том что скрипт адский
|
Сообщ.
#12
,
|
|
|
Хм. Ну вот у меня 10000 параметров (массив array), значения которых определяются в момент выполнения.
Как по-другому добавить их значения в запрос выборки я не знаю. |
Сообщ.
#13
,
|
|
|
Ну а запрос с IN попробовал? Не работает?
|
Сообщ.
#14
,
|
|
|
Цитата MIF @ Ну а запрос с IN попробовал? Не работает? К сожалению, нет. |
Сообщ.
#15
,
|
|
|
cyt, извини за настойчивость, раскрой эту страшную тайну - по какой логике и откуда ты получаешь 10000 записей.
P.S: я просто не могу поверить что не из БД. |