powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Зацикливается запрос, бесконечное время выполнения - помогите
8 сообщений из 8, страница 1 из 1
Зацикливается запрос, бесконечное время выполнения - помогите
    #39379993
Фотография Cola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу помощи! Ситуация следующая: запускаю выгрузку данных в внешний источник (файл) и имею бесконечный поток, на размер всего свободного места на винте... Последняя выгрузка 350Гб. Это глюк или у меня что-то не верно. С PostgresSQL (v.9.5) дела раньше не имел, только MSSQL, Oracle.
Размер каталога БД (вместе с системной базой: 11Gb. Размер файла бекапа рабочей базы =1,5 Гб.
Запросы для определения размеров выборок:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT 'pos.order_client', count(*)  FROM pos.order_client
union
SELECT 'pos.wares_order', count(*)  FROM pos.wares_order
union
Select 'pos.workplace', count(*) from pos.workplace
union
Select 'pos.wares', count(*) from pos.wares
union
SELECT 'Where', count(*) 
from pos.order_client, pos.wares_order
WHERE 
wares_order.code_shop=pos.order_client.code_shop AND
wares_order.id_workplace=pos.order_client.id_workplace AND
wares_order.code_order=pos.order_client.code_order
union
SELECT 'Where-1', count(*) 
from pos.order_client, pos.wares_order, pos.unit_dimension, pos.wares
WHERE 
wares_order.code_shop=pos.order_client.code_shop AND
wares_order.id_workplace=pos.order_client.id_workplace AND
wares_order.code_order=pos.order_client.code_order AND
unit_dimension.code_unit = wares_order.code_unit AND
wares.code_wares = wares_order.code_wares;


Результат:
pos.order_client = 8 868 826
pos.wares_order = 11 524 384
pos.workplace = 606
Where = 11 524 384
Where-1 = 11 524 381

Вот сам запрос, который вызывает циклическую выгрузку (ничего военного просто полей много):
Код: sql
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.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
Copy (
Select
  wares_order.quantity AS "Количество",
  wares_order.price AS "Цена",
  wares_order.vat AS "Ставка НДС",
  wares_order.price_schema AS "Схема расчета цены",
  wares_order.price_catalog AS "Цена по каталогу",
  wares_order.num AS "Порядковый номер в чеке",
  wares_order.sum_position AS "Сумма позиции",
  wares_order.sum_discount AS "Сумма скидки",
 
 CASE
    WHEN wares_order.type_wares=0 THEN 'товар'
    WHEN wares_order.type_wares=1 THEN 'тара'
    WHEN wares_order.type_wares=2 THEN 'подарок'
    ELSE 'неопределен'
  END "Тип товара",  
 
  wares_order.quantity_ret AS "Кол-во возвращено",
  wares_order.sum_ret AS "Сумма возвращенного",
  wares_order.code_order_return AS "Код заказа по которому делается возврат", 
  wares_order.code_rule AS "ID_Код правила",  
  wares_order.barcode AS "Штрихкод, по которому искался товар",  
  order_client.date_receipt AS "Дата чека (если чек не выбит)",
  order_client.number_receipt AS "Номер чека(если чек выбит)",
  order_client.code_client AS "ID_Код клиента",
  order_client.code_user AS "ID_Код пользователя",
  order_client.date_change AS "Дата изменения",
  order_client.sum_discount AS "Скидка по чеку",
  order_client.number_cash_register AS "Заводской номер кассового аппарата",
  order_client.date_order AS "Дата покупки",
  order_client.sum_order AS "Сумма чека",
 CASE
    WHEN order_client.text_mode=true THEN 'обычный'
    WHEN order_client.text_mode=false THEN 'фискальный'
    ELSE 'неопределен'
  END "Режим печати чека",  
 CASE
    WHEN order_client.type_order=0 THEN 'продажа'
    WHEN order_client.type_order=1 THEN 'возврат'
    WHEN order_client.type_order=2 THEN 'лист инвентаризации'
    ELSE 'неопределен'
  END "Тип чека",
  order_client.code_z_report AS "Номер Z-отчета в который войдет чек",
 CASE
    WHEN order_client.type_order=0 THEN 'вложенный'
    WHEN order_client.type_order=1 THEN 'наложенный'
    ELSE 'неопределен'
  END "Тип НДС",  
  order_client.date_open AS "Дата открытия чека",
  order_client.number_z_report AS "Фискальный номер Z-отчета в который войдет чек",
  order_client.code_order_source AS "Код исходного чека в случае разделения чека на несколько",
   CASE
    WHEN extract(MONTH from order_client.date_order)=1 THEN 'январь'
    WHEN extract(MONTH from order_client.date_order)=2 THEN 'февраль'
    WHEN extract(MONTH from order_client.date_order)=3 THEN 'март'
    WHEN extract(MONTH from order_client.date_order)=4 THEN 'апрель'
    WHEN extract(MONTH from order_client.date_order)=5 THEN 'май'
    WHEN extract(MONTH from order_client.date_order)=6 THEN 'июнь'
    WHEN extract(MONTH from order_client.date_order)=7 THEN 'июль'
    WHEN extract(MONTH from order_client.date_order)=8 THEN 'август'
    WHEN extract(MONTH from order_client.date_order)=9 THEN 'сентябрь'
    WHEN extract(MONTH from order_client.date_order)=10 THEN 'октябрь'
    WHEN extract(MONTH from order_client.date_order)=11 THEN 'ноябрь'
    WHEN extract(MONTH from order_client.date_order)=12 THEN 'декабрь'   
    ELSE '0'
  END "Месяц",  
  
  extract(year from order_client.date_order) as "Год",
  extract(day from order_client.date_order) as "День",

  CASE
    WHEN EXTRACT(dow FROM order_client.date_order)=0 THEN 'Понедельник'
    WHEN EXTRACT(dow FROM order_client.date_order)=1 THEN 'Вторник'
    WHEN EXTRACT(dow FROM order_client.date_order)=2 THEN 'Среда'
    WHEN EXTRACT(dow FROM order_client.date_order)=3 THEN 'Четверг'
    WHEN EXTRACT(dow FROM order_client.date_order)=4 THEN 'Пятница'
    WHEN EXTRACT(dow FROM order_client.date_order)=5 THEN 'Суббота'
    WHEN EXTRACT(dow FROM order_client.date_order)=6 THEN 'Воскресение'
    ELSE '0'
  END "День недели",
  
  wares.name_wares AS "Название товара",  
  wares.vat AS "Ставка НДС%",
  wares.name_wares_receipt AS "Название товара в чеке",
 CASE
    WHEN wares.sale_in_tara=0 THEN 'без тары'
    WHEN wares.sale_in_tara=1 THEN 'продается в таре'
    ELSE 'неопределен'
 END "Товар и тара",  
 CASE
    WHEN wares.sign_activity=0 THEN 'не активна'
    WHEN wares.sign_activity=1 THEN 'активна'
    ELSE 'неопределен'
 END "Признак активности", 
   wares.artilce AS "Артикул товара", 
  shops.name_shop AS "Название магазина"
 CASE
    WHEN shops.sign_activity=0 THEN 'не активна'
    WHEN shops.sign_activity=1 THEN 'активна'
    ELSE 'неопределен'
 END "Признак активности компании", 
CASE
    WHEN shops.sign_activity=0 THEN 'неплательщик НДС'
    WHEN shops.sign_activity=1 THEN 'плательщик НДС'
    ELSE 'неопределен'
END "Признак плательщика НДС",   
CASE
    WHEN wares_order.code_unit=1 THEN 'шт.'
    WHEN wares_order.code_unit=2 THEN 'кг.'
    WHEN wares_order.code_unit=3 THEN 'уп.'
    ELSE 'неопределен'
END "Признак плательщика НДС"   
FROM 
  pos.order_client, 
  pos.shops,  
  pos.wares_order,  
  pos.wares
WHERE   
wares_order.code_shop=pos.order_client.code_shop AND
wares_order.id_workplace=pos.order_client.id_workplace AND
wares_order.code_order=pos.order_client.code_order AND
wares.code_wares = wares_order.code_wares
) To 'D:\DATA\posts.csv';


Я думаю, что 350 Гигабайт файла выгрузки (прерван по окончанию места на винте) это явно не одиннадцать с половиной миллионов записей. Помогите. плииз!
...
Рейтинг: 0 / 0
Зацикливается запрос, бесконечное время выполнения - помогите
    #39380013
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT ...
FROM 
  pos.order_client, 
  pos.shops,  
  pos.wares_order,  
  pos.wares
WHERE   
wares_order.code_shop=pos.order_client.code_shop AND
wares_order.id_workplace=pos.order_client.id_workplace AND
wares_order.code_order=pos.order_client.code_order AND
wares.code_wares = wares_order.code_wares
) To 'D:\DATA\posts.csv';


