Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Медленный запрос с условием IN  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3192
Клиентская часть приложения формирует список ID, по которым необходимо загрузить данные. И далее на сервер отправляется запрос, приведенный ниже. Время выполнения такого запроса порядка 10 минут, возвращается 537 строк. При этом запрос select * from dbo.vPhrase выполняется за секунда и возвращает 25 000 строк.

Помогите, пожалуйста, что мне необходимо сделать, чтобы существенно ускорить работу такого запроса?

select * from dbo.vPhrase
where pg_id in ( 2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,
2381,2382,2383,2384,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,
2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,
2432,2433,2434,2435,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,
2395,2396,2397,2399,2400,2401,2402,2403,2404,2405,2406,2407,2436,2437,
2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,
2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,
2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,
2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,
2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,
2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,
2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,
2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,
2592,2593,2594,2595,2596,2597,2560,2561,2562,2563,2564,2565,2566,2567,
2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2599,2600,2601,2602,
2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,
2617,2618,2619,2643,2644,2645,2646,2647,2648,2650,2651,2652,2653,2620,
2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,
2635,2636,2637,2638,2639,2640,2641,2642,2654,2655,2656,2657,2658,2659,
2660,2661,2662,2663,2664,2665,2666,2667,2668,2669)
3 фев 18, 14:17    [21162798]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос с условием IN  [new]
Добрый Э - Эх
Guest
Vsevolod V,

Структуру таблицы, схему ее индексации и план запроса - предлагается угадать?
3 фев 18, 14:46    [21162845]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос с условием IN  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3192
vPhrase
SELECT        p.p_id, p.pp_id, p.p_phrase, p.del, pg.pg_id, pg.pg_name, p.s_id, p.p_date_1, p.p_showsYa, p.p_period, p.p_showsYaQ, p.p_isForUser, ISNULL(pp.qh_pos, 1000) 
                         AS qh_pos
FROM            dbo.tPhrase AS p LEFT OUTER JOIN
                         dbo.tGroupsToPhrase AS gp ON p.p_id = gp.p_id INNER JOIN
                         dbo.tPhraseGroups AS pg ON gp.pg_id = pg.pg_id LEFT OUTER JOIN
                         dbo.vPhrasePos AS pp ON p.pp_id = pp.p_id AND p.p_phrase = pp.qh_phrase


vPhrasePos
SELECT        p_id, qh_phrase, qh_pos
FROM            dbo.t_SEO_QueryHistory AS qh
WHERE        (hl_id =
                             (SELECT        MAX(hl_id) AS Expr1
                               FROM            dbo.t_SEO_QueryHistory
                               WHERE        (p_id = qh.p_id)))
3 фев 18, 14:55    [21162860]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос с условием IN  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3192
Уточните, пожалуйста, каким образом вывести информацию по схеме индексации и плану запроса?
3 фев 18, 14:56    [21162861]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос с условием IN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31326
Vsevolod V
Уточните, пожалуйста, каким образом вывести информацию по схеме индексации и плану запроса?
В SSMS найдите кнопочку Include Actual Execution Plan, и включите её перед выполнением запроса.
Потом выполните по одному запросы с "in" и без него, каждый раз после выполнения переключаясь на вкладку статистики, и сохраняя план запроса в файл. Получившиеся 2 файла выложите здесь.
3 фев 18, 15:11    [21162875]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос с условием IN  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3192
Направляю

К сообщению приложен файл (1.zip - 15Kb) cкачать
3 фев 18, 15:24    [21162892]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос с условием IN  [new]
invm
Member

Откуда: Москва
Сообщений: 9265
Проблема в vPhrasePos. Если без подробностей, в плане без in таблица dbo.t_SEO_QueryHistory сканируется 1 раз, с in - 12 раз. В таблице 4614900 строк.

1. Создайте индекс
create index <IndexName> on dbo.t_SEO_QueryHistory (p_id, hl_id) include qh_phrase, qh_pos) where hl_id is not null;

2. vPhrasePos перепишите так
create view dbo.vPhrasePos
as
with t as
(
 select
  p_id, qh_phrase, qh_pos,
  row_number() over (partitoin by p_id order by hl_id desc) as rn
 from
  dbo.t_SEO_QueryHistory
 where
  hl_id is not null
)
select
 p_id, qh_phrase, qh_pos
from
 t
where
 rn = 1;
3 фев 18, 15:58    [21162935]     Ответить | Цитировать Сообщить модератору
 Re: Медленный запрос с условием IN  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3192
Спасибо!
3 фев 18, 16:25    [21162981]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить