Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорение работы запросов / 25 сообщений из 37, страница 1 из 2
14.01.2010, 10:18
    #36408972
Ускорение работы запросов
Есть некая база на аксессе содержащая большую таблицу и несколько мелких

Размер таблицы 36 столбцов
Строк от 300 000 до 1 500 000

Генерации этой таблицы предшествует очень долгая прелюдия поэтому в принципе на генерацию можно потратить сколь угодно времени, дальше поясню к чему это.

Далее из Excel VBA формирует через дао запрос
код примерно такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Set db = DAO.OpenDatabase(Cells(X, Y -  1 ), , yes)
 SQlcrit = " HAVING ((([2-1 итоговый рейтинг].Дата)=#" & dat & "#)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].GR20)=""" & gr20 & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].GR21)=""" & gr21 & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].GR22)=""" & gr22 & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].[Код])=""" & kod & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].WHS_ID)=""" & whskod & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].CORP_REGION)=""" & reg & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].BRANCH)=""" & fil & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].CITY)=""" & cit & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].DISTRIB_CENTRE)=""" & DC & """));"

'ВХОДНОЙ------------------------------------------------------------------------------------------------------------------------
 StrSQL = "SELECT [2-1 итоговый рейтинг].[ID_Group] AS GroupID, [2-1 итоговый рейтинг].CODE,_
 [2-1 итоговый рейтинг].[Итоговый рейтинг], [2-1 итоговый рейтинг].Поставщик,_
 [2-1 итоговый рейтинг].[Код] AS StoreID"
 StrSQL = StrSQL & " FROM [2-1 итоговый рейтинг]"
 StrSQL = StrSQL & " GROUP BY [2-1 итоговый рейтинг].[ID_Group], [2-1 итоговый рейтинг].CODE,_
 [2-1 итоговый рейтинг].[Итоговый рейтинг], [2-1 итоговый рейтинг].Поставщик,_
 [2-1 итоговый рейтинг].Дата, [2-1 итоговый рейтинг].GR20, [2-1 итоговый рейтинг].GR21,_
 [2-1 итоговый рейтинг].GR22, [2-1 итоговый рейтинг].[Код], [2-1 итоговый рейтинг].WHS_ID,_
 [2-1 итоговый рейтинг].CORP_REGION, [2-1 итоговый рейтинг].BRANCH, [2-1 итоговый рейтинг].CITY,_
 [2-1 итоговый рейтинг].DISTRIB_CENTRE"

 
 StrSQL = StrSQL & SQlcrit
 
 Set rs = db.OpenRecordset(StrSQL)

дальше работаю с рекордсетом

в общем нужно существенно увеличить скорость выполнения такого запроса. У меня он выполняется от 1,6 сек до 5,4 сек. (конфа обычная, XP, core2duo 2,2*2, 1гиг) база локальная

в сутки нужно выполнять этот запрос около 40 тыс раз и более соответственно с разными критериями. В сутки выполнение не укладывается.

Думал над вариантом создавать в прелюдии (как я говорил её продолжительность не имеет значения) 40 тыс текстовиков в папку где каждый файлик это результат выполнения запроса по критерию и читать их с винта. Но чую не та степь.

Гуглить не помогает все статьи которые удалось найти не могут дать ответ на этот вопрос "Как ускорить"
...
Рейтинг: 0 / 0
14.01.2010, 10:39
    #36409046
.Михаил.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Вопрощатель
в сутки нужно выполнять этот запрос около 40 тыс раз и более соответственно с разными критериями.
В сутках 86400 секунд, обработка одного запроса примерно за 2 секунды. Даа...
Вопрощатель
У меня он выполняется от 1,6 сек до 5,4 сек. (конфа обычная, XP, core2duo 2,2*2, 1гиг) база локальная
Выполняется за это время запрос? или запрос+обработка запроса?
Если второе, попробуйте оптимизировать обработку запроса.
Или (если реализуемо для БД) несколько запросов объедините в один, а потом результат запроса разделите на части для обработки.
Попробуйте "убить" лишние процессы в системе.
...
Рейтинг: 0 / 0
14.01.2010, 10:40
    #36409052
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Структуру таблицы и индексов в студию.

А вообще-то это чисто вопрос для раздела "Использование СУБД", скорее всего для ветки MSAccess, так как там нет отдельной ветки по JET, потому что оптимизировать на стороне VB тут нечего. Отдайте им
а) структуру таблицы
б) структуру индексов
в) запрос в чистом виде (собранный)
Возможно будут предложения по оптимизаци выборки.
...
Рейтинг: 0 / 0
14.01.2010, 10:47
    #36409085
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Не пробовали StrSQL сразу задать одним выражением?
...
Рейтинг: 0 / 0
14.01.2010, 10:49
    #36409096
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
> Автор: Вопрощатель

А почему DAO а не ADO?
Почему не используются параметры?
Пример из МСДН для параметризированных запросов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Function NewParameterQuery(dteStart As Date, dteEnd As Date) As Boolean
	Dim dbs As Database, qdf As QueryDef, rst As Recordset
	Dim strSQL As String

	On Error Resume Next
	' Return reference to current database.
	Set dbs = CurrentDb
	' Construct SQL string.
	strSQL = "PARAMETERS [Beginning OrderDate] DateTime, " _
		& "[Ending OrderDate] DateTime; SELECT * FROM Orders " & _
		"WHERE (OrderDate Between [Beginning OrderDate] " _
		& "And [Ending OrderDate]);"

	' Delete query if it already exists.
	dbs.QueryDefs.Delete "ParameterQuery"

	On Error GoTo Err_NewParameterQuery
	' Create new QueryDef object.
	Set qdf = dbs.CreateQueryDef("ParameterQuery", strSQL)

	' Supply values for parameters.
	If dteStart > dteEnd Then
		MsgBox "Start date is later than end date."
		Exit Function
	End If
	qdf.Parameters("Beginning OrderDate") = dteStart
	qdf.Parameters("Ending OrderDate") = dteEnd

	' Open recordset on QueryDef object.
	Set rst = qdf.OpenRecordset
	rst.MoveLast
	MsgBox "Query returned " & rst.RecordCount & " records."
	NewParameterQuery = True

Exit_NewParameterQuery:
	rst.Close
	Set dbs = Nothing
	Exit Function

Err_NewParameterQuery:
	MsgBox "Error " & Err & ": " & Err.Description
	NewParameterQuery = False
	Resume Exit_NewParameterQuery
End Function


You can call this function from the Debug window as follows:

? NewParameterQuery(# 6 - 30 - 95 #, # 6 - 30 - 96 #)
Как обстоят дела с индексацией данных?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.01.2010, 10:59
    #36409140
Ускорение работы запросов
.Михаил.
Выполняется за это время запрос? или запрос+обработка запроса?
Если второе, попробуйте оптимизировать обработку запроса.
Или (если реализуемо для БД) несколько запросов объедините в один, а потом результат запроса разделите на части для обработки.
Попробуйте "убить" лишние процессы в системе.

без обработки, только запрос
лишних процессов нет
...
Рейтинг: 0 / 0
14.01.2010, 11:32
    #36409244
Ускорение работы запросов
Shocker.ProСтруктуру таблицы и индексов в студию.

А вообще-то это чисто вопрос для раздела "Использование СУБД", скорее всего для ветки MSAccess, так как там нет отдельной ветки по JET, потому что оптимизировать на стороне VB тут нечего. Отдайте им
а) структуру таблицы
б) структуру индексов
в) запрос в чистом виде (собранный)
Возможно будут предложения по оптимизаци выборки.

спасибо
я думаю что и на стороне JET тоже мало, что можно оптимизировать
я думал подойти к вопросу иначе или подойти иначе к параметрам отчета
...
Рейтинг: 0 / 0
14.01.2010, 11:33
    #36409246
Ускорение работы запросов
Hugo121,

а на что это повлияет?
...
Рейтинг: 0 / 0
14.01.2010, 11:40
    #36409277
Ускорение работы запросов
Игорь Горбонос
> Автор: Вопрощатель

А почему DAO а не ADO?
Почему не используются параметры?
Как обстоят дела с индексацией данных?




В вопросах общения с Access я не специалист.
Чем АДО привлекательнее?

Под индексацией понимается ключ данных,. т.е. речь о сокращении размера таблицы созданием доп. индексов объединяющих ключи??

Ну у меня в таблице есть признак дерева товаров Gr20, GR21, Gr22 - 3 столбца которые можно сократить до 1 индекса и создать ссылку в другой таблице а потом ссылаться на этот ключ. Но это 2 запроса. 1 выборка , 2 join. Даст ли это существенный прирост?
...
Рейтинг: 0 / 0
14.01.2010, 11:49
    #36409311
Ускорение работы запросов
Игорь Горбонос
> Автор: Вопрощатель

А почему DAO а не ADO?
Почему не используются параметры?


в соседней ветке

White Owl

Параметры нужны только при использовании повторяющихся запросов. В этом случае можно подготовить запрос, создать для него набор параметров а потом изменяя параметры запускать. По идее это будет работать быстрее чем запуск отдельных похожих запросов на каждый из которых сервер базы данных должен будет запускать парсер sql команды (подготавливать то есть).

разве в моем случае парсер запускается? У меня же локальная СУБД. Или это не имеет значения?
...
Рейтинг: 0 / 0
14.01.2010, 11:51
    #36409323
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Не знаю, как другие, а я вот не нашел в полях селекта групповых операциий, которые требовали бы Group by. Как минимум можно было бы избавиться от Group by и вместо having сделать where.

Jah loves you.
...
Рейтинг: 0 / 0
14.01.2010, 11:54
    #36409332
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Вопрощательразве в моем случаеВ любом случае выйгрыш от этого ничтожен по сравнению с временем выполнения любого запроса. Параметры используют для удобства, а не облегчения жизни парсеру.

Jah loves you.
...
Рейтинг: 0 / 0
14.01.2010, 11:55
    #36409335
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Antonariy,
*BRAVO*

и действительно, в HAVING нет групповых операций, все условия в WHERE будут, наверное работать быстрее, а вмето в GROUP BY можно использовать DISTINCTROW, если там действительно повторяющиеся строки
...
Рейтинг: 0 / 0
14.01.2010, 11:56
    #36409339
Ускорение работы запросов
AntonariyНе знаю, как другие, а я вот не нашел в полях селекта групповых операциий, которые требовали бы Group by. Как минимум можно было бы избавиться от Group by и вместо having сделать where.


заготовку для запроса я составлял по SQL интерпретации Access. Поэтому незнаю нужен group by или нет. Сейчас попробую заменить указанные Вами записи и сделать пару прогонов.
...
Рейтинг: 0 / 0
14.01.2010, 12:00
    #36409355
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
ВопрощательПод индексацией понимается ключ данных,. т.е. речь о сокращении размера таблицы созданием доп. индексов объединяющих ключи??

Ну у меня в таблице есть признак дерева товаров Gr20, GR21, Gr22 - 3 столбца которые можно сократить до 1 индекса и создать ссылку в другой таблице а потом ссылаться на этот ключ. Но это 2 запроса. 1 выборка , 2 join. Даст ли это существенный прирост?

Нет, речь не о том, то, что вы описали, называется нормализацией.

Что касается индексации - на все поля, которые идут в условиях отбора, необходимо создать индексы (для полей группировки тоже, но, надеюсь, вы откажетесь от группировки и перенесете их в WHERE). Индексы увеличат, а не уменьшат размер базы, замедлят запись, зато при таком размере таблицы - на порядки ускорят выборку.
...
Рейтинг: 0 / 0
14.01.2010, 12:04
    #36409371
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Вопрощатель
я думаю что и на стороне JET тоже мало, что можно оптимизировать

Вот это вы зря. Правда, пока нет структуры таблицы и индексов, обсуждать это бессмысленно.

Вопрощателья думал подойти к вопросу иначе или подойти иначе к параметрам отчета

Возможно, но по формированию отчета вы не дали вообще никаких данных, поэтому тоже помочь не можем пока.
...
Рейтинг: 0 / 0
14.01.2010, 12:05
    #36409372
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Кстати, насчет DAO и ADO, в принципе DAO предпочтительней, с аксессом оно работает быстрее, хотя у вас не тот случай, когда это будет сильно заметно.

Jah loves you.
...
Рейтинг: 0 / 0
14.01.2010, 12:06
    #36409377
Ускорение работы запросов
Shocker.ProВопрощательПод индексацией понимается ключ данных,. т.е. речь о сокращении размера таблицы созданием доп. индексов объединяющих ключи??

Ну у меня в таблице есть признак дерева товаров Gr20, GR21, Gr22 - 3 столбца которые можно сократить до 1 индекса и создать ссылку в другой таблице а потом ссылаться на этот ключ. Но это 2 запроса. 1 выборка , 2 join. Даст ли это существенный прирост?

Нет, речь не о том, то, что вы описали, называется нормализацией.

Что касается индексации - на все поля, которые идут в условиях отбора, необходимо создать индексы (для полей группировки тоже, но, надеюсь, вы откажетесь от группировки и перенесете их в WHERE). Индексы увеличат, а не уменьшат размер базы, замедлят запись, зато при таком размере таблицы - на порядки ускорят выборку.

Нашел хелп по индексам
но я так понял за 5 минут не раскурю
Сначала попробую Ваши варианты с заменой where
...
Рейтинг: 0 / 0
14.01.2010, 12:08
    #36409383
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Сначала раскройте маленькую тайну, [2-1 итоговый рейтинг] это таблица или представление?

Jah loves you.
...
Рейтинг: 0 / 0
14.01.2010, 12:10
    #36409388
Ускорение работы запросов
AntonariyСначала раскройте маленькую тайну, [2-1 итоговый рейтинг] это таблица или представление?

Уже таблица. Поначалу было представление, (в смысле вьюха/запрос) но она вообще надолго уходила в даун. Сейчас это таблица, поэтому она такая широкая.
...
Рейтинг: 0 / 0
14.01.2010, 12:10
    #36409390
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
ВопрощательСначала попробую
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQlcrit = " WHERE ((([2-1 итоговый рейтинг].Дата)=#" & dat & "#)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].GR20)=""" & gr20 & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].GR21)=""" & gr21 & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].GR22)=""" & gr22 & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].[Код])=""" & kod & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].WHS_ID)=""" & whskod & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].CORP_REGION)=""" & reg & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].BRANCH)=""" & fil & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].CITY)=""" & cit & """)"
 SQlcrit = SQlcrit & " AND (([2-1 итоговый рейтинг].DISTRIB_CENTRE)=""" & DC & """));"

'ВХОДНОЙ------------------------------------------------------------------------------------------------------------------------
 StrSQL = "SELECT [2-1 итоговый рейтинг].[ID_Group] AS GroupID, [2-1 итоговый рейтинг].CODE,_
 [2-1 итоговый рейтинг].[Итоговый рейтинг], [2-1 итоговый рейтинг].Поставщик,_
 [2-1 итоговый рейтинг].[Код] AS StoreID"
 StrSQL = StrSQL & " FROM [2-1 итоговый рейтинг]"
 StrSQL = StrSQL & SQlcrit
...
Рейтинг: 0 / 0
14.01.2010, 12:11
    #36409392
Ускорение работы запросов
ВопрощательAntonariyСначала раскройте маленькую тайну, [2-1 итоговый рейтинг] это таблица или представление?

Уже таблица. Поначалу было представление, (в смысле вьюха/запрос) но она вообще надолго уходила в даун. Сейчас это таблица, поэтому она такая широкая.

не закончил мысль. В смысле потом джоинить 1,5 млн записей с расшифровкой ключевых полей довольно долго.
...
Рейтинг: 0 / 0
14.01.2010, 12:12
    #36409396
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
ВопрощательAntonariyСначала раскройте маленькую тайну, [2-1 итоговый рейтинг] это таблица или представление?

Уже таблица. Поначалу было представление, (в смысле вьюха/запрос) но она вообще надолго уходила в даун. Сейчас это таблица, поэтому она такая широкая.Тогда заодно нужно сделать индекс по всем полям, участвующим в where. Или по отдельному индексу на каждое поле, не знаю, что лучше будет.
...
Рейтинг: 0 / 0
14.01.2010, 12:14
    #36409403
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение работы запросов
Вопрощательне закончил мысль. В смысле потом джоинить 1,5 млн записей с расшифровкой ключевых полей довольно долго.Джойнить к чему, почему и когда "потом" и что значит "расшифровка"?
...
Рейтинг: 0 / 0
14.01.2010, 12:26
    #36409451
Ускорение работы запросов
Antonariy,

расшифровка я имею ввиду у меня есть товар (уникальный код) и есть его дерево
в принципе можно в готовую таблицу сохранить код товара.
А потом подтягивать дерево к конкретному условию.

В дереве товаров 300 тыс записей, в этой таблице 1,5. Делать джоин дольше чем при подготовке таблицы сразу засунуть туда все дерево.

А дерево далее нужно для использования.



а как использовать DISTINCTROW, вот так ругается

Код: plaintext
1.
2.
StrSQL = "SELECT [2-1 итоговый рейтинг].[ID_Group] AS GroupID, [2-1 итоговый рейтинг].CODE, [2-1 итоговый рейтинг].[Итоговый рейтинг], [2-1 итоговый рейтинг].Поставщик, [2-1 итоговый рейтинг].[Код] AS StoreID"
 StrSQL = StrSQL & " FROM [2-1 итоговый рейтинг]"
 StrSQL = StrSQL & " DISTINCTROW [2-1 итоговый рейтинг].[ID_Group], [2-1 итоговый рейтинг].CODE, [2-1 итоговый рейтинг].[Итоговый рейтинг], [2-1 итоговый рейтинг].Поставщик, [2-1 итоговый рейтинг].Дата, [2-1 итоговый рейтинг].GR20, [2-1 итоговый рейтинг].GR21, [2-1 итоговый рейтинг].GR22, [2-1 итоговый рейтинг].[Код], [2-1 итоговый рейтинг].WHS_ID, [2-1 итоговый рейтинг].CORP_REGION, [2-1 итоговый рейтинг].BRANCH, [2-1 итоговый рейтинг].CITY, [2-1 итоговый рейтинг].DISTRIB_CENTRE"
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорение работы запросов / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]