malyj_gorgan: (Default)
[personal profile] malyj_gorgan
Я тут пару разів писав всякі співбесідні штучки, і вони, o tempora, o, mores, викликали більше інтересу ніж майже будь яка інша тема, крім холіварів про дискримінацію і здорогвий глузд. Що ж, будемо популістами, додаю теґ про співбесіди і пощу ще одну задачку з минулорічних. На неї давали хвилин 5, ну, 10, якщо переписувати код, а не лише критикувати. А потім мені сказали, що лише двоє кандидатів нормально відповіли. (Нас і найняли, гиги.) Враховуючи, що це найперше завдання в довгому процесі відсіяння, навіть цікаво, мо, справді, хороша задачка?Enjoy, значиться...

Let’s say you’re running a query that looks like this:

WITH cte AS (
  SELECT DISTINCT t1.x, t2.abc, t2.bcd, t2.cde,t2.def
  FROM t1 LEFT JOIN t2 ON t1.x = t2.x
  WHERE t1.y LIKE 'some_string%' AND SUBSTRING(t1.y, 1, 4) = 'some'
  ORDER BY t1.x ASC, t2.abc DESC
  )

SELECT COUNT(DISTINCT cte.x) AS num_x,
       t3.some_date,
       COUNT(DISTINCT t3.z)
FROM cte LEFT JOIN t3 ON cte.x = t3.x
WHERE LOWERCASE(t3.x) LIKE '%some_other_string%'
      AND LOWERCASE(cte.x) NOT LIKE '%yet_another_string%'
GROUP BY t3.some_date
HAVING t3.some_date > some_start_date AND t3.some_date < some_end_date
ORDER BY num_x ASC
LIMIT 10


It is taking a really long time, and showing no signs of finishing even after you took a lunch break. You realize that t1, t2 and t3 all have several billion rows each. What would you potentially change to speed up the query, and why?

Date: 2021-03-19 11:32 pm (UTC)
ukurainajin: (Default)
From: [personal profile] ukurainajin
Тут кодерів багато, гадаю :) Щось зрозуміле.
Мені співбесіду якось розпочали з питання, що таке змінна, і кількох завдань на логіку дитячого рівня. На моє здивування відповіли, що хочуть подивитися, як людина мислить.
Edited Date: 2021-03-19 11:33 pm (UTC)

Date: 2021-03-20 12:01 am (UTC)
ppk_ptichkin: (Default)
From: [personal profile] ppk_ptichkin
>датазнавцем

Как будет по украински "человек, специализирующийся в накручивании хвостов быкам базам данных"?

Date: 2021-03-20 02:22 am (UTC)
ppk_ptichkin: (Default)
From: [personal profile] ppk_ptichkin
:)
(из любопытства)

Я SQL не знаю совсем, as in "совсем", но это?
>WHERE t1.y LIKE 'some_string%' AND SUBSTRING(t1.y, 1, 4) = 'some'

и наверное ещё много, но см. выше.

(no subject)

From: [personal profile] ppk_ptichkin - Date: 2021-03-20 03:25 pm (UTC) - Expand

Date: 2021-03-20 12:02 am (UTC)
ukurainajin: (Default)
From: [personal profile] ukurainajin
Я лише поверхово розумію, що воно отримує десять результатів. А так щоби сказати, в чому неоптимальність — взагалі швах. Для мене, якщо записів мільярди, то це вже надовго :) Треба скинути дебешникові, хай порозважається.

Date: 2021-03-20 01:48 am (UTC)
paserbyp: (Default)
From: [personal profile] paserbyp
Трохи DBA, трохи System Admin, трохи DevOps, трохи QA, трохи Technical Writer, а зарплатня? Зарплатня як у Entry Level Technician...

(no subject)

From: [personal profile] paserbyp - Date: 2021-03-20 02:12 am (UTC) - Expand

(no subject)

From: [personal profile] juan_gandhi - Date: 2021-03-20 02:58 am (UTC) - Expand

(no subject)

From: [personal profile] ppk_ptichkin - Date: 2021-03-20 01:06 pm (UTC) - Expand

Date: 2021-03-20 03:48 am (UTC)
ukurainajin: (Default)
From: [personal profile] ukurainajin
А навіщо там перевірка на різні значення для LOWERCASE(t3.x) і LOWERCASE(cte.x)? Я правильно розумію, що таблиці об'єднано за збігом тих полів?

(no subject)

From: [personal profile] ukurainajin - Date: 2021-03-20 04:27 am (UTC) - Expand

(no subject)

From: [personal profile] ukurainajin - Date: 2021-03-20 04:38 am (UTC) - Expand

(no subject)

From: [personal profile] ukurainajin - Date: 2021-03-20 04:52 am (UTC) - Expand

(no subject)

From: [personal profile] ukurainajin - Date: 2021-03-20 05:39 am (UTC) - Expand

(no subject)

From: [personal profile] mprotsenko - Date: 2021-03-20 07:49 pm (UTC) - Expand

(no subject)

From: [personal profile] sassa_nf - Date: 2021-03-20 07:21 am (UTC) - Expand

Date: 2021-03-19 11:51 pm (UTC)
paserbyp: (Default)
From: [personal profile] paserbyp
Давно і всім відомо що відповідати на питааня по програмуванню на час - це робіть з людини зомбі який вміє щвидко розвязувати задачі які нікому не потрібні але не вміють працювати у команді де треба спілкуватися і вчитися не приходячи до розуму... коли ці зомбі з переляку не можуть закінчити розробку і треба все переробляти, що вони зліпили, то стає ясним що щось треба виправити на співбеседі...

Date: 2021-03-20 01:42 am (UTC)
paserbyp: (Default)
From: [personal profile] paserbyp
Ніякої користі для кандидата тут немає бо якщо кандидат не вміє комунікувати в команді всі ці 10 хвилин до сраки дверці!
Edited Date: 2021-03-20 01:43 am (UTC)

(no subject)

From: [personal profile] paserbyp - Date: 2021-03-20 02:09 am (UTC) - Expand

(no subject)

From: [personal profile] paserbyp - Date: 2021-03-20 04:30 am (UTC) - Expand

(no subject)

From: [personal profile] paserbyp - Date: 2021-03-20 01:56 pm (UTC) - Expand

(no subject)

From: [personal profile] mprotsenko - Date: 2021-03-20 05:54 pm (UTC) - Expand

(no subject)

From: [personal profile] juan_gandhi - Date: 2021-03-20 02:56 am (UTC) - Expand

Date: 2021-03-20 01:04 am (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Хотя задача и похоже на реализм, я б держался как можно дальше от контор, где возникают подобного рода задачи. Или начал бы с вопросов, на хрена такой cte вообще. Но задача реальная, да.

Date: 2021-03-20 02:55 am (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Ну, в реале размер этих кверей нужно умножить на 10, если не на 100.

Date: 2021-03-20 07:10 am (UTC)
From: [personal profile] sassa_nf
викинути like. Скажімо, у with.... це зробити легко.

оскільки всі strings фіксовані, створити індексовану колонку, яку заповнювати при заповненні таблиці. ну, власне, можна і пост-фактом це зробити, але я не уявляю, чи швидше це буде (сучасні БД багато таких питань вирішують без участі лохів від архітектури своїх даних).

сучасні БД дозволяють створювати індекси навіть по текстових колонках для пошуку на зразок like. (нещодавно якраз дивились на функцію CONTAINS() - щоправда, у всіх БД свої назви, реалізації та нюанси)

Date: 2021-03-20 07:52 pm (UTC)
From: [personal profile] sassa_nf
select count(distinct x) as num_x,
some_date,
count(distinct z)
from t3
where x in (select x from t1 where substring(y, 1, 11) = 'some_string' and lowercase(x) like '%some_other_string%' and lowercase(x) not like '%yet_another_string%')
group by some_date.... (etc)

Date: 2021-03-20 10:22 pm (UTC)
From: [personal profile] sassa_nf
А мені цікаво, чи справді where x in (select ...) працюватиме по-іншому в плані швидкості?

Я це, звичайно, цілий день ходив, обмірковував. Нарешті спробував з'ясувати, що саме там малось на увазі. Не просто, якщо не знаєш схеми - хто там ключі, а хто foreign key (а може й зовсім не key ні в t1, ні в t2). І чи не швидше було б, скажімо, спочатку t3 профільтрувати по датах, а вже серед них шукати підходящі x. Бо є різниця - чи то про однакові x створюються нові рядки на щодень (тоді краще фільтрувати підходящі x), чи то щодня створюються нові x (тоді краще спочатку відсіяти по датах).

(no subject)

From: [personal profile] sassa_nf - Date: 2021-03-20 11:04 pm (UTC) - Expand

Date: 2021-03-20 10:16 pm (UTC)
From: [personal profile] sassa_nf
а, я забув? та ні, я просто мав на увазі "і так далі" - облом було переписувати <

(no subject)

From: [personal profile] sassa_nf - Date: 2021-03-21 08:29 am (UTC) - Expand

Profile

malyj_gorgan: (Default)
malyj_gorgan

January 2026

S M T W T F S
     1 23
45 6 7 8910
11121314151617
18192021222324
25262728293031

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 12th, 2026 02:20 pm
Powered by Dreamwidth Studios