powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорение работы запросов
25 сообщений из 37, страница 1 из 2
Ускорение работы запросов
    #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
Ускорение работы запросов
    #36409046
.Михаил.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрощатель
в сутки нужно выполнять этот запрос около 40 тыс раз и более соответственно с разными критериями.
В сутках 86400 секунд, обработка одного запроса примерно за 2 секунды. Даа...
Вопрощатель
У меня он выполняется от 1,6 сек до 5,4 сек. (конфа обычная, XP, core2duo 2,2*2, 1гиг) база локальная
Выполняется за это время запрос? или запрос+обработка запроса?
Если второе, попробуйте оптимизировать обработку запроса.
Или (если реализуемо для БД) несколько запросов объедините в один, а потом результат запроса разделите на части для обработки.
Попробуйте "убить" лишние процессы в системе.
...
Рейтинг: 0 / 0
Ускорение работы запросов
    #36409052
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структуру таблицы и индексов в студию.

А вообще-то это чисто вопрос для раздела "Использование СУБД", скорее всего для ветки MSAccess, так как там нет отдельной ветки по JET, потому что оптимизировать на стороне VB тут нечего. Отдайте им
а) структуру таблицы
б) структуру индексов
в) запрос в чистом виде (собранный)
Возможно будут предложения по оптимизаци выборки.
...
Рейтинг: 0 / 0
Ускорение работы запросов
    #36409085
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не пробовали StrSQL сразу задать одним выражением?
...
Рейтинг: 0 / 0
Ускорение работы запросов
    #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
Ускорение работы запросов
    #36409140
.Михаил.
Выполняется за это время запрос? или запрос+обработка запроса?
Если второе, попробуйте оптимизировать обработку запроса.
Или (если реализуемо для БД) несколько запросов объедините в один, а потом результат запроса разделите на части для обработки.
Попробуйте "убить" лишние процессы в системе.

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

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

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

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

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




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

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

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

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


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

White Owl

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Уже таблица. Поначалу было представление, (в смысле вьюха/запрос) но она вообще надолго уходила в даун. Сейчас это таблица, поэтому она такая широкая.
...
Рейтинг: 0 / 0
Ускорение работы запросов
    #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
Ускорение работы запросов
    #36409392
ВопрощательAntonariyСначала раскройте маленькую тайну, [2-1 итоговый рейтинг] это таблица или представление?

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

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

Уже таблица. Поначалу было представление, (в смысле вьюха/запрос) но она вообще надолго уходила в даун. Сейчас это таблица, поэтому она такая широкая.Тогда заодно нужно сделать индекс по всем полям, участвующим в where. Или по отдельному индексу на каждое поле, не знаю, что лучше будет.
...
Рейтинг: 0 / 0
Ускорение работы запросов
    #36409403
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрощательне закончил мысль. В смысле потом джоинить 1,5 млн записей с расшифровкой ключевых полей довольно долго.Джойнить к чему, почему и когда "потом" и что значит "расшифровка"?
...
Рейтинг: 0 / 0
Ускорение работы запросов
    #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
25 сообщений из 37, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорение работы запросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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