-- ============================================================= -- setup_smart_meter_region_assignment.sql -- «داشبورد مدیریتی لیست هوشمندسازی» - تفکیک منطقه‌ای کنتورهای هوشمند. -- -- کنتورهای هوشمند (۵ جدول counter_hosh_*) هیچ ستون منطقه‌ای ندارند - فقط -- geom (نقطه). محاسبه‌ی زنده‌ی «کدام منطقه» با ST_Contains روی ۲٫۶ میلیون -- ردیف در هر درخواست داشبورد قابل قبول نیست - دقیقاً همون درسی که در -- setup_voltage_drop_step4_perf_fix.sql برای voltage_line_meter_assignment -- گرفته شد: region_id/region_fa یک‌بار محاسبه و روی خودِ جدول ذخیره -- می‌شود (هندسه‌ی کنتورها ثابت است، تغییر نمی‌کند)، بعد GROUP BY روی -- داشبورد فقط یک ایندکس‌اسکن ساده است. -- -- idempotent: WHERE region_id IS NULL باعث می‌شود اجرای دوباره فقط -- ردیف‌های هنوز-تخصیص‌نیافته را پردازش کند. -- -- ⚠️ روی ۵ جدول بزرگ (بزرگ‌ترین: counter_hosh_khanegi ~۱٫۲۷ میلیون ردیف) -- WAL قابل‌توجهی تولید می‌کند - قبل از اجرا فضای دیسک را چک کن (نگاه کن -- fix_counter_hosh_meter_ids.sql برای تجربه‌ی مشابه قبلی). -- ============================================================= ALTER TABLE counter_hosh_khanegi ADD COLUMN IF NOT EXISTS region_id integer; ALTER TABLE counter_hosh_khanegi ADD COLUMN IF NOT EXISTS region_fa text; ALTER TABLE counter_hosh_tajari ADD COLUMN IF NOT EXISTS region_id integer; ALTER TABLE counter_hosh_tajari ADD COLUMN IF NOT EXISTS region_fa text; ALTER TABLE counter_hosh_sanati ADD COLUMN IF NOT EXISTS region_id integer; ALTER TABLE counter_hosh_sanati ADD COLUMN IF NOT EXISTS region_fa text; ALTER TABLE counter_hosh_omumi ADD COLUMN IF NOT EXISTS region_id integer; ALTER TABLE counter_hosh_omumi ADD COLUMN IF NOT EXISTS region_fa text; ALTER TABLE counter_hosh_keshavarzi ADD COLUMN IF NOT EXISTS region_id integer; ALTER TABLE counter_hosh_keshavarzi ADD COLUMN IF NOT EXISTS region_fa text; -- ترتیب کوچک به بزرگ (اگر وسط راه قطع شد، جدول‌های کوچک‌تر زودتر کامل شده‌اند) UPDATE counter_hosh_sanati c SET region_id = r.id, region_fa = r.name_fa FROM distribution_regions r WHERE ST_Contains(r.geom, c.geom) AND c.region_id IS NULL; UPDATE counter_hosh_keshavarzi c SET region_id = r.id, region_fa = r.name_fa FROM distribution_regions r WHERE ST_Contains(r.geom, c.geom) AND c.region_id IS NULL; UPDATE counter_hosh_omumi c SET region_id = r.id, region_fa = r.name_fa FROM distribution_regions r WHERE ST_Contains(r.geom, c.geom) AND c.region_id IS NULL; UPDATE counter_hosh_tajari c SET region_id = r.id, region_fa = r.name_fa FROM distribution_regions r WHERE ST_Contains(r.geom, c.geom) AND c.region_id IS NULL; UPDATE counter_hosh_khanegi c SET region_id = r.id, region_fa = r.name_fa FROM distribution_regions r WHERE ST_Contains(r.geom, c.geom) AND c.region_id IS NULL; CREATE INDEX IF NOT EXISTS idx_ch_khanegi_region ON counter_hosh_khanegi (region_id); CREATE INDEX IF NOT EXISTS idx_ch_tajari_region ON counter_hosh_tajari (region_id); CREATE INDEX IF NOT EXISTS idx_ch_sanati_region ON counter_hosh_sanati (region_id); CREATE INDEX IF NOT EXISTS idx_ch_omumi_region ON counter_hosh_omumi (region_id); CREATE INDEX IF NOT EXISTS idx_ch_keshavarzi_region ON counter_hosh_keshavarzi (region_id); ANALYZE counter_hosh_khanegi; ANALYZE counter_hosh_tajari; ANALYZE counter_hosh_sanati; ANALYZE counter_hosh_omumi; ANALYZE counter_hosh_keshavarzi; -- ============================================================= -- تأیید (باید عدد صفر یا خیلی کوچک باشد - فقط کنتورهایی که واقعاً بیرون -- هر ۳۹ چندضلعی منطقه هستند بدون region_id می‌مانند) -- ============================================================= SELECT 'khanegi' AS tbl, count(*) AS total, count(region_id) AS assigned FROM counter_hosh_khanegi UNION ALL SELECT 'tajari', count(*), count(region_id) FROM counter_hosh_tajari UNION ALL SELECT 'sanati', count(*), count(region_id) FROM counter_hosh_sanati UNION ALL SELECT 'omumi', count(*), count(region_id) FROM counter_hosh_omumi UNION ALL SELECT 'keshavarzi', count(*), count(region_id) FROM counter_hosh_keshavarzi;