Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.111.183] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Сабж.
В данный момент база достаточно тормознутая. Но таких нужных вещей как fulltextsearch или хотя бы index я не наблюдаю... Я базу редактирую в самам КПК (изврат, не правда ли? но на компе у вижлстудии редактор sdf баз слетел напрочь). Что может помочь оптимизировать базу? Запросы нормальные. |
Сообщ.
#2
,
|
|
|
В общем, база - .sdf
Подключается так: String ds = "Data Source="; ds = ds + "\""; ds = ds + filename;//application folder ds = ds + "\\base\\basefile.sdf"; ds = ds + "\""; ds=ds+"; password='megapassword=)'"; Connection = new SqlCeConnection(ds); Connection.Open(); Запрос делается так: SqlCeDataReader rdr = null; try { listBox1.Items.Clear(); SqlCeCommand cmd = new SqlCeCommand("Select name from basetable1 where name like '%abc%'", Connection); rdr = cmd.ExecuteReader(); while (rdr.Read()) { listBox1.Items.Add(rdr.GetString(0)); ogr++; if (ogr > 100) break; } } finally { rdr.Close(); } Запрос долгий. Индексации в sdf не нашел, fulltextsearch тоже. Каким нибудь другим образом ускорить можно? |
Сообщ.
#3
,
|
|
|
SqlCeCommand cmd = new SqlCeCommand("Select TOP 100 name from basetable1 where name like '%abc%'", Connection); rdr = cmd.ExecuteReader(); while (rdr.Read()) { listBox1.Items.Add(rdr.GetString(0)); |
Сообщ.
#4
,
|
|
|
Проблема обнаружена.
SQL запрос следующего типа: String sql = "Select column1 from tab1,tab2,tab3 where (tab1.col1=tab2.column1) and (tab2.column1=tab3.col1) and (tab3.val=tab1.val)"; Код обработки: reader = command.ExecuteReader(); // тут со временим все ок listBox1.Items.Clear(); listBox1.BeginUpdate(); while (reader.Read()) { listBox1.Items.Add(reader.GetString(0)); } listBox1.EndUpdate(); // эта часть берет на себя бОльшую часть времени Может, можно как-нибудь в таблицу считывать а не построчно? Тогда, авось, быстрее будет -Added Цитата MIF @ SqlCeCommand cmd = new SqlCeCommand("Select TOP 100 name from basetable1 where name like '%abc%'", Connection); rdr = cmd.ExecuteReader(); while (rdr.Read()) { listBox1.Items.Add(rdr.GetString(0)); Это понятно. Но для 10 записей 3 секунды на цикл описанный мною выше - это слишком круто. Сама же команда выполняется моментально. На сотню ограничение есть. Можно ли получить доступ ко всему результату? Ко всем rows результата сразу по, например, индексам |
Сообщ.
#5
,
|
|
|
Цитата Slukad @ Да, с использованием SqlCeDataAdapter и DataTable (или DataSet). Можно ли получить доступ ко всему результату? Ко всем rows результата сразу по, например, индексам |
Сообщ.
#6
,
|
|
|
А это может повысить скорость работы БД ?
|
Сообщ.
#7
,
|
|
|
Скорее всего, нет.
|
Сообщ.
#8
,
|
|
|
Ладно, еще какие-нибудь способы ускорения работы БД есть?
|
Сообщ.
#9
,
|
|
|
Цитата Slukad @ Ладно, еще какие-нибудь способы ускорения работы БД есть? Оформи свой запрос хранимой процедурой. |
Сообщ.
#10
,
|
|
|
Цитата Slukad @ что тебя привязывает к данной БД. Мож, ее сменить можно? Ладно, еще какие-нибудь способы ускорения работы БД есть? |
Сообщ.
#11
,
|
|
|
Juice, как?
MIF, очень сильно привязывает |
Сообщ.
#12
,
|
|
|
Возьми создай в БД хранимую процедуру.
Пишу по памяти так что не обессудь CREATE PROCEDURE FindNames @name varchar(128) AS BEGIN SELECT [Name] from basetable1 where [Name] like '%@name%'; END Тогда вызывать все это дело ты сможешь так: SqlCeCommand cmd = new SqlCeCommand("FindNames", Connection); cmd.CommandType = CommandType.StoredProcedure; cmd.Parammeters.AddWithValue("@name", "abc"); SqlCeDataReader reader = cmd.ExecuteReader(); |
Сообщ.
#13
,
|
|
|
Видимо нельзя будет хранимку создать это ведь у тебя Compact Edition, а в нем нет хранимых процедур.
|
Сообщ.
#14
,
|
|
|
У меня вообще начинает складываться впечатление, что SQL CE такая жопа...
|
Сообщ.
#15
,
|
|
|
Короче, анализ сделал. Сижу в ауте.
DateTime d3 = DateTime.Now; command = new SqlCeCommand(s, Connection); reader = command.ExecuteReader(); DateTime d4 = DateTime.Now; String sss = ""; while (true) { DateTime opus = DateTime.Now; if (reader.Read()) { DateTime opusdei = DateTime.Now; TimeSpan tt = opusdei.Subtract(opus); sss = sss + "\n time " + tt.ToString(); listBox1.Items.Add(reader.GetString(0)); } else { break; } } DateTime d5 = DateTime.Now; TimeSpan t3 = d4.Subtract(d3); TimeSpan t4 = d5.Subtract(d4); TimeSpan t5 = d5.Subtract(d3); String sh = "Time spanning\n" + "\nExecuting: " + t3.ToString() + "\nFilling: " + t4.ToString() + "\nOvA: " + t5.ToString(); log.WriteLine(sh); log.WriteLine(sss); MessageBox.Show(sss); В логе строки: Общая статистика: Executing - 1c Filling - 34 c Jverall - 35 c. Ага, думаю. Фигня. Результатов вывелось всего два!!! (их столько в базе и было). Смотрю временные границы вывода результатов: time 19c time 5c Первый результ reader.Read() выполнялся 19 сек, второй - 5. И это не 34... Делаю с тем же sql запросом. Изменяю только слово поиска. КОличество найденного - около сотни. Executing - 1 Filling - 34. Временные границы: time 1 time 0 time 1 time 2 и т.д. В чем фишка не могу понять? |