Этот запрос принимает динамический ввод вместо cg.ownerid IN (294777,228649, 188464). Когда вход увеличивается в состоянии IN, запрос занимает слишком много времени для выполнения. Пожалуйста, предложите мне способ его оптимизации.Как оптимизировать sql-запрос
Например, запрос ниже занимает 4 секунды, если я уменьшаю список до только IN (188464), просто беря 1 секунду.
SELECT *
FROM
(SELECT *,
Row_number() OVER(
ORDER BY datecreated DESC) AS rownum
FROM
(SELECT DISTINCT c.itemid,
(CASE WHEN (Isnull(c.password, '') <> '') THEN 1 ELSE 0 END) AS password,
c.title,
c.encoderid,
c.type,
(CASE WHEN c.author = 'education' THEN 'Discovery' ELSE c.type END) AS TYPE,
c.publisher,
c.description,
c.author,
c.duration,
c.copyright,
c.rating,
c.userid,
Stuff(
(SELECT DISTINCT ' ' + NAME AS [text()]
FROM firsttable SUB
LEFT JOIN secondtable AS rgc ON thirdtable = rgc.id
WHERE SUB.itemid = c.itemid
FOR xml path('')), 1, 1, '')AS [Sub_Categories]
FROM fourthtable AS cg
LEFT JOIN item AS c ON c.itemid = cg.itemid
WHERE Isnull(title, '') <> ''
AND c.active = '1'
AND c.systemid = '20'
AND cg.ownerid IN (294777,
228649,
188464)) AS a) AS b
WHERE rownum BETWEEN 1 AND 32
ORDER BY datecreated DESC
как вы взяли динамические входы ?? ownerid является varchar ??? Вы разделили их и использовали? или взяли данные из какого-то подзапроса? –
Сначала выполните WHERE плюс ROW_NUMBER (в 'c' и' cg', в CTE или в производной таблице), и после уменьшения количества строк до 32 вы выполняете STUFF. Btw, ваш LEFT JOIN на самом деле является INNER JOIN из-за условия WHERE на 'c' – dnoeth
ownerID получен как список данных varchar из пользовательского интерфейса. – user4130072