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

Доброе время суток!
Столкнулся вот с такой задачей:
Нужно выбрать с таблицы в сводную данные по учащимся по типу формы обучения с распределением по возрасту, должно получиться что-то типа как в запросе что описан ниже:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TRANSFORM COUNT(zZv.ФИО) AS [Count-ФИО]
SELECT zZv.[Форма]
FROM zZv
GROUP BY zZv.[Форма]
PIVOT iif(zZv.date_v< 15,"<15",
iif(zZv.date_v = 15,"15",iif(zZv.date_v = 16,"16",
iif(zZv.date_v = 17,"17",iif(zZv.date_v = 18,"18",
iif(zZv.date_v = 19,"19",
iif(zZv.date_v = 20,"20",iif(zZv.date_v = 21,"21",
iif(zZv.date_v = 22,"22",iif(zZv.date_v = 23,"23",
iif(zZv.date_v = 24,"24",iif(zZv.date_v = 25,"25",
iif(zZv.date_v = 26,"26",iif(zZv.date_v = 27,"27",
iif(zZv.date_v = 28,"28",iif(zZv.date_v = 29,"29",
iif(zZv.date_v = BETWEEN 30 AND 34,"30-34",
iif(zZv.date_v > 34,">34"))))))))))))))))));
Но при запуске:
Ошибка: Слишком сложное выражение в выражении запроса!

Помогите плз оптимизировать запрос.
Ответ: Нет, так Вы нужного порядка не получите. У пивот-запроса свои правила.
Надо в исходном запросе zZv образовать поле dt_v:
SQL
1
iif(zZv.date_v IS NULL, "Возраст не указан", iif(zZv.date_v< 15,"<15", iif(zZv.date_v>34, "34>", iif(zZv.date_v BETWEEN 30 AND 34, "30-34", cstr(zZv.date_v))))) AS dt_v
А в пивоте перекрестного задать нужный порядок dt_v в предложении In
SQL
1
Pivot dt_v IN("<15","15","16",...,"30-34","34>")
Вопрос: Как оптимизировать запрос с Left Join?

Есть такой запрос, выполняется очень долго (30 секунд), в базе в таблице news 85 тысяч записей, а в rels 45 миллионов.
Помогите пожалуйста оптимизировать запрос.

PHP
1
2
3
4
5
6
7
8
9
10
11
//сама новость
$result = mysqli_query($con, "SELECT * FROM news WHERE id = $id");
$row = mysqli_fetch_assoc($result);
print_r($row);
 
//похожие новости
$result = mysqli_query($con, "SELECT similar_id, news.title, news.text, news.link FROM rels LEFT JOIN news ON news.id = rels.similar_id WHERE rels.news_id = $id LIMIT 100");
while($row = mysqli_fetch_assoc($result))
{
    print_r($row);
}
Ответ:
Сообщение от monavista
Если надо заплатить за оптимизацию - готов
Имелось ввиду вот это:
Или выше озвучили: EXPLAIN.
Это покажет где в запросе тормоза.
Вопрос: Оптимизировать запрос

Будьте так любезны уважаемые форумчане, помогите оптимизировать запрос:
UPDATE contacts SET operator_id=(SELECT operator_id FROM ru_operator_data_new WHERE INSTR( SUBSTR( phone, 2 ) , ru_operator_data_new.oper_prefix)  =1 ORDER BY LENGTH( oper_prefix ) DESC LIMIT 1)


Таблички:

contacts:
operator_id INTEGER NULL
phone CHAR(255) 79050000000


ru_operator_data_new:
oper_prefix VARCHAR(20) 1
operator_id INTEGER 9050


Если допустим в базе 2000 записей выполняется, минут 20 этот запрос. Если ли способ его оптимизировать ?
Ответ: Нет. Непонятно.

Читай инструкцию: 13467826
Вопрос: оптимизировать запрос помогите PLZ!

Помогите оптимизировать запрос!
Есть 2 вьюхи одинаковые, но с разным условием по дате (TODATE). Вьюхи называются TOMORROWRETAILPRICE_LMA_TEST и TODAYRETAILPRICE_LMA_TEST. Пример одной вьюхи ниже.
Таблица RETAILPRICESTRANS_LMA_TEST 35 млн строк единственная более-менее большая (6ГБ) в этом запросе.

