Страница 17 из 19

Re: Прямой SQL

Добавлено: 14 окт 2015, 09:46
RAJAH
Попробовал я эти параметры: с временной таблицей и то быстрее выходит. :(

Re: Прямой SQL

Добавлено: 14 окт 2015, 13:36
edward_K
Ну так выбирайте - либо использовать таблы юзеровской схемы, либ быстрее работать.
Я свою времянку делаю

Код: Выделить всё

  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

Добавлено: 14 окт 2015, 13:50
RAJAH
edward_K писал(а):Я свою времянку делаю ... ну а потом уже юзаю ее в запросе.
Аналогично, но запись во времянку идёт больше 2 минут. В итоге ускорение запроса путём использования DSQL не заметно.

Re: Прямой SQL

Добавлено: 14 окт 2015, 17:21
edward_K
И что же вы такое в нее пишите?
Вы можете ее залить и на DSQL запросом или построить один запрос с кучей строк на вставку.

Re: Прямой SQL

Добавлено: 14 окт 2015, 17:33
Den
ну да...2минуту заполняет свой dsql-Pick - это нехило. Сколько же там помечено то изначально тыщ штук ?
может наоборот тогда запоминать в dsql_pick что не помечено ))

Re: Прямой SQL

Добавлено: 15 окт 2015, 08:19
RAJAH
Den писал(а):Сколько же там помечено то изначально тыщ штук ?
Думаю, максимально 50000. :-) Теоретически, может быть и 80000, но вряд ли.
edward_K писал(а):Вы можете ее залить и на DSQL запросом
В смысле? SQLExecDirect('insert into pik(fpik) values (#comp('+string(pick.crec)+'))') - это ведь DSQL, и так долго выходит.

Re: Прямой SQL

Добавлено: 15 окт 2015, 10:10
edward_K
https://msdn.microsoft.com/ru-ru/librar ... 20%29.aspx

Код: Выделить всё

INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923');
Ну и естественно без Direct делать - как обычный многострочный запрос. Не пробовал однако 8)
Еще одна проблема может быть в обходе таблы для набивки.
Ну а еще нужно подумать как отказаться вообще от Pik - наверняка есть другие критерии для пометки, зачем вам сами организации(?) помечать? Добавьте несколько других фильтров, а пометку организаций оставьте на единичные потребности. В конце концов если пометка составляет 2/3 каталога то проще выбрать все, а потом уже отфильтровать(ну если только вы не группируете в запросе по чем то другом, чем организации).

Re: Прямой SQL

Добавлено: 21 окт 2015, 09:02
RAJAH
Хорошая идея с перечислением NREC'ов в запросе - правда, сразу все не вставляет, пришлось разбить на блоки по 1000 штук, но прирост производительности заметен.

Re: Прямой SQL

Добавлено: 21 окт 2015, 11:55
edward_K
поделитесь реализацией.
Чего то у меня запрос в галке

Код: Выделить всё

insert into TEMPVIB (WLIST,CREC) values (1, #comp(281474976713583)   )
,   (1, #comp(281474976713584)   ) 
дает 311, а сапорт такой

Код: Выделить всё

SQL insert into pick (wList,crec) Values(1,1) ,(1,2);
вообще не съедает.

Re: Прямой SQL

Добавлено: 21 окт 2015, 12:08
RAJAH

Код: Выделить всё

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);

Re: Прямой SQL

Добавлено: 21 окт 2015, 13:46
Den
Значит нельзя больше одного Values(1,1) через запятую перечислять в dsql галактичекском ((
Дело может быть в том еще, что так разрешено в T-SQL майкрософта, а вот PL-SQL оракла так может недопустимо.
А галактика поддерживает тока совсестимые для всех платформа возможности.
Например, я также как то узнал опытным путем что нельзя в dsql при delete в секции from использовать join-ы, если хочешь написать условие более сложное из нескольких таблиц. Только where+subselect

Re: Прямой SQL

Добавлено: 21 окт 2015, 15:04
edward_K
1.У меня есть клиенты и на MSSQL и на оракле. Сам я все проверяю на MSSQL, но и у клиентов с оракл вроде проблем не возникало с Join
Проблема возникает. когда пытаешься ограничивать по связке полей comp = word(или string) - MS это съедает, а вот оракл нет - ему нужны поля одинакового типа.
Если для констант помогает #comp, то для полей в таблицах сие не прокатывает.
2.Насчет нескольких Value зарегил в ПИР - посмотрим, что скажут.

Re: Прямой SQL

Добавлено: 21 окт 2015, 15:28
Den
1. Проверь у себя на ms-скуле в саппорте

Код: Выделить всё

sql delete
  from katpodr inner join katpodr on grpodr.nrec=katpodr.cgrpodr
   where grpodr.name='блаблабла'
  ;
не съест такое простое предложение он.

Re: Прямой SQL

Добавлено: 21 окт 2015, 16:22
edward_K
Ну такого синтаксиса и в справочнике по MSSQL нет, есть немножко другое, но оно для Transact-SQL( в inner join как минимум должен быть grpodr) и в сапорте не пашет, а вот выборка пашет без проблем. А грохнуть я могу и без DSQL - там не такие тяжелые запросы как правило.

Re: Прямой SQL

Добавлено: 21 окт 2015, 20:47
edward_K
Вот чего там посоветовали
В оракле другой синтаксис, например, несколько 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 есть в планах