SQL-команды зависают при запросе при использовании с CONCAT - PullRequest
0 голосов
/ 14 марта 2019

У меня есть следующие команды, которые я выполняю на MySQL для базы данных Jira:

SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY 
FROM AO_A912D8_SYNC_INFORMATION 
WHERE substr(LOCAL_ISSUE_KEY, 5) 
IN 
  (SELECT issuenum 
  FROM jiraissue 
  WHERE issuetype 
  IN
    (SELECT ID
    FROM issuetype
    WHERE pname = "Story"
    )
  )
;

Это работает как чудо, однако я не удовлетворен, так как длина значения в LOCAL_ISSUE_KEY является переменной: EFW-12345 или FWAI-5432.Поэтому мне пришлось бы изменить на substr(LOCAL_ISSUE_KEY, 5) или substr(LOCAL_ISSUE_KEY, 6)

Поэтому я хотел сделать что-то другое и сделать WHERE IN проверку правильной строки благодаря CONCAT(), вместовычесть часть этого.

Как черновик, я сначала попробовал с этим:

SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY 
FROM AO_A912D8_SYNC_INFORMATION 
WHERE LOCAL_ISSUE_KEY
IN 
  (SELECT CONCAT('EFW-',issuenum) 
  FROM jiraissue 
  WHERE issuetype 
  IN
    (SELECT ID
    FROM issuetype
    WHERE pname = "Story"
    )
  )
;

Но это не работает, запрос продолжается вечно

Обратите внимание, что он может выполнить запрос с чем-то вроде этого:

SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY 
FROM AO_A912D8_SYNC_INFORMATION 
WHERE LOCAL_ISSUE_KEY
IN 
  (CONCAT('EFW-','58276')) 
;

Я также попытался с большим количеством () вокруг SELECT CONCAT(), но он все еще помещал базу данных для поиска какпсих.Процессор уходит на 100%.

Для информации, запрос на втором SELECT работает:

SELECT CONCAT('EFW-',issuenum) FROM jiraissue WHERE issuetype IN (SELECT ID FROM issuetype WHERE pname = "Story" );
10610 rows in set (0.06 sec)

Вот как пример данных:

issuetype
ID      pname
10000   Epic
10001   Story

jiraissue
ID      issuenum    PROJECT issuetype 
154705  1942        12000   10001

project
ID      pname       pkey
12000   myproject   EFW

AO_A912D8_SYNC_INFORMATION
LOCAL_ISSUE_KEY REMOTE_ISSUE_KEY
EFW-1942        ABC-12354

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Я не знаю, насколько велики ваши столы, т. Е. Сколько магазинов jiraissues или проектов.Но вы пробовали, если это работает быстрее?

SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY 
FROM AO_A912D8_SYNC_INFORMATION 
WHERE LOCAL_ISSUE_KEY
IN 
  (SELECT distinct CONCAT('EFW-',issuenum) 
  FROM jiraissue 
  WHERE issuetype 
  IN
    (SELECT distinct ID
    FROM issuetype
    WHERE pname = "Story"
    )
  )
;
0 голосов
/ 14 марта 2019

Вы можете попробовать использовать: SUBSTRING_INDEX(str, delim, count)

В вашем случае: SUBSTRING_INDEX(LOCAL_ISSUE_KEY, "-", 1)

Не используйте CONCAT, потому что он слишком тяжелый, так как вам нужно изменить весь результат в подзапросе.

или даже лучше: RIGHT(str, len) -> вместо len, используйте SUBSTRING_INDEX

...