идея такая: нужно вычислять дельту изменений между 2 вьюхами за определенную дату вот таким запросом (см. ниже).
План запроса во вложении. Как видно, основное время тратится на сортировки, но я не знаю как по другому переписать запрос.

SELECT * FROM
( SELECT
A.[RetailStoreRecId],
A.STORENUMBER,
A.ProductNumber,
A.ProductRecId,
isnull(A.[RetailPrice],0) AS PRICE,
isnull(B.[RetailPrice],0) AS PRICE2,
isnull(A.[OK],0) AS OK,
isnull(B.[OK],0) AS OK2,
A.CAMPAIGNID, B.CAMPAIGNID AS CAMPAIGNID2,
IIF(A.[CAMPAIGNID] <> '',1,0) AS FIXPRICE
FROM dbo.[TOMORROWRETAILPRICE_LMA_TEST] AS A
inner join RETAILSTORETABLE_LMA st on st.RETAILSTORETABLE = A.[RetailStoreRecId] AND st.ISACTIVE = 1
LEFT OUTER JOIN [TODAYRETAILPRICE_LMA_TEST] AS B ON A.ProductNumber = B.ProductNumber AND A.RetailStoreRecId = B.RetailStoreRecId ) as C
WHERE (C.PRICE <> C.PRICE2 OR C.OK <> C.OK2) ORDER BY C.[RetailStoreRecId]

код вьюхи. Другая точно такая же, но с другим условием по дате.

SELECT    Store.recId AS RetailStoreRecId, Store.STORENUMBER AS STORENUMBER, Product.DISPLAYPRODUCTNUMBER AS ProductNumber, Product.recid AS ProductRecId,

CAST
                             ((SELECT  TOP 1   TR.PRICE AS Expr1 
                                 FROM            dbo.[RETAILPRICESTRANS_LMA_TEST] AS TR 
                                 WHERE			(TR.PARTITION = 5637144576) AND
												(TR.ENABLED = 1) AND 
												(TR.CHANNEL = Store.RECID) AND 
												(TR.PRODUCT = Product.recId) AND
												(TR.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE()))) AND
												(TR.TODATE	>= DATEADD(day, 1, convert(date, GETDATE())))
												ORDER BY TR.PRIORITY ASC, TR.CREATEDDATETIMELOCK DESC ) AS money) AS RetailPrice,

CAST
                             ((SELECT        TOP 1 dbo.RETAILDISCOUNTTRANS_LMA.PRICEORPERCENT AS Expr1
                                 FROM            dbo.RETAILDISCOUNTTRANS_LMA 
                                 WHERE				dbo.RETAILDISCOUNTTRANS_LMA.PARTITION = 5637144576 AND 
													dbo.RETAILDISCOUNTTRANS_LMA.DISCOUNTSTYPE = 10 AND dbo.RETAILDISCOUNTTRANS_LMA.ENABLED = 1 AND
													dbo.RETAILDISCOUNTTRANS_LMA.product = Product.recid AND 
													dbo.RETAILDISCOUNTTRANS_LMA.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE())) AND 
													dbo.RETAILDISCOUNTTRANS_LMA.TODATE >= DATEADD(day, 1, convert(date, GETDATE())) AND 
                                                    dbo.RETAILDISCOUNTTRANS_LMA.CHANNEL = Store.RECID ORDER BY DISCOUNTID DESC) AS money) AS OK,


CAST
                             ((SELECT  TOP 1 C.CAMPAIGNID AS Expr1 
                                 FROM            dbo.[RETAILPRICESTRANS_LMA_TEST] AS TR 
								 LEFT OUTER JOIN dbo.SMMCAMPAIGNTABLE AS C ON C.PARTITION = 5637144576 AND C.DATAAREAID = 'LTG' AND C.RECID = TR.SOURCERECID
                                 WHERE			(TR.PARTITION = 5637144576) AND
												(TR.ENABLED = 1) AND 
												(TR.CHANNEL = Store.RECID) AND 
												(TR.PRODUCT = Product.recId) AND
												(TR.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE()))) AND
												(TR.TODATE	>= DATEADD(day, 1, convert(date, GETDATE())))
												ORDER BY TR.PRIORITY ASC, TR.CREATEDDATETIMELOCK DESC ) AS varchar) AS CampaignId


FROM            dbo.RETAILCHANNELTABLE AS Store 

