Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Слишком долгое выполнение запроса

Отображение строк 0 - 24 1510 всего, Запрос занял 0.3212 сек.
Что получается очень долго. Добавив пару индексов я сократил время на 0.2 секунды
Но все же это очень долго. Помогите как упростить запрос не могу или более грамотно его собрать. Результаты explain тоже приложил. Может такие запросы нужно кэшировать. Просто пока не до конца догоняю, как исправить ситуацию


SELECT 
	plitka_tovar.Kollekciya, 
	plitka_tovar.img, 
	interior_goods.link 
FROM 
	plitka_tovar, 
	_article, 
	interior_point, 
	interior_goods 
WHERE 
	plitka_tovar.id IN (
		SELECT 
			id_product 
		FROM 
			`kuzia-kac_forms`.plitka_tovar_oblasty_primeneniya 
		WHERE 
			id_cut IN(
				SELECT 
					id_cut 
				FROM 
					`kuzia-kac_forms`.plitka_category_oblasty_primeneniya 
				WHERE 
					id_product = '6'
			)
	) 
	AND _article.id_part = '18' 
	AND _article.id_product = plitka_tovar.id 
	AND interior_point.id = _article.id 
	AND interior_goods.id = interior_point.id_goods




CREATE TABLE IF NOT EXISTS `interior_goods` (
  `id` int(11) NOT NULL,
  `id_part` int(11) NOT NULL,
  `name` varchar(60) NOT NULL,
  `link` varchar(60) NOT NULL,
  `tags` varchar(3000) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `interior_point`
--

CREATE TABLE IF NOT EXISTS `interior_point` (
  `id` int(11) NOT NULL,
  `id_goods` int(11) NOT NULL,
  `article` int(11) NOT NULL,
  `posx` varchar(15) NOT NULL,
  `posy` varchar(15) NOT NULL,
  `point_part` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `plitka_kollekciya`
--

CREATE TABLE IF NOT EXISTS `plitka_kollekciya` (
  `id` int(11) NOT NULL,
  `Fabrika` int(11) NOT NULL,
  `Nazvanie` varchar(60) NOT NULL,
  `Polnoe_nazvanie` varchar(100) NOT NULL,
  `Opisanie` text NOT NULL,
  `pdf_fayl` varchar(60) NOT NULL,
  `Nomera_vizualizaciy` text NOT NULL,
  `title` varchar(500) NOT NULL,
  `description` varchar(500) NOT NULL,
  `keywords` varchar(500) NOT NULL,
  `divh1` varchar(500) NOT NULL,
  `tags` varchar(2000) NOT NULL,
  `Tehnicheskiy_keramogranit` varchar(3) NOT NULL,
  `out_of_production` set('Да','Нет') NOT NULL,
  `novelty` set('Да','Нет') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `plitka_tovar`
--

CREATE TABLE IF NOT EXISTS `plitka_tovar` (
  `id` int(11) NOT NULL,
  `Fabrika` int(11) NOT NULL,
  `Kollekciya` int(11) NOT NULL,
  `Nazvanie` varchar(100) NOT NULL,
  `Material` int(11) NOT NULL,
  `Poverhnosty` int(11) NOT NULL,
  `Stily` int(11) NOT NULL,
  `Tekstura` int(11) NOT NULL,
  `Tip` int(11) NOT NULL,
  `Vid_izdeliya` int(11) NOT NULL,
  `Kratnosty` varchar(30) NOT NULL,
  `S_Facetom(Kabanchik)` varchar(30) NOT NULL,
  `Tehnicheskiy_keramogranit` varchar(30) NOT NULL,
  `Tonkiy_keramogranit` varchar(30) NOT NULL,
  `title` varchar(500) NOT NULL,
  `description` varchar(500) NOT NULL,
  `keywords` varchar(500) NOT NULL,
  `divh1` varchar(500) NOT NULL,
  `tags` varchar(2000) NOT NULL,
  `size1` float NOT NULL,
  `size2` float NOT NULL,
  `size3` float NOT NULL,
  `img` varchar(120) NOT NULL,
  `f_sht` varchar(6) NOT NULL,
  `f_m2` varchar(6) NOT NULL,
  `f_kg` varchar(6) NOT NULL,
  `f_kor` varchar(6) NOT NULL,
  `f_kor_m2` varchar(6) NOT NULL,
  `sizeP1` varchar(5) NOT NULL,
  `sizeP2` varchar(5) NOT NULL,
  `sizeP3` varchar(5) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `plitka_tovar_oblasty_primeneniya`
--

CREATE TABLE IF NOT EXISTS `plitka_tovar_oblasty_primeneniya` (
  `id_cut` int(11) NOT NULL,
  `id_product` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `_article`
--

CREATE TABLE IF NOT EXISTS `_article` (
  `id` int(11) NOT NULL,
  `id_product` int(11) NOT NULL,
  `id_part` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `interior_goods`
--
ALTER TABLE `interior_goods`
  ADD PRIMARY KEY (`id`),
  ADD KEY `id` (`id`),
  ADD KEY `id_2` (`id`);

--
-- Индексы таблицы `interior_point`
--
ALTER TABLE `interior_point`
  ADD PRIMARY KEY (`id`),
  ADD KEY `article` (`article`);

--
-- Индексы таблицы `plitka_kollekciya`
--
ALTER TABLE `plitka_kollekciya`
  ADD PRIMARY KEY (`id`);

--
-- Индексы таблицы `plitka_tovar`
--
ALTER TABLE `plitka_tovar`
  ADD PRIMARY KEY (`id`),
  ADD KEY `id` (`id`);

--
-- Индексы таблицы `_article`
--
ALTER TABLE `_article`
  ADD PRIMARY KEY (`id`),
  ADD KEY `id` (`id`),
  ADD KEY `id_product` (`id_product`,`id_part`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `interior_goods`
--
ALTER TABLE `interior_goods`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT для таблицы `interior_point`
--
ALTER TABLE `interior_point`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT для таблицы `plitka_kollekciya`
--
ALTER TABLE `plitka_kollekciya`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT для таблицы `plitka_tovar`
--
ALTER TABLE `plitka_tovar`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT для таблицы `_article`
--
ALTER TABLE `_article`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;


К сообщению приложен файл. Размер - 34Kb
Ответ: miksoft, 5.6 !
Вопрос: Sleep без dbms_lock

Необходимо ждать некоторое время ( скажем N секунд ). Проблема в том, что нет прав на dbms_lock. Можно конечно запустить бесконечный цикл, но он будет сжигать ресурсы процессора. Есть ли какие-нибудь идеи как это сделать экономней?
Ответ:
Valergrad
не имеют прав
create session нет?
Вопрос: аналог oracle dbms_lock

Подскажите, есть ли в pgsql аналог oracle dbms_lock пакета?
Никак не могу найти.
Ответ:
Морфий
Подниму тему.
Есть ли аналог пользовательских блокировок как в oracle.dbms_lock?
Т.е. нужна блокировка "виртуальных" объектов.


Вероятнее всего вам нужно смотреть в сторону


(advisory locks)


--
Maxim Boguk
Вопрос: Есть у кого-нить UDF'ка типа sleep(N) для 32-разр. ФБ ?

hi all

Изабэлло выдумывать, как в каждом коннекте приостановить скрипт, "до особого распоряжения". И чтобы он проверял это распоряжение не чаще 1 раза в N секунд.

Необходима UDF'ка, которую можно вызвать изнутри PSQL-кода с требованием "а ну спать N секунд!", и чтобы при этом сервак не грузился от этого спящего коннкета. Ставить VS и выдумывать велосипед - в лом, да и времени нет.

Если есть у кого готовая dll - вышлите, плз, на p519446 ат yandex.ru
Нужно для одного сверхважного теста ;)

ЗЫ. А встроенная ф-ция в ФБ, видимо, не появится никогда :(
Ответ: Симонов Денис,

я именно это и вспомнил, как правильно надо сделать )
Вопрос: Долгая выдача ораклом привилегий для внешних java-функций

Для работы с файлами на диске написал функцию на java и включил её в Java sources БД Oracle.
Написал скрипт PL-SQL, который посредством вызова функции-оболочки запускает этот java-код.

Чтобы работало нужно обязательно java выдавать привилегии на чтение и запись в определённую директорию на диске, делаю это следующим образом:

dbms_java.grant_permission('Имя оракловского пользователя, под которым запускается скрипт','SYS:java.io.FilePermission','путь к папке где лежит файл','read');
dbms_java.grant_permission('Имя оракловского пользователя, под которым запускается скрипт','SYS:java.io.FilePermission','путь к папке где лежит файл','write');


Всё работает как надо, но слишком долго - привилегии выдаются где то за 10-15 сек.
Причём независимо локальный путь или сетевой.

В чём может быть причина такой долгой работы?
Ответ:
Leonid Kudryavtsev
verter
memory_target='68719476736'
open_cursors='300'


68 ГИГА байт?

Такие настройки у меня вообще в голове не укладываются )))


А сколько оптимально нужно поставить?
Вопрос: Аналог функции sleep в Teradata

Здравствуйте, уже как неделю изучаю БД Teradata. Для решения моей задачи, а вернее для тестирования выполненной задачи. Мне в процедуре Teardata необходимо сделать задержку. На свое удивление я не нашел такой функции, аналогичную как в Oracle sleep(). Подскажите, кто решал данную задачу с задержкой времени ?
Ответ: Станислав Клевцов, идея интересная, спасибо попробую.
Вопрос: Как выйти из цикла

Привет, знатокам!

Кто-нибудь знает как выйти из цикла, если этот цикл выполняется более минуты?

Например, нужно определить функцию, которая работает слишком долго при определенных входных параметрах.
DECLARE
  l_value NUMBER;
  l_start TIMESTAMP;
BEGIN
  FOR i IN
  (SELECT SID FROM v$session
  )
  LOOP
    l_start := SYSTIMESTAMP
    SELECT some_package.some_function(some_param) INTO l_value FROM dual;  --проверяем функцию some_package.some_function
    EXIT
  WHEN TRUNC (extract (second FROM (L_start -SYSTIMESTAMP))) > 60;
    dbms_output.put_line('Печатаем, при каких параметрах висит : '|| i.SID ||' - сильно висит');
  END LOOP;
END;


Пробовал использовать EXIT WHEN, но у меня так не получилось. Видимо, EXIT WHEN работает не так, как я думаю.
Также смотрел в сторону DBMS_PROFILER, но этот вариант не совсем подходит потому, что нужно дожидаться завершения цикла, а это неприемлемо, т.к. функция может работать часами-сутками.

Есть какие-нибудь идеи??

P.S. исправлять саму функцию пока не предлагать.
Ответ:
Баналитик
Пробовал использовать EXIT WHEN, но у меня так не получилось. Видимо, EXIT WHEN работает не так, как я думаю.
а как, вы думаете, оно работает?
+
SANDBOX@ee>create or replace procedure longrunning_proc
2 as
3 t0 constant timestamp with time zone := current_timestamp;
4 i constant interval day to second := interval '2' second;
5 begin
6 while t0 + i > current_timestamp loop
7 dbms_lock.sleep(1/3);
8 dbms_output.put_line(current_timestamp);
9 end loop;
10 end;
11 /

Procedure created.

Elapsed: 00:00:00.00
SANDBOX@ee>call longrunning_proc();
29-JUL-16 12.15.43.022000000 PM +03:00
29-JUL-16 12.15.43.352000000 PM +03:00
29-JUL-16 12.15.43.682000000 PM +03:00
29-JUL-16 12.15.44.022000000 PM +03:00
29-JUL-16 12.15.44.352000000 PM +03:00
29-JUL-16 12.15.44.692000000 PM +03:00

Call completed.

Elapsed: 00:00:02.02
Вопрос: dbms_lock.request выдает parameter error

Приветсвую.

Сначала появилась ошибка ORA-08004: sequence DBMS_LOCK_ID.NEXTVAL exceeds MAXVALUE and cannot be instantiated
Увеличили макс. значение последовательности до предела integer, сделали cycle.

Потом начались проблемы с логическими блокировками, они и сейчас есть
Вызов dbms_lock.request с lockHandle только что полученным через allocate_unique выдает 3- parameter error.

Куда копать? Есть мысль очистить dbms_lock_allocated и начать последовательность с начала.

declare 
  function GetLockHandle(
    spLockName       in varchar2
    , npTime         in number
  ) return varchar2
  as
    pragma autonomous_transaction;
    svLockHandle        varchar2(128);
  begin
    sys.dbms_lock.allocate_unique(spLockName, svLockHandle, npTime);

    commit;
    return svLockHandle;
  end GetLockHandle;
begin
  lockHandle := GetLockHandle('OBJ_161692251001_', 100);
  --lockHandle = 20117893222011789322130
  res := sys.dbms_lock.request(lockhandle => lockHandle, lockmode => 6, timeout => 0, release_on_commit => true);
  --res = 3
end;
Ответ:
kostyanich33
Увеличили макс. значение последовательности до предела integer, сделали cycle.
Ума палата.
kostyanich33
Вызов dbms_lock.request с lockHandle только что полученным через allocate_unique выдает 3- parameter error.
RTFM : "This procedure allocates a unique lock identifier (in the range of 1073741824 to 1999999999)"
Вопрос: Слишком долгий интервал перед End-of-file on communication channel

Это частенько случается когда пользуюсь дебагером в TOAD.
То есть, допустим, делаю select * from dual - всё нормально (сессия жива).
Но когда запускаю дебагер - сначала TOAD намертво виснет примерно минут на 10 (согласитесь, немало), после чего происходит End-of-file on communucatio channel.
И это уже начинает выбешивать, поскольку зачастую TOAD так и не выходит из ступора - приходится килять процесс (соответственно, порой теряется несохраненный код).

Please, advise.
Ответ: andrey_anonymous,

Infact, EOF on communication channel происходит не всегда.
Иногда TOAD говорит, мол "Oracle Debugger is not responding." и предлагает сделать аборт.
После нажатия на кнопку Abort TOAD так и продолжает висеть. Похоже что бесконечно.

А что касается таймаута ожидания ответа от сервера - как его можно контролировать?
Вопрос: Помогите с оптимизацией! Слишком долго работает простая функция.

1 млн записей
Функция:
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER   FUNCTION [dbo].[fArticle](@Article varchar (30))
RETURNS varchar (30) 
AS
BEGIN
 
return (upper(replace(replace(replace(replace(replace(replace(replace(@Article,' ',''),'.',''),'-',''),' ',''),'/',''),'`',''), '''', '')))
   
END

Запрос Выполняется 22 сек
select distinct  артикул  from ##price group by  артикул  having COUNT(dbo.farticle(артикул))>1  


Запрос Выполняется 1 сек
select distinct  артикул  from ##price group by  артикул  having COUNT(upper(replace(replace(replace(replace(replace(replace(replace(артикул,' ',''),'.',''),'-',''),' ',''),'/',''),'`',''), '''', '')))>1  


Как сделать чтобы функция работала так же быстро?
Ответ:
Владислав Колосов
Mike_za,

может помочь в понимании сути проблемы.
Суть проблемы не в отсутствии/присутствии распараллеливания, а в безобразной реализации вызовов скалярных функций в движке MSSQL. Сам вызов зачем то потребляет миллионы команд процессора.