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

Делаю программку в одной из форм использую 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
04.05.2011, 09:43
    #37244762
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с MSHFlexGrid
Alex_men1) тот же самый запрос (сохраненный ввиде хранимки) отрабатывает в разы медленнее.
Надо смотреть план запроса, добавлять индексы, оптимизировать план и т.п. Лучше это делать в ветке MSSQL.

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

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

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

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

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

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

К сожалению у меня маловато опыта, и я честно говоря не представляю как в иннер внести условие отбора записей. Использовать подзапросы и объединять уже их результат?
...
Рейтинг: 0 / 0
04.05.2011, 10:27
    #37244858
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с MSHFlexGrid
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
04.05.2011, 10:36
    #37244873
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с MSHFlexGrid
Забавно, как только вставил преобразование CONVERT скорость выполнения возросла. Хотя по моему мнению должна была бы упасть, т.к. действий больше выполняется.

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

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

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

Скорость выполнения зависит от того, какой план запроса составит оптимизатор. В 95% случаев он составляет его оптимально. Если ты чуть переделал запрос - оптимизатор мог составить другой план и скорость возрасти именно из-за этого, а не из-за самого CONVERT
...
Рейтинг: 0 / 0
04.05.2011, 11:02
    #37244939
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с MSHFlexGrid
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
04.05.2011, 11:44
    #37245032
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с MSHFlexGrid
Alex_menсохраненный ввиде хранимки
Alex_menВначале идет представление на SQL
это не одно и то же

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

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

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

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


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