|
|
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Собственно, в чем проблема. На серваке расположена табличка, предположим миллион записей. Делаем CREATE SQL VIEW бла-бла-бла SHARED AS SELECT bla-bla-bla FROM Table WHERE Id = (?_lnId) В момент создания вьюхи, фокс, такое ощущение, начинает тягать с сервака всю табличку, потому что кушает просто гигазы памяти. Если есть джойны, то процесс кушаеть в разы больше. Складывается впечатление, что фокс кросджойнит перечисленные таблы и тащит их на клиента, а затем уже создает вьюшку. Никто не сталкивался с такой проблемой? Может что-то в религии у фокса правится или какой-нибудь обходной путь есть? Просто некоторые вьюшки уже не хотят апдейтиться. ;-/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 06:16 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
В момент создания view не открывается, а только текст запроса сохраняется в контейнер БД проверить просто: Код: plaintext 1. 2. А дальше смотри отладчиком где действительно тормозит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 07:41 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Dima TВ момент создания view не открывается, а только текст запроса сохраняется в контейнер БД проверить просто: Код: plaintext 1. 2. А дальше смотри отладчиком где действительно тормозит Мне тоже так казалось. Но лог ODBC говорит обратное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 08:15 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
дак у тебя все таки ODBC соединение с какимто из SQL серверов, или "табличка на серваке" это файл-сервер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 08:55 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Алексей Одак у тебя все таки ODBC соединение с какимто из SQL серверов, или "табличка на серваке" это файл-сервер? Да, извиняюсь - некорректно сформулировал. Все-таки: CREATE SQL VIEW "бла-бла-бла" REMOTE CONNECTION "бла" SHARED AS SELECT ... REMOTE цепляется через ODBC на PostgresSQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 09:04 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Все он правильно тягает - сколько запрос возвращает записей, столько сервер и передает Фоксу. По краней мере в MS SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 10:16 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
[quot Kruchinin Pahan]CREATE SQL VIEW "бла-бла-бла" REMOTE CONNECTION "бла" SHARED AS SELECT ... [quot] не силен в ODBC, но предположу что команда REMOTE CONNECTION "бла" CREATE SQL VIEW "бла-бла-бла" SHARED AS SELECT ... поможет кажется что предыдущая каманда только за выборками ходит на сервер а представление создает у себя, от этого и трафик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 10:18 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Алексей О[quot Kruchinin Pahan]CREATE SQL VIEW "бла-бла-бла" REMOTE CONNECTION "бла" SHARED AS SELECT ... [quot] не силен в ODBC, но предположу что команда REMOTE CONNECTION "бла" CREATE SQL VIEW "бла-бла-бла" SHARED AS SELECT ... поможет кажется что предыдущая каманда только за выборками ходит на сервер а представление создает у себя, от этого и трафик Или я чего-то не понял, или последняя команда по синтаксису не проходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 10:44 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
BurnВсе он правильно тягает - сколько запрос возвращает записей, столько сервер и передает Фоксу. По краней мере в MS SQL Запрос параметризированный по идее результатом запроса должно быть одна, десяток, сотня записей. Например, задаю ему вьюху в стиле: SELECT Lft.Fld1, Lft.Fld2, Rgt.Fld3 FROM Lft INNER JOIN Rgt ON Rgt.ParentKey = Lft.PrimaryKey WHERE Lft.PrimaryKey = ( ?Code_ ) Так как Lft.PrimaryKey - первичный ключ, теоретически должна возвращаться одна запись, а возвращается что-то типа: SELECT * FROM Lft ; SELECT * FROM Rgt ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 10:57 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Ну, если менеджер сервера запрос выполняет правильно значит надо искать описания особеностей ODBC драйвера под ваш сервер. Возможно имено он глючный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 11:56 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Kruchinin PahanДа, извиняюсь - некорректно сформулировал. Все-таки: CREATE SQL VIEW "бла-бла-бла" REMOTE CONNECTION "бла" SHARED AS SELECT ... REMOTE цепляется через ODBC на PostgresSQL. Повторяю: При выполнении CREATE SQL VIEW никаких обращений к базе не происходит обращение к базе идет по команде use бла-бла-бла или select ... from бла-бла-бла Код покажи как есть - всей процедуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 12:42 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Dima TПовторяю: При выполнении CREATE SQL VIEW никаких обращений к базе не происходит обращение к базе идет по команде use бла-бла-бла или select ... from бла-бла-бла Код покажи как есть - всей процедуры Создал тестовый пример на чистом вновь созданном контейнере. Получил следующее время выполнения: 112.316 0.021 Код: 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. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 14:16 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Dima T Повторяю: При выполнении CREATE SQL VIEW никаких обращений к базе не происходит обращение к базе идет по команде use бла-бла-бла или select ... from бла-бла-бла Более того, разгребаю логи ODBC: Сначала посылается такой запрос: [3948] Sending SELECT statement on stmt=86273576, cursor_name='SQL_CUR05246E28' [3948]send_query(): conn=86259984, query='SELECT Strstdoc.kod, Strstdoc.kodhddoc, Strstdoc.kodstdoc, Strstdoc.kodstcards, Strstdoc.kodstcarddt, Strstdoc.kodstcardkt, Strstdoc.kodmsc, Strstdoc.kodunitdim, Strstdoc.kodstcards1, Strstdoc.quantity, Strstdoc.price, Strstdoc.percntnds, Strstdoc.sumnds, Strstdoc.percntnsp, Strstdoc.sumnsp, Strstdoc.summa, strstdoc.sumtransp, strstdoc.sumndstransp, strstdoc.sumbrktara, strstdoc.sumcoursdlt, strstdoc.sumsumdlt, Strstdoc.quantitydoc, Strstdoc.isaddrecip, coalesce(Sprmsc.name,' ') AS namemsc, Strstdoc.kodtypetprov, Strstdoc.kodscores, Strstdoc.kodtprov, Strstdoc.datamove, Strstdoc.stage, strstdoc.note, strstdoc.kodmatoborot, strstdoc.quanwater, strstdoc.percntwater, strstdoc.quanfuz, strstdoc.percntfuz, strstdoc.koh, strstdoc.quannature, strstdoc.udostover, strstdoc.usefuldate , strstdoc.kodosf, strstdoc.koddefect, strstdoc.kodremont, strstdoc.strana, strstdoc.gtd, strstdoc.kodhddoc2, strstdoc.pasport, strstdoc.raschetSch, strstdoc.kapRemSch, strstdoc.summa_val, strstdoc.kodcompany, strstdoc.kodscoresDt, strstdoc.kodscoresKt, Strstdoc.price_rl, Strstdoc.summa_rl, Strstdoc.sumnds_rl, Strstdoc.kodarcosts, Strstdoc.summanach, Strstdoc.summadebt, Strstdoc.datainv, Strstdoc.isrepresent, Strstdoc.summadoc, Strstdoc.sumndsdoc FROM public.strstdoc LEFT OUTER JOIN public.sprmsc ON Strstdoc.kodmsc = Sprmsc.kod WHERE Strstdoc.KodHdDoc = NULL' Возвращаются типы данных для колонок: [3948]LIBPQ_execute_query: recent_processed_row_count = 0 [3948]CC_mapping: entering ... [3948]CC_mapping: rows = 0, columns = 62 [3948]CC_mapping: column = 0 [3948]CC_mapping: set field info: name = kod, typ = 23, typlen = 4, attypmod = -1 [3948]CC_mapping: column = 1 [3948]CC_mapping: set field info: name = kodhddoc, typ = 23, typlen = 4, attypmod = -1 и т.д. Далее происходит вот что: [3948]PGAPI_Execute: entering... [3948]PGAPI_Execute: clear errors... [3948]recycle statement: self= 188056672 [3948]PDATA_free_params: ENTER, self=188057104 [3948]Exec_with_parameters_resolved: copying statement params: trans_status=1, len=29, stmt='SELECT * FROM public.strstdoc' [3948] stmt_with_params = 'SELECT * FROM public.strstdoc' [3948] Sending SELECT statement on stmt=188056672, cursor_name='SQL_CUR0B358460' [3948]send_query(): conn=86259984, query='SELECT * FROM public.strstdoc' [3948]LIBPQ_execute_query: entering ... [3948]in QR_Constructor [3948]exit QR_Constructor Эта скотина хряпает целиком все данные из одной таблички, а затем из другой... И почесали: [3948]CC_mapping: fetch column = kod, value = 375453 [3948]CC_mapping: fetch column = kodhddoc, value = 460309 [3948]CC_mapping: fetch column = kodstdoc, value = NULL [3948]CC_mapping: fetch column = kodtypetprov, value = NULL [3948]CC_mapping: fetch column = kodtprov, value = NULL [3948]CC_mapping: fetch column = kodmsc, value = 9954 [3948]CC_mapping: fetch column = kodunitdim, value = 3 [3948]CC_mapping: fetch column = kodmatoborot, value = NULL [3948]CC_mapping: fetch column = isaddrecip, value = 0 [3948]CC_mapping: fetch column = kodscores, value = 10.50 Причем создание вьюшки это единственная ситуация когда из запроса выдергиваются FROM выражения и выдергивается все содержимое таблички. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 14:40 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Dima TПовторяю: При выполнении CREATE SQL VIEW никаких обращений к базе не происходит ...Тут я был не прав, в случае REMOTE VIEW запрос происходит. Kruchinin PahanWHERE Strstdoc.KodHdDoc = NULL Вот тут и собака порылась, любое значение при сравнении с NULL возвращает TRUE, соответственно твой запрос равносилен WHERE TRUE , и происходит выборка всех записей Надо проинициализировать code_ перед созданием представления: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 19:06 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Dima T Kruchinin PahanWHERE Strstdoc.KodHdDoc = NULL Вот тут и собака порылась, любое значение при сравнении с NULL возвращает TRUE, соответственно твой запрос равносилен WHERE TRUE , и происходит выборка всех записей Надо проинициализировать code_ перед созданием представления: Код: plaintext 1. 2. 3. Хмм... На PgSQL NULL ближе к False, чем к True. Иначе говоря должно вернуться 0 записей. Этот запрос так и возвращает 0 записей (по логам видно). Только какого-то хрена фокс после выполнения исходного запроса начинает дергать таблички по отдельности и целиком: [3948]send_query(): conn=86259984, query='SELECT * FROM public.strstdoc' Не ну неужели никто с этим не сталкивался? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2007, 05:51 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Какая разница, сколько времени Fox создает представление? Это же процесс, который, как правило, выполняется один раз в Design-Time. Поэтому, по большому счету, сугубо "фиолетово" сколько времени он на это потратит. Критичным является не время создания Remote View, а время его открытия. Т.е. реакция при работе в Run-Time. По сути, Ваш вопрос из цикла: а почему индексирование таблиц происходит так медленно? Да потому что! Скорее всего, разработчикам просто в голову не приходило оптимизировать этот процесс. Помнится, в младших версиях FoxPro (кажется до VFP5) при открытии параметризированных View в режиме NODATA тоже выкачивалась ВСЯ таблица на клиента и только потом отсекались все записи. В старших версиях FoxPro это исправили, а режим создания View, видимо, не стали поправлять. Если для Вас критично именно время создания, то, возможно, имеет смысл вместо RemoteView использовать объект CursorAdapter. Он был введен как раз в VFP8. CursorAdapter - это более развитый объект по сравнению с Remote View. Хотя, несколько сложнее в понимании. Dima Tлюбое значение при сравнении с NULL возвращает TRUE Значение NULL - это неизвестно какое значение. Поэтому, сравнение NULL с любым фиксированным значением по любым правилам всегда вернет NULL. Неизвестно что. Для логических операторов - это интерпретируется как False. Точнее, как условие, не соответствующее истине. Не истинное условие. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2007, 11:07 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
ВладимирМКакая разница, сколько времени Fox создает представление? Это же процесс, который, как правило, выполняется один раз в Design-Time. Поэтому, по большому счету, сугубо "фиолетово" сколько времени он на это потратит. Критичным является не время создания Remote View, а время его открытия. Т.е. реакция при работе в Run-Time. По сути, Ваш вопрос из цикла: а почему индексирование таблиц происходит так медленно? Да потому что! По сути, согласен. Но, когда объем возвращаемой информации превышает 2 гига для каждого из SELECT * FROM bla-bla, фокс просто трапается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2007, 12:53 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan Но, когда объем возвращаемой информации превышает 2 гига для каждого из SELECT * FROM bla-bla, фокс просто трапается. Это системное ограничение фокса, по сути SELECT * FROM bla-bla создает временную таблицу. Да и 2Г тянуть на клиента как-то не кашерно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2007, 09:24 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
PaulWist Kruchinin Pahan Но, когда объем возвращаемой информации превышает 2 гига для каждого из SELECT * FROM bla-bla, фокс просто трапается. Это системное ограничение фокса, по сути SELECT * FROM bla-bla создает временную таблицу. Да и 2Г тянуть на клиента как-то не кашерно. Я в курсе, что это системное ограничение. И в курсе, что тянуть 2Г некошерно. Вопрос, можно ли как-то уболтать фокс этого не делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2007, 10:37 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Kruchinin PahanЯ в курсе, что это системное ограничение. И в курсе, что тянуть 2Г некошерно. Вопрос, можно ли как-то уболтать фокс этого не делать? Можно. 1. Возвращать результат запроса в курсор меньше 2Г 1.1 Ограничивать сам запрос меньшим кол-вом записей 1.2 Если уж очень хочется, то тянуть порезанные куски меньше 2Г ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2007, 10:48 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Думаю надо поискать другой ODBC-драйвер попробовал на MS-SQL 2000: 0,3 сек Код: plaintext 1. 2. 3. 4. 5. 6. Сетка WiFi (1.5 Мб/сек) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2007, 14:04 |
|
||
|
CREATE SQL VIEW VFP8.0
|
|||
|---|---|---|---|
|
#18+
Похожие запросы к логе odbc есть: CREATE VIEWvfp9 abc-a40 ENTER SQLPrepare HSTMT 01C61D90 UCHAR * 0x019EF630 [ -3] "SELECT * FROM _Document7 left outer join _Document7_VT64 on _Document7._Fld39 = _Document7_VT64._Fld67 WHERE _Document7._Number = ?\ 0" SDWORD -3 ... vfp9 abc-a40 ENTER SQLPrepare HSTMT 01C62A70 UCHAR * 0x019F03E8 [ -3] "SELECT * FROM _Document7\ 0" SDWORD -3 ... vfp9 abc-a40 EXIT SQLPrepare with return code 0 (SQL_SUCCESS) HSTMT 01C62A70 UCHAR * 0x019F03E8 [ -3] "SELECT * FROM _Document7\ 0" SDWORD -3 ... И открытие представления: USEvfp9 abc-a40 ENTER SQLExecDirect HSTMT 01C62A70 UCHAR * 0x00F52B38 [ -3] "SELECT * FROM _Document7 left outer join _Document7_VT64 on _Document7._Fld39 = _Document7_VT64._Fld67 WHERE _Document7._Number = ? \ 0" SDWORD -3 Я так понимаю SQLPrepare - проверяет синтаксис запроса и м.б. план выполнения составляется. а SQLExecDirect выполнение запроса и возврат результата. А вот кто решает SQLPrepare или SQLExecDirect, фокс или драйвер - это вопрос. если драйвер, то смена драйвера может помочь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2007, 14:52 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=34544337&tid=1589265]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 209ms |
| total: | 352ms |

| 0 / 0 |
