powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблемы с MSHFlexGrid
14 сообщений из 14, страница 1 из 1
Проблемы с MSHFlexGrid
    #37244717
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Делаю программку в одной из форм использую MSHFlexGrid. Программа состоит из двух частей: 1) для удаленных клиентов, имеющая свою базу (хранилище mdb). 2) для центрального офиса (хранилище реализовано на mssql) и там и там MSHFlexGrid имеет источником данных recordset

Для клиентской части сделан запрос заполняющий MSHFlexGrid. вот в части для центрального офиса возниклb заминки
1) тот же самый запрос (сохраненный ввиде хранимки) отрабатывает в разы медленнее. С учетом наличия всего сотни записей успеваю досчитать до 10. На mdb хранилище открывается мгновенно. Пробовал и кодом и в хранимке делать, время выполнения одинаково.
2) проблема с отображением даты, при чем опять же на SQL хранилище. в этом же запросе (для mdb) с помощью команды FORMAT преобразую дату к тому виду, который мне нужен. С SQL этот номер не проходит. Я помню что на самом SQL было преобразование даты, вот только редко с sql базами общаюсь забыл :(

Запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
rst.Open "SELECT dbo.operations.id_oper, dbo.operations.m_type, dbo.message_type.short_mtype AS Òèï, dbo.operations.doc_number AS [Íîìåð äîêóìåíòà], " & _
                                "dbo.operations.doc_data, dbo.operations.[32_data_val] AS [Äàòà âàëþòèðîâàíèÿ], dbo.operations.[32_cur_code] AS [Êîä âàëþòû], " & _
                                "dbo.operations.[32_summ] AS Ñóììà, dbo.clients_u.full_name AS Êëèåíò, dbo.pokstat.status, dbo.pokstat.stat_comment AS Ñòàòóñ, dbo.operations.sys_time " & _
                             "FROM dbo.clients_u INNER JOIN " & _
                                    "dbo.pokstat INNER JOIN " & _
                                    "dbo.message_type INNER JOIN " & _
                                    "dbo.operations ON dbo.message_type.id_mt = dbo.operations.m_type ON dbo.pokstat.status = dbo.operations.status ON " & _
                                    "dbo.clients_u.id_cli = dbo.operations.[50_cli_code] " & _
                             "Where (dbo.operations.m_type = 1) And (dbo.operations.Status <> 8101) AND (doc_data >= " & dat_b & " and doc_data <= " & dat_e & ") AND dbo.pokstat.stat_comment ='" & id_s & "' " & _
                        "Union " & _
                             "SELECT operations.id_oper, operations.m_type, message_type.short_mtype AS [Òèï], operations.doc_number AS [Íîìåð äîêóìåíòà], dbo.operations.doc_data, " & _
                                    "operations.[32_data_val] AS [Äàòà âàëþòèðîâàíèÿ], operations.[32_cur_code] AS [Êîä âàëþòû], operations.[32_summ] AS [Ñóììà], " & _
                                    "[req_sw_58].[KOD_BANK] + [KOD_BRANCH] + ' ' + [NAME_SWIFT] AS [Êëèåíò], pokstat.status, pokstat.stat_comment AS [Ñòàòóñ], operations.sys_time " & _
                             "FROM pokstat INNER JOIN " & _
                                    "(req_sw_58 INNER JOIN " & _
                                    "(message_type INNER JOIN " & _
                                    "operations ON message_type.id_mt = operations.m_type) ON req_sw_58.ID = operations.[58_fin_org_benef]) ON " & _
                                    "pokstat.Status = operations.Status " & _
                            "Where (((operations.m_type) = 2) And (operations.Status <> 8101)) AND (doc_data >= " & dat_b & " and doc_data <= " & dat_e & ") AND dbo.pokstat.stat_comment ='" & id_s & "' ", Cn, adOpenStatic, adLockReadOnly
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244762
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_men1) тот же самый запрос (сохраненный ввиде хранимки) отрабатывает в разы медленнее.
Надо смотреть план запроса, добавлять индексы, оптимизировать план и т.п. Лучше это делать в ветке MSSQL.

