Прямой SQL
Модераторы: m0p3e, edward_K, Модераторы
Re: Прямой SQL
Попробовал я эти параметры: с временной таблицей и то быстрее выходит.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Прямой SQL
Ну так выбирайте - либо использовать таблы юзеровской схемы, либ быстрее работать.
Я свою времянку делаюну а потом уже юзаю ее в запросе.
Я свою времянку делаю
Код: Выделить всё
sqlCreateTmpTable ( 'Table TEMPVIB ( WLIST:word, CREC:comp) with index (a1 = wlist+crec);', ctmNormal );
ww_Str:='insert into TEMPVIB (WLIST,CREC) values ('+string(ww_wlist)+', #comp('+string(ww_Item)+') )'
vliErrorCode:=sqlExecDirect(ww_str);
Re: Прямой SQL
Аналогично, но запись во времянку идёт больше 2 минут. В итоге ускорение запроса путём использования DSQL не заметно.edward_K писал(а):Я свою времянку делаю ... ну а потом уже юзаю ее в запросе.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Прямой SQL
И что же вы такое в нее пишите?
Вы можете ее залить и на DSQL запросом или построить один запрос с кучей строк на вставку.
Вы можете ее залить и на DSQL запросом или построить один запрос с кучей строк на вставку.
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
ну да...2минуту заполняет свой dsql-Pick - это нехило. Сколько же там помечено то изначально тыщ штук ?
может наоборот тогда запоминать в dsql_pick что не помечено ))
может наоборот тогда запоминать в dsql_pick что не помечено ))
Re: Прямой SQL
Думаю, максимально 50000. Теоретически, может быть и 80000, но вряд ли.Den писал(а):Сколько же там помечено то изначально тыщ штук ?
В смысле? SQLExecDirect('insert into pik(fpik) values (#comp('+string(pick.crec)+'))') - это ведь DSQL, и так долго выходит.edward_K писал(а):Вы можете ее залить и на DSQL запросом
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Прямой SQL
https://msdn.microsoft.com/ru-ru/librar ... 20%29.aspx
Ну и естественно без Direct делать - как обычный многострочный запрос. Не пробовал однако
Еще одна проблема может быть в обходе таблы для набивки.
Ну а еще нужно подумать как отказаться вообще от Pik - наверняка есть другие критерии для пометки, зачем вам сами организации(?) помечать? Добавьте несколько других фильтров, а пометку организаций оставьте на единичные потребности. В конце концов если пометка составляет 2/3 каталога то проще выбрать все, а потом уже отфильтровать(ну если только вы не группируете в запросе по чем то другом, чем организации).
Код: Выделить всё
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923');
Еще одна проблема может быть в обходе таблы для набивки.
Ну а еще нужно подумать как отказаться вообще от Pik - наверняка есть другие критерии для пометки, зачем вам сами организации(?) помечать? Добавьте несколько других фильтров, а пометку организаций оставьте на единичные потребности. В конце концов если пометка составляет 2/3 каталога то проще выбрать все, а потом уже отфильтровать(ну если только вы не группируете в запросе по чем то другом, чем организации).
Re: Прямой SQL
Хорошая идея с перечислением NREC'ов в запросе - правда, сразу все не вставляет, пришлось разбить на блоки по 1000 штук, но прирост производительности заметен.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Прямой SQL
поделитесь реализацией.
Чего то у меня запрос в галкедает 311, а сапорт такой
вообще не съедает.
Чего то у меня запрос в галке
Код: Выделить всё
insert into TEMPVIB (WLIST,CREC) values (1, #comp(281474976713583) )
, (1, #comp(281474976713584) )
Код: Выделить всё
SQL insert into pick (wList,crec) Values(1,1) ,(1,2);
Re: Прямой SQL
Код: Выделить всё
SQLFreeStr(query_handle);
SQLAddStr(query_handle, 'insert into pikizd(fizd)');
sqlAddStr(query_handle, 'select nrec from katmc where nrec in (#comp('+string(pick.crec)+')');
...
sqlAddStr(query_handle, ', #comp('+string(pick.crec)+')');
...
SQLAddStr(query_handle, ')');
SQLExecDirect(query_handle);
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
Значит нельзя больше одного Values(1,1) через запятую перечислять в dsql галактичекском ((
Дело может быть в том еще, что так разрешено в T-SQL майкрософта, а вот PL-SQL оракла так может недопустимо.
А галактика поддерживает тока совсестимые для всех платформа возможности.
Например, я также как то узнал опытным путем что нельзя в dsql при delete в секции from использовать join-ы, если хочешь написать условие более сложное из нескольких таблиц. Только where+subselect
Дело может быть в том еще, что так разрешено в T-SQL майкрософта, а вот PL-SQL оракла так может недопустимо.
А галактика поддерживает тока совсестимые для всех платформа возможности.
Например, я также как то узнал опытным путем что нельзя в dsql при delete в секции from использовать join-ы, если хочешь написать условие более сложное из нескольких таблиц. Только where+subselect
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Прямой SQL
1.У меня есть клиенты и на MSSQL и на оракле. Сам я все проверяю на MSSQL, но и у клиентов с оракл вроде проблем не возникало с Join
Проблема возникает. когда пытаешься ограничивать по связке полей comp = word(или string) - MS это съедает, а вот оракл нет - ему нужны поля одинакового типа.
Если для констант помогает #comp, то для полей в таблицах сие не прокатывает.
2.Насчет нескольких Value зарегил в ПИР - посмотрим, что скажут.
Проблема возникает. когда пытаешься ограничивать по связке полей comp = word(или string) - MS это съедает, а вот оракл нет - ему нужны поля одинакового типа.
Если для констант помогает #comp, то для полей в таблицах сие не прокатывает.
2.Насчет нескольких Value зарегил в ПИР - посмотрим, что скажут.
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
1. Проверь у себя на ms-скуле в саппорте
не съест такое простое предложение он.
Код: Выделить всё
sql delete
from katpodr inner join katpodr on grpodr.nrec=katpodr.cgrpodr
where grpodr.name='блаблабла'
;
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Прямой SQL
Ну такого синтаксиса и в справочнике по MSSQL нет, есть немножко другое, но оно для Transact-SQL( в inner join как минимум должен быть grpodr) и в сапорте не пашет, а вот выборка пашет без проблем. А грохнуть я могу и без DSQL - там не такие тяжелые запросы как правило.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Прямой SQL
Вот чего там посоветовали
В оракле другой синтаксис, например, несколько value нельзя перечислять...
Сейчас я советую склепать следующий запрос
insert into pick(wlist, crec)
select 1, #comp(1) from DUAL
union all select 1, #comp(2) from DUAL
union all select 1, #comp(23) from DUAL;
, который вполне ANSI-SQL и вполне эффективен, однако сложность в том, что вместо DUAL нужно подставить таблицу,
в которой ровно одна запись... если вы заполняете пустую таблицу, то можете сперва вставить 1 запись, а потом вот тот запрос
sql insert into pick(wlist, crec) values(1, #comp(4));
sql insert into pick(wlist, crec)
select 1, #comp(1) from pick
union all select 1, #comp(2) from pick
union all select 1, #comp(23) from pick;
только для таблицы pick это превратится в "from pick where SYS#UNREC = код_текущего_пользователя", что есть плохо, а вот для
временной таблицы DSQL это будет работать хорошо
P.S. поддержка DUAL есть в планах