У вас декартово перемножение с выделенными таблицами.
...
Рейтинг: 0 / 0
Зацикливается запрос, бесконечное время выполнения - помогите
    #39380014
Фотография Cola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только что запустил выгрузку с ограничением:
Код: sql
1.
LIMIT 11524384


Результат:
Query returned successfully: 11524384 rows affected, 07:27 minutes execution time.
Размер файла 6,4 Гигабайта, что подтверждает что размер выгрузки ни как не может быть 350 Гигабайт.
...
Рейтинг: 0 / 0
Зацикливается запрос, бесконечное время выполнения - помогите
    #39380028
Фотография Cola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,
Добавил в запрос:
Код: sql
1.
2.
3.
4.
5.
6.
WHERE 
wares_order.code_shop=pos.shops.code_shop AND
wares_order.code_shop=pos.order_client.code_shop AND
wares_order.id_workplace=pos.order_client.id_workplace AND
wares_order.code_order=pos.order_client.code_order AND
wares.code_wares = wares_order.code_wares


Это решит проблему?
...
Рейтинг: 0 / 0
Зацикливается запрос, бесконечное время выполнения - помогите
    #39380034
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cola,

Не поможет.

почитайте про декартово произведение

уберите таблицы из `FROM`-части запроса, если они не нужны

если нужны, то укажите связки для каждой таблицы в запросе, а не только для двух

чтобы избежать недоразумений, используйте явную нотацию для связок: FROM ... JOIN ... ON ... [ JOIN ... ON ... [ ... ] ]
...
Рейтинг: 0 / 0
Зацикливается запрос, бесконечное время выполнения - помогите
    #39380063
Фотография Cola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,
JOIN не прокатывает, пишет, что обнаружено несколько ссылок на одну таблицу.
У меня связываются две таблицы по трем полям.
Почему же тогда Count(*) сработал?
...
Рейтинг: 0 / 0
Зацикливается запрос, бесконечное время выполнения - помогите
    #39380068
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cola,

Модифицируйте предикаты так, чтобы выбиралась только одна запись из `wares_order`.
Посмотрите на результат запроса.

Также посмотрите на вывод `SELECT * ...` для такого (по одной записи из `wares_order`) запроса.
...
Рейтинг: 0 / 0
Зацикливается запрос, бесконечное время выполнения - помогите
    #39380181
Фотография Cola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,
Спасибо :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Зацикливается запрос, бесконечное время выполнения - помогите
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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