Сотня записей ВО ВСЕХ используемых таблицах? Не верю в 10 секунд! Скорее всего, в какой-то из связанных таблиц записей много, а план построился неоптимально.
Время каждый раз одинаковое или разное? Может проблемы с блокировками если база интенсивно используется? попробуйте WITH (NOLOCK)

Alex_men2) проблема с отображением даты, при чем опять же на SQL хранилище. в этом же запросе (для mdb) с помощью команды FORMAT преобразую дату к тому виду, который мне нужен. С SQL этот номер не проходит. Я помню что на самом SQL было преобразование даты, вот только редко с sql базами общаюсь забыл :(
CONVERT
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244771
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, очень неплохо бы в INNER JOIN вынести условие объединения, а не отдаваться на волю WHERE. Вот где скорее всего проблема. Если объединить без условий три таблицы по 100 записей, то результатом объединения будет 1000000 записей. Они потом, конечно, отберутся с помощью where, но поначалу оптимизатор может сработать и не оптимально, особенно если нет нужных индексов. Так что в первую очередь прописывай условие объединения в where, потом остальное, но скорее всего это решит проблему.
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244799
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProНадо смотреть план запроса, добавлять индексы, оптимизировать план и т.п. Лучше это делать в ветке MSSQL.

Пойду там посмотрю.
Shocker.ProСотня записей ВО ВСЕХ используемых таблицах? Не верю в 10 секунд! Скорее всего, в какой-то из связанных таблиц записей много, а план построился неоптимально.

Да верно две таблицы имеют по 10000 записей
Shocker.ProВремя каждый раз одинаковое или разное? Может проблемы с блокировками если база интенсивно используется? попробуйте WITH (NOLOCK)

время всегда одинаковое. А база и прога еще на стадии разработки

Shocker.ProCONVERT
это имеется ввиду? но ведь это преобразование типов данных, а не формата отображения
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244810
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menПойду там посмотрю.
Начни с переписывания INNER
Alex_menДа верно две таблицы имеют по 10000 записей
Ну так, а ты их еще перемножаешь, вот и получается 100000000 записей только из двух таблиц
Alex_menвремя всегда одинаковое.
тогда не блокировки
Alex_menэто имеется ввиду? но ведь это преобразование типов данных, а не формата отображения
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
А хелп по Convert слабо почитать?
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244824
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProКстати, очень неплохо бы в INNER JOIN вынести условие объединения, а не отдаваться на волю WHERE. Вот где скорее всего проблема. Если объединить без условий три таблицы по 100 записей, то результатом объединения будет 1000000 записей. Они потом, конечно, отберутся с помощью where, но поначалу оптимизатор может сработать и не оптимально, особенно если нет нужных индексов. Так что в первую очередь прописывай условие объединения в where, потом остальное, но скорее всего это решит проблему.

К сожалению у меня маловато опыта, и я честно говоря не представляю как в иннер внести условие отбора записей. Использовать подзапросы и объединять уже их результат?
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244858
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menК сожалению у меня маловато опыта, и я честно говоря не представляю как в иннер внести условие отбора записей. Использовать подзапросы и объединять уже их результат?
а, блин, я не обратил внимания, что ON там все же, не сталкивался с таким синтаксисом

попробуй раскрыть скобки, правда теперь не уверен, что это поможет:
Код: plaintext
1.
2.
3.
"FROM pokstat" & _
                     " INNER JOIN req_sw_58 ON req_sw_58.ID = operations.58_fin_org_benef]" & _
                     " INNER JOIN message_type ON message_type.id_mt = operations.m_type" & _
                     " INNER JOIN operations ON pokstat.Status = operations.Status "

скорее всего дело в отсутствии индексов на полях, по которым идет объединение
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244873
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забавно, как только вставил преобразование CONVERT скорость выполнения возросла. Хотя по моему мнению должна была бы упасть, т.к. действий больше выполняется.

Ладушки будем ковырять запрос пока не оптимизируется. Если будут какие предложения Буду весьма благодарен.
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244887
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menЗабавно, как только вставил преобразование CONVERT скорость выполнения возросла. Хотя по моему мнению должна была бы упасть, т.к. действий больше выполняется.

Ладушки будем ковырять запрос пока не оптимизируется. Если будут какие предложения Буду весьма благодарен.

А куда ты его вставил-то?

Скорость выполнения зависит от того, какой план запроса составит оптимизатор. В 95% случаев он составляет его оптимально. Если ты чуть переделал запрос - оптимизатор мог составить другой план и скорость возрасти именно из-за этого, а не из-за самого CONVERT
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37244939
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProА куда ты его вставил-то?


Да в том то и дело, что на скорость повлиять не должно.
Вначале идет представление на SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT     dbo.operations.id_oper, dbo.operations.m_type, dbo.message_type.short_mtype AS Тип, dbo.operations.doc_number AS [Номер документа], 
                      dbo.operations.doc_data, dbo.operations.[32_data_val] AS [Дата валютирования], dbo.operations.[32_cur_code] AS [Код валюты], 
                      dbo.operations.[32_summ] AS Сумма, dbo.clients_u.full_name AS Клиент, dbo.pokstat.status, dbo.pokstat.stat_comment AS Статус, 
                      dbo.operations.sys_time
FROM         dbo.clients_u INNER JOIN
                      dbo.pokstat INNER JOIN
                      dbo.message_type INNER JOIN
                      dbo.operations ON dbo.message_type.id_mt = dbo.operations.m_type ON dbo.pokstat.status = dbo.operations.status ON 
                      dbo.clients_u.id_cli = dbo.operations.[50_cli_code]
WHERE     (dbo.operations.m_type =  1 ) AND (dbo.operations.status <>  8101 )
UNION
SELECT     operations.id_oper, operations.m_type, message_type.short_mtype AS [Тип], operations.doc_number AS [Номер документа], operations.doc_data, 
                      operations.[32_data_val] AS [Дата валютирования], operations.[32_cur_code] AS [Код валюты], operations.[32_summ] AS [Сумма], 
                      [req_sw_58].[KOD_BANK] + [KOD_BRANCH] + ' ' + [NAME_SWIFT] AS [Клиент], pokstat.status, pokstat.stat_comment AS [Статус], 
                      operations.sys_time
FROM         pokstat INNER JOIN
                      (req_sw_58 INNER JOIN
                      (message_type INNER JOIN
                      operations ON message_type.id_mt = operations.m_type) ON req_sw_58.ID = operations.[58_fin_org_benef]) ON 
                      pokstat.status = operations.status
WHERE     (((operations.m_type) =  2 ) AND (operations.status <>  8101 ))

а потом в коде выполняю запрос
Код: plaintext
1.
2.
rst.Open "SELECT  id_oper,[ТИП],[Номер документа],convert(nvarchar,doc_data,104) as [Дата документа],convert(nvarchar,[Дата валютирования],104) as [Дата валютир],[Код Валюты], " & _
                                "convert(money,[Сумма],0) as [Сумма],[Клиент],[Статус] FROM oper_all WHERE (doc_data >= " & dat_b & " and doc_data <= " & dat_e & ") AND [Статус] ='" & id_s & "' ", Cn, adOpenStatic, adLockReadOnly
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37245032
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menсохраненный ввиде хранимки
Alex_menВначале идет представление на SQL
это не одно и то же

когда ты делаешь запрос к представлению, план составлется заново для совокупности твоего запроса из ВБ+самого представления. То есть фактически ты используешь ПОДЗАПРОС.

Если сделать хранимку, план будет составлен заранее, его проще будет отладить, так что по возможности предлагаю перейти на хранимку.
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37245119
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо попробую
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37245150
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

На самом деле так сделано было ради универсальности. Т.е. запрос источник используется один (большой запрос) а к нему идет множество фильтрующих запросов. Т.е. Могу задавать фильтр в любом разрезе. С хранимками - надо делать много хранимок. Вот из этих соображений так и Делалость
...
Рейтинг: 0 / 0
Проблемы с MSHFlexGrid
    #37245298
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы

Проблема решена. При конвертации базы криво перенеслись индексы. Пересоздал индексы в SQL все летает.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблемы с MSHFlexGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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