SQL и Анализ данных
Базы данных и всё, что с ними связано! Сотрудничество: @haarrp РКН № 6766085482
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام SQL и Анализ данных
تُعد قناة SQL и Анализ данных (@databases_tg) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 12 623 مشتركاً، محتلاً المرتبة 10 066 في فئة التكنولوجيات والتطبيقات والمرتبة 52 299 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 12 623 مشتركاً.
بحسب آخر البيانات بتاريخ 23 يونيو, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -102، وفي آخر 24 ساعة بمقدار -8، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 17.81%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 7.80% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 2 248 مشاهدة. وخلال اليوم الأول يجمع عادةً 984 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 8.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل sql, индекс, user_id, строка, субд.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Базы данных и всё, что с ними связано!
Сотрудничество: @haarrp
РКН № 6766085482”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 24 يونيو, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
date DESC, id DESC, лимит на 1000 записей и composite index по (date, id). На первый взгляд, все должно работать быстро.
Но EXPLAIN ANALYZE показывает другое: Postgres вроде бы использует Index Scan, но после этого выкидывает 900 000 строк через Filter.
То есть индекс есть, но запрос все равно тащит слишком много лишнего.
Проблема в условии:
`date < @date OR (date = @date AND id <= @lastId)`
Для разработчика это выглядит логично: сначала сравниваем дату, потом id.
Но для оптимизатора такой OR плохо ложится на composite index. В итоге база не может сразу пойти по нужному диапазону и вынуждена фильтровать огромный кусок данных.
Правильнее записать условие через tuple comparison:
`(date, id) <= (@date, @lastId)`
Смысл тот же, но для Postgres это уже понятный диапазон по составному индексу.
И результат: 298 мс превращаются в 0,66 мс.
Индекс сам по себе ничего не гарантирует.
Важно не только создать индекс, но и написать запрос так, чтобы оптимизатор реально смог его использовать.a * b * c = exp(ln(a) + ln(b) + ln(c))То есть вместо прямого произведения считаем сумму логарифмов.
SELECT
user_id,
EXP(SUM(LN(probability))) AS total_probability
FROM events
WHERE probability > 0
GROUP BY user_id;
Где это полезно:
SELECT
user_id,
EXP(SUM(LN(conversion_rate))) AS funnel_survival_rate
FROM funnel_steps
GROUP BY user_id;
Это стандартный численный прием из математики, который делает расчет стабильнее.
Особенно полезно, когда у тебя много шагов в воронке, вероятностная модель, риск-скоринг или аналитика событий.
Главное правило: LN(x) работает только для x > 0, поэтому нули нужно обрабатывать отдельно. Например, если хотя бы одна вероятность равна нулю, итоговое произведение тоже будет ноль. async Task<IActionResult> пишется на автомате. Вы точно знаете, почему EF Core сгенерировал именно такой SQL - и как переписать запрос, чтобы он летал.
Это не фантазия. Это результат после 16 модулей, в которых каждая концепция объясняется через код и закрепляется практикой.
ООП, SOLID, LINQ, async/await, DI, EF Core, ASP.NET Core, Docker, Kubernetes - всё, что казалось магией, станет рабочим инструментом.
А бонусом - портфолио проектов: от CLI-утилит и REST API до собственного SaaS с multi-tenancy, JWT и деплоем в Kubernetes под TLS.
Скидка - 58% доступна 48 часов: https://stepik.org/a/282984/
SELECT *
FROM orders
WHERE user_id = 42
AND status = 'active';
Обычный индекс:
CREATE INDEX idx_orders_user_status
ON orders(user_id, status);
Работает, но он хранит данные по всем статусам: active, cancelled, archived, failed и так далее.
Если чаще всего нужны только активные заказы, можно сделать partial index:
CREATE INDEX idx_orders_active_user
ON orders(user_id)
WHERE status = 'active';
Такой индекс меньше, быстрее обновляется и лучше помещается в память. Планировщик сможет использовать его для запросов, где условие совпадает:
SELECT *
FROM orders
WHERE user_id = 42
AND status = 'active';
Индекс не обязан покрывать всю таблицу. Иногда лучший индекс - это индекс только по тем строкам, которые реально участвуют в горячих запросах.
Особенно полезно для флагов вроде deleted_at IS NULL, status = 'active', is_published = true, processed = false.
#sql #postgresql #database #backend
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