CROSS JOIN dbo.ECORESPRODUCT AS Product 
GROUP BY Store.recId, Store.STORENUMBER, Product.DISPLAYPRODUCTNUMBER, Product.recId 
Ответ:
i-i
виноват, "анонимного пользователя"

ТСу - а вы укажите оптимизатиру чтобы он исползовал новые индексы with (index = yourindexname), иногда помогает


Заслышав бубен - запляшут духи...

PS. Я, канешно не знаю чего там у тредстартера напихано в
dbo.RETAILCHANNELTABLE и dbo.ECORESPRODUCT

НО! если допустить, что

FROM            dbo.RETAILCHANNELTABLE AS Store 
CROSS JOIN dbo.ECORESPRODUCT AS Product 
GROUP BY Store.recId, Store.STORENUMBER, Product.DISPLAYPRODUCTNUMBER, Product.recId 


имеет смысл, то даже вот так

FROM  ( select distinct recId, STORENUMBER from dbo.RETAILCHANNELTABLE ) AS Store 
CROSS JOIN ( select distinct DISPLAYPRODUCTNUMBER, recId from dbo.ECORESPRODUCT ) AS Product 

будет гораздо эффективнее.
Хотя меня сильно смущают recId...
Вопрос: Оптимизировать запрос с подзапросом

Привет ребят, подскажите как оптимизировать запрос и сделать его во FROM, как и указано в задании:


Выведите все данные (*) о сотрудниках с зарплатой, равной максимальной зарплате внутри своего отдела.
Указание: Решите задачу с использованием некоррелированного подзапроса во FROM.


(запрос работает) Есть таблица employees с полями зарплата,партамент,....

SQL
1
2
3
4
5
SELECT*
FROM employees
WHERE (department_id,salary) IN (SELECT department_id,MAX(salary)
                 FROM employees
                 GROUP BY department_id)
Ответ: Мне кажется, можно так:
SQL
1
2
3
4
SELECT * FROM (
SELECT e.*,  MAX(salary) OVER (PARTITION BY department_id) AS max_salary
FROM employees E 
) WHERE salary=max_salary;
Преимущество в том, что сканирование по таблице делается один раз
Вопрос: Помогите оптимизировать запрос db2

Помогите оптимизировать запрос. Выглядит он монстрообразно.

select distinct  PUBLSEQ from PUBLCOVER P
      WHERE EXISTS
      ( SELECT * FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA = 1823
        )
      AND NOT EXISTS
      ( SELECT * FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA NOT IN (1823, 34)
        )


Очень бы хотелось избавиться от EXISTS или NOT EXISTS, оставив один из них.
Ответ: Давно искал, нужно для курсовой)
Вопрос: Как оптимизировать запрос обновления

Привет,
что-то затруднился. Требуется выполнить обновление, установив некоторые поля в значения, возвращаемые одной функцией:

  update table1 t
      set t.field1 = f_function_1(param1 => t.field3),
          t.field2 = f_function_1(param1 => t.field3)
  where (некоторые условия) 


Смущает что приходится одну и ту же функцию вызывать дважды с одними и теми же параметрами на входе. Нельзя ли здесь как-то оптимизировать запрос? t.field2 = t.field1 понятно не прокатит. Курсор не вариант, так как выполняться будет дольше и нет полей чтбы однозначно идентифицировать отдельную запись.
Ответ:
SY
rigor mortis
Этот вариант что-то вообще дольше получился на порядок. А с deterministic время выполнения сократилось на 20%.


Вeрсия?

+ 11G

SQL> set timing off
SQL> set autotrace off
SQL> select banner from v$version
  2  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> drop table t1 purge
  2  /

Table dropped.

SQL> set serveroutput on
SQL> create or replace function f1(a number) return number as
  2  begin --dbms_output.put_line('!!!');
  3        return 10-a;
  4  end;
  5  /

Function created.

SQL> create table t1 as select rownum a, rownum+1 b, rownum+2 c from dual connect by level <= 1000000
  2  /

Table created.

SQL> set timing on
SQL> set autotrace on
SQL> merge
  2    into t1 d
  3    using(
  4          select rowid rid, f1(c) y from t1 where mod(c,10) = 0
  5         ) s
  6    on (
  7        s.rid = d.rowid
  8       )
  9    when matched
 10      then
 11        update
 12           set a = y,
 13               b = y
 14  /

100000 rows merged.

Elapsed: 00:00:04.69

Execution Plan
----------------------------------------------------------
Plan hash value: 359177147

-------------------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT      |      | 85923 |  3272K|       |  4245   (1)| 00:00:51 |
|   1 |  MERGE               | T1   |       |       |       |            |          |
|   2 |   VIEW               |      |       |       |       |            |          |
|*  3 |    HASH JOIN         |      | 85923 |  6377K|  3112K|  4245   (1)| 00:00:51 |
|*  4 |     TABLE ACCESS FULL| T1   | 85923 |  2097K|       |   768   (3)| 00:00:10 |
|   5 |     TABLE ACCESS FULL| T1   |   858K|    41M|       |   758   (2)| 00:00:10 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access(ROWID="D".ROWID)
   4 - filter(MOD("C",10)=0)

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
        248  recursive calls
     102767  db block gets
       5908  consistent gets
       2759  physical reads
   26394228  redo size
       2071  bytes sent via SQL*Net to client
       1616  bytes received via SQL*Net from client
          6  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
     100000  rows processed

SQL> commit
  2  /

Commit complete.

Elapsed: 00:00:00.00
SQL> update (select a, b, (select f1(c) from dual) y from t1 where mod(c,10) = 0) set a=y, b=y
  2  /

100000 rows updated.

Elapsed: 00:00:06.11

Execution Plan
----------------------------------------------------------
Plan hash value: 2212140970

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |      | 85923 |  3272K|   516K (34)| 01:43:16 |
|   1 |  UPDATE            | T1   |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| T1   | 85923 |  3272K|   768   (3)| 00:00:10 |
|   3 |   FAST DUAL        |      |     1 |       |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(MOD("C",10)=0)

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
        102  recursive calls
     102486  db block gets
       2869  consistent gets
          0  physical reads
   25784148  redo size
       1125  bytes sent via SQL*Net to client
       1197  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
     100000  rows processed

SQL> commit
  2  /

Commit complete.

Elapsed: 00:00:00.00
SQL> update t1 set a=f1(c), b=f1(c)  where mod(c,10) = 0
  2  /

100000 rows updated.

Elapsed: 00:00:09.40

Execution Plan
----------------------------------------------------------
Plan hash value: 2927627013

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |      | 85923 |  3272K|   768   (3)| 00:00:10 |
|   1 |  UPDATE            | T1   |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| T1   | 85923 |  3272K|   768   (3)| 00:00:10 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(MOD("C",10)=0)

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
        182  recursive calls
     204255  db block gets
       2903  consistent gets
          0  physical reads
   45903412  redo size
       1125  bytes sent via SQL*Net to client
       1156  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
     100000  rows processed

SQL> commit
  2  /

Commit complete.

Elapsed: 00:00:00.01
SQL> 


Так что смотри планы и ищи в чем дело.

SY.


Переписал всё заново, вроде ок, спасибо.
Вопрос: Как оптимизировать запросы в mysql?

Есть запросы которые при меньшей нагрузке выполняются меньше секунды, потом как бывает некая нагрузка 300-400 юзеров онлайн, начинают выполнятся от 5 секунд до 120с+

Запрос №1
CODE (text):

  1. SELECT count(DISTINCT product.id)
  2. FROM `product`
  3. JOIN `city` ON city.id=product.city_id
  4. JOIN `company` ON company.id=product.company_id
  5. WHERE ((((`product`.`id` in (
  6.           select product_id from product_to_city
  7.           join city on (city.id = product_to_city.city_id)
  8.           where city.id = 104 or city.parent_id = 104
  9.         )))) AND (`product`.`publish` = 1 AND `product`.`archive` != 1 AND `product`.`delete` != 1));


Запрос №2
CODE (text):

  1. SELECT count(*)
  2. FROM (SELECT `product`.`id`, `product`.`position`, `product`.`description`, `product`.`city_id`,  `production`.`price`,  `production`.`company_id`, `company`.`company_type`, `city`.`name` AS `city_name`
  3. FROM `product_to_tag` `p2t`
  4. JOIN `product` ON product.id = p2t.product_id
  5. JOIN `product_to_city` `ptc` ON product.id = ptc.product_id
  6. JOIN `city` `c` ON c.id = ptc.city_id
  7. LEFT JOIN `city` `city` ON city.id=product.city_id
  8. LEFT JOIN `company` ON company.id=product.company_id
  9. WHERE ((((`product`.`id` in (
  10.           select product_id from product_to_city
  11.           join city on (city.id = product_to_city.city_id)
  12.           where city.id = 1 or city.parent_id = 1
  13.         )))) AND (`product`.`publish` = 1 AND `product`.`archive` != 1 AND `product`.`delete` != 1)) AND (product.id !=  513568) AND (c.id = 1 or c.parent_id = 1) AND ((`p2t`.`tag_id` IN (14, 30, 37, 500)))
  14. GROUP BY `product`.`id`
  15. ORDER BY `product`.`timestamp_update` DESC) as count;



в логах долгих запросов после второго запроса даже простые запросы медленно начинают выполнятся
CODE (text):

  1.  
  2. # Query_time: 256.971239 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
  3. UPDATE product SET `view_count` = `view_count` + 1 WHERE id = '2797283';
  4.  
  5. # Query_time: 554.572351 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
  6. UPDATE product SET `view_count` = `view_count` + 1 WHERE id = '2156047';
  7.  
  8. # Query_time: 646.604457 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
  9. UPDATE product SET `view_count` = `view_count` + 1 WHERE id = '2104649';


как еще оптимизировать? Индексы все расставлены

(Отредактировано автором: 26 Апреля, 2017 - 06:36:50)

Ответ:
1. distinct уберу, а джойны просто нужны еще когда надо делать выборку по полям этих таблицы

переписал subquery в Join

CODE (SQL):

  1.  
  2. SELECT count(DISTINCT product.id)
  3.     FROM `product`
  4.     JOIN `product_to_city` ON `product`.`publish` = 1
  5.         AND `product`.`archive` != 1 AND `product`.`delete` != 1
  6.         AND `product_to_city`.`product_id` = `product`.`id`
  7.     JOIN `city` AS `c` ON (`c`.`id` = 104 OR `c`.`parent_id` = 104)
  8.         AND `c`.`id` = `product_to_city`.`city_id`
  9.     JOIN `city` ON `city`.`id` = `product`.`city_id`
  10.     JOIN `company` ON `company`.`id` = `product`.`company_id`
  11.  


2. group нужен для того чтобы группировать по product.id так как при обычной выборке без group туда попадают дубли, соотвественно когда count внутри этого запроса то получаем несколько строк с количеством товаров у этого тега, поэтому пришлось написать внешний count чтобы считать общее количество записей


3. Насчет MyIsam там только одна таблица MyIsam и то не участвует в выборке, только записываю данные, думаете он блокирует?
Вопрос: SQL оптимизировать запрос

Здравствуйте друзья, есть вопрос к вам

Допустим у меня имеется следующая таблица "Показатели_продаж"

id продукт месяцы продажа_
1 яблоко 01.01.2000 7890
2 яблоко 01.02.2000 7698
3 яблоко 01.03.2000 7438
4 яблоко 01.04.2000 4493
5 яблоко 01.05.2000 7075
6 яблоко 01.06.2000 6334
7 яблоко 01.07.2000 4452
8 яблоко 01.08.2000 5895
9 груша 01.01.2000 3948
10 груша 01.02.2000 4038
11 груша 01.03.2000 6837
12 груша 01.04.2000 3446
13 груша 01.05.2000 7413
14 груша 01.06.2000 7944
15 груша 01.07.2000 5859
16 груша 01.08.2000 4346

задача:

создать представление (см.ниже) где дополнительный столбец накопленных показателей продаж. т.е. продажа текущего месяца + сумма ранее проданных отдельно по продуктам.

id продукт месяцы продажа_ накопленный
1 яблоко 01.01.2000 7890 7890
2 яблоко 01.02.2000 7698 15588
3 яблоко 01.03.2000 7438 23026
4 яблоко 01.04.2000 4493 27519
5 яблоко 01.05.2000 7075 34594
6 яблоко 01.06.2000 6334 40928
7 яблоко 01.07.2000 4452 45380
8 яблоко 01.08.2000 5895 51275
9 груша 01.01.2000 3948 3948
10 груша 01.02.2000 4038 7986
11 груша 01.03.2000 6837 14823
12 груша 01.04.2000 3446 18269
13 груша 01.05.2000 7413 25682
14 груша 01.06.2000 7944 33626
15 груша 01.07.2000 5859 39485
16 груша 01.08.2000 4346 43831

сразу на ум приходит следующий запрос:

SELECT Показатели_продаж.*, SUM(Показатели_продаж_1.продажа) AS накопленный
FROM Показатели_продаж INNER JOIN Показатели_продаж AS Показатели_продаж_1
ON Показатели_продаж.продукт=Показатели_продаж_1.продукт AND
Показатели_продаж.месяцы>=Показатели_продаж_1.месяцы
GROUP BY Показатели_продаж.id, Показатели_продаж.продукт, Показатели_продаж.месяцы, Показатели_продаж.продажа

по мне такой запрос не очень производительный если будет огромная таблица.


вопрос:
как такие задачи можно оптимизировать?

в екселе такие задачи решается ссылкой на верхнюю ячейку (уже суммированную) , можно в SQLite сделать что то подобное? а не суммировать для каждой строке целую копию таблицы)))
Ответ: СерЖалгас, как же нечитаемо выглядит запрос с таблицами и полями на русском языке...
Пусть есть таблица:
prod_id|prod_name|month|sale|accum
Нужно получить ее + столбец accum - который состоит из суммы за месяц + сумма продаж данного продукта заранее(?).
Столбец accum можно получить следующим запросом:
select (q.sale + (select sum(w.sale) from table_name w where trunc(w.month,'Month')<=to_date('01.0n,2000','dd.mm.yyyy'))) as "accum" from table_name q
Можно подставить этот запрос к основному и получить результирующий набор. Только надо заменить "trunc" на аналогичный оператор в Mysql.
Вопрос: Как оптимизировать запрос?

Всем привет!
Долго выполняется запрос!

SELECT DISTINCT e.* , IF(a_promo.alt_price, a_promo.alt_price, IF((a_promo.discount >0)AND(a_promo.departament_key =23769), a_departaments.DepRetail * a_promo.discount /100, IF(e.Key_Sip NOT IN (40823,40824,40838,40839,40840,40841,40842,40843,40844,40845,40846,40825,40847,40848,40849,40850,40851,40852,40853,40854,40826,40855,40856,40857,40858,40859,40860,40861,40827,40862,40863,40864,40865,40866,40867,40868,40869,40828,40870,40871,40872,40873,40874,40875,40876,40877,40829,40878,40879,40880,40830,40881,40882,40883,40884,40831,40885,40886,40887,40888,40889,40890,40891,40892,40832,40893,40894,40895,40896,40897,40833,40898,40899,40900,40901,40902,40835,40903,40904,40905,40906,40907,40908,40909,40910,40911,40836,40912,40913,40914,40915,42490,42491,42500,42501,42502,42503,42504,42505,42492,42506,42507,42508,42509,42510,42511,42493,42512,42513,42494,42514,42515,42516,42517,42495,42518,42496,42519,42520,42521,42522,42523,42524,42525,42526,42497,42527,42528,42529,42530,42531,42532,42533,42534,42498,42535,42536,42537,42538,42539,42499,42540,42541,42542,42543,23224,25302,25303,25304,25305,25307),a_departaments.DepRetail* 0.9,a_departaments.DepRetail))) AS retailPrice, a_departaments.DepRetail, el_act.name as actName, el_act.action_id
        FROM a_elements e LEFT JOIN a_promo USING (Key_G) LEFT JOIN a_elements_have_images USING (Key_G) LEFT JOIN a_departaments USING (Key_G) LEFT JOIN a_elems_actions el_act USING (Key_G), a_elements_epson
        WHERE a_elements_epson.Key_G = e.Key_G 
        AND e.Key_Sip IN (16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,25611,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16967,16968,16969,16970,16971,16966,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16986,16987,16988,16989,16990,16985,16991,16992,16993,16997)
        ORDER BY exist DESC, have_image DESC, valRating ASC, e.Key_Sip DESC
        LIMIT 12910,10




Пока не очень понимаю как его оптимизировать.

автор
Профилирование:
Состояние Время
starting 0.000015
Waiting for query cache lock 0.000004
checking query cache for query 0.000217
checking permissions 0.000005
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000005
Opening tables 0.000051
System lock 0.000016
Waiting for query cache lock 0.000039
init 0.000204
optimizing 0.000024
statistics 0.011863
preparing 0.012581
Creating tmp table 0.000093
executing 0.000004
Copying to tmp table 7.530905
converting HEAP to MyISAM 0.498932
Copying to tmp table on disk 4.881437
Sorting result 0.120527
Sending data 0.114850
end 0.000016
removing tmp table 0.840435
end 0.000020
query end 0.000006
closing tables 0.000033
freeing items 0.000046
Waiting for query cache lock 0.000004
freeing items 0.000025
Waiting for query cache lock 0.000003
freeing items 0.000003
storing result in query cache 0.000005
logging slow query 0.000004
logging slow query 0.000157
cleaning up 0.000010



Структура таблиц
CREATE TABLE IF NOT EXISTS `a_promo` (
  `key_g` int(11) NOT NULL,
  `alt_price` decimal(9,2) DEFAULT NULL,
  `departament_key` int(11) DEFAULT NULL,
  `discount` int(11) DEFAULT NULL,
  `key_promo_disc` bigint(20) NOT NULL,
  `internet_only` int(11) NOT NULL DEFAULT '0',
  KEY `key_g` (`key_g`),
  KEY `departament_key` (`departament_key`),
  KEY `key_g_2` (`key_g`,`alt_price`,`departament_key`),
  KEY `key_g_3` (`key_g`,`departament_key`,`discount`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `a_departaments` (
  `Key_G` int(11) NOT NULL,
  `KeyDep` int(5) NOT NULL,
  `DepRetail` float NOT NULL,
  `DepQty` float NOT NULL,
  KEY `Key_G` (`Key_G`,`KeyDep`,`DepRetail`,`DepQty`),
  KEY `KeyDep` (`KeyDep`,`DepQty`),
  KEY `Key_G_2` (`Key_G`),
  KEY `Key_G_3` (`Key_G`,`KeyDep`,`DepQty`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `a_elements` (
  `Key_G` int(11) NOT NULL,
  `Name` varchar(950) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Retail` float DEFAULT NULL,
  `AnnotFile` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ImageFile` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `IncomeDate` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `IsNew` varchar(3) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `isLeader` varchar(3) COLLATE utf8_unicode_ci NOT NULL,
  `Qty` int(11) DEFAULT NULL,
  `LocCode` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
  `LocName` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Key_Sip` int(11) DEFAULT NULL,
  `IsActive` varchar(3) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `valAuthor` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `valPublishing` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `valSerial` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `valYear` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `valISBN` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `valTranslate` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `valPainter` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `valEdition` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `valWeight` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
  `valRating` int(11) NOT NULL,
  `isHandled` int(2) NOT NULL,
  `checkString` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `last_change` datetime NOT NULL,
  UNIQUE KEY `Key_G` (`Key_G`),
  KEY `Key_Sip` (`Key_Sip`),
  KEY `str2` (`checkString`),
  KEY `strSIP` (`Key_G`,`checkString`),
  KEY `Key_G_2` (`Key_G`,`Retail`,`Qty`,`Key_Sip`),
  KEY `Key_G_3` (`Key_G`,`IsActive`),
  KEY `Key_G_4` (`Key_G`,`Qty`,`IsActive`),
  KEY `valPublishing` (`valPublishing`),
  KEY `Key_G_5` (`Key_G`,`Key_Sip`,`IsActive`,`valSerial`),
  KEY `Key_G_6` (`Key_G`,`Key_Sip`,`IsActive`,`valAuthor`),
  KEY `Key_G_7` (`Key_G`,`Key_Sip`,`IsActive`),
  KEY `Key_G_8` (`Key_G`,`Key_Sip`),
  KEY `valRating` (`valRating`),
  KEY `Key_Sip_2` (`Key_Sip`,`valRating`),
  KEY `Key_G_9` (`Key_G`,`Key_Sip`,`valRating`),
  FULLTEXT KEY `Name` (`Name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `a_elements_have_images` (
  `key_g` int(11) NOT NULL,
  `have_image` tinyint(1) NOT NULL,
  `income_date` date NOT NULL,
  `date_have_image` date NOT NULL,
  UNIQUE KEY `key_g_2` (`key_g`),
  KEY `key_g` (`key_g`,`have_image`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `a_elements_epson` (
  `Key_G` int(11) NOT NULL,
  `exist` tinyint(1) NOT NULL,
  UNIQUE KEY `Key_G_3` (`Key_G`),
  KEY `exist` (`exist`),
  KEY `Key_G_2` (`Key_G`,`exist`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `a_elems_actions` (
  `key_g` int(11) NOT NULL,
  `action_id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  KEY `key_g` (`key_g`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Ответ: tanglir, это те значения, которые дает "большой" запрос.