راهنمای بهینه‌سازی عملکرد

Guides
آخرین به‌روزرسانی: ۲۷ بهمن ۱۴۰۴

به راهنمای بهینه‌سازی عملکرد HarborDB خوش آمدید. این منبع جامع به شما کمک می‌کند تا هر جنبه از جریان کاری PostgreSQL خود را بهینه کنید، از نوشتن کوئری‌های کارآمد تا پیکربندی HarborDB و macOS برای حداکثر عملکرد.

درک عوامل مؤثر بر عملکرد

چندین عامل بر عملکرد پایگاه داده شما در HarborDB تأثیر می‌گذارند:

| عامل | تأثیر | سطح بهینه‌سازی | | ---------------------------- | ----------- | ----------------- | | طراحی کوئری | بالا | برنامه | | ایندکس‌های پایگاه داده | بالا | پایگاه داده | | اتصال شبکه | متوسط | زیرساخت | | منابع سیستم | متوسط | macOS | | تنظیمات HarborDB | کم-متوسط | برنامه | | پیکربندی PostgreSQL | بالا | پایگاه داده |

بهینه‌سازی کوئری

نوشتن کوئری‌های کارآمد

۱. فقط آنچه نیاز دارید را انتخاب کنید

-- ❌ ناکارآمد
SELECT * FROM customers;

-- ✅ کارآمد
SELECT customer_id, name, email FROM customers;

۲. از WHERE clause به طور مؤثر استفاده کنید

-- ❌ ناکارآمد (اسکن کامل جدول)
SELECT * FROM orders
WHERE EXTRACT(YEAR FROM order_date) = 2024;

-- ✅ کارآمد (از ایندکس استفاده می‌کند)
SELECT * FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date < '2025-01-01';

۳. محدود کردن مجموعه نتایج

-- همیشه هنگام کاوش محدود کنید
SELECT * FROM large_table LIMIT 100;

-- برای نتایج بزرگ از صفحه‌بندی استفاده کنید
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 50 OFFSET 0;

۴. از مشکلات کوئری N+1 اجتناب کنید

-- ❌ ناکارآمد (چندین کوئری)
-- کوئری اول: SELECT * FROM orders WHERE status = 'pending'
-- سپس برای هر سفارش: SELECT * FROM customers WHERE customer_id = ?

-- ✅ کارآمد (کوئری واحد با JOIN)
SELECT o.*, c.name, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.status = 'pending';

استفاده از EXPLAIN برای تحلیل کوئری‌ها

HarborDB تحلیل عملکرد کوئری را آسان می‌کند:

۱. کوئری خود را بنویسید در ویرایشگر ۲. روی "Explain" کلیک کنید (⚡) در نوار ابزار ۳. برنامه اجرا را مرور کنید در پنل نتایج

درک خروجی EXPLAIN

  • Seq Scan: اسکن کامل جدول (اغلب برای جداول بزرگ کند است)
  • Index Scan: استفاده از ایندکس (معمولاً سریع‌تر)
  • Nested Loop: اتصال جداول (بررسی کنید که مناسب باشد)
  • تخمین هزینه: اعداد بالاتر به معنای کار بیشتر است

الگوهای رایج بهینه‌سازی

-- پیشنهاد اضافه کردن ایندکس گمشده
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 1234;

-- نتیجه ممکن است نشان دهد: "Seq Scan on orders"
-- راه‌حل: CREATE INDEX idx_orders_customer_id ON orders(customer_id);

بهینه‌سازی ایندکس پایگاه داده

زمان اضافه کردن ایندکس‌ها

ایندکس اضافه کنید برای:

  • کلیدهای اصلی (به طور خودکار ایندکس می‌شوند)
  • کلیدهای خارجی (اغلب نیاز به ایندکس دستی دارند)
  • ستون‌های فیلتر شده مکرر
  • ستون‌های مرتب‌شده مکرر
  • ستون‌های استفاده شده در شرایط JOIN

ایجاد ایندکس‌های مؤثر

-- ایندکس تک ستونی
CREATE INDEX idx_orders_status ON orders(status);

-- ایندکس چند ستونی (ترتیب مهم است!)
CREATE INDEX idx_orders_date_status ON orders(order_date, status);

-- ایندکس جزئی (برای زیرمجموعه‌های خاص)
CREATE INDEX idx_active_users ON users(email) WHERE active = true;

-- ایندکس یکتا برای محدودیت
CREATE UNIQUE INDEX idx_unique_email ON users(email);

نگهداری ایندکس

-- بررسی استفاده از ایندکس
SELECT schemaname, tablename, indexname
FROM pg_stat_user_indexes
WHERE idx_scan = 0;  -- ایندکس‌های هرگز استفاده نشده

-- بازسازی ایندکس‌های تکه‌تکه شده
REINDEX INDEX idx_orders_status;

-- به‌روزرسانی آمار برای برنامه‌ریز کوئری
ANALYZE orders;

بهینه‌سازی اتصال

تنظیمات Connection Pool

اتصالات HarborDB خود را بهینه کنید:

۱. Preferences → Connections را باز کنید ۲. تنظیمات را تنظیم کنید بر اساس جریان کاری شما:

| تنظیم | مقدار توصیه شده | هدف | | --------------------- | --------------- | ------------------------- | | Connection Timeout | 30 ثانیه | جلوگیری از اتصالات معطل | | Keep-Alive | فعال | حفظ اتصالات بیکار | | Max Connections | ۵-۱۰ | تعادل عملکرد/حافظه | | SSL Mode | Prefer | امن بدون سربار |

بهینه‌سازی شبکه

برای پایگاه‌های داده از راه دور:

۱. از SSH tunneling استفاده کنید برای اتصالات امن و بهینه ۲. فشرده‌سازی را فعال کنید برای مجموعه نتایج بزرگ ۳. کوئری‌های سنگین را زمان‌بندی کنید در ساعت‌های خارج از اوج ۴. تأخیر شبکه را نظارت کنید با ابزارهای داخلی

-- تست تأخیر شبکه
SELECT 1 as test;  -- کوئری ساده برای اندازه‌گیری زمان رفت و برگشت

تنظیمات عملکرد HarborDB

مدیریت حافظه

استفاده حافظه را در Preferences → Performance تنظیم کنید:

| تنظیم | توصیه | تأثیر | | --------------------- | ------------- | ---------------------------- | | Query Cache | ۲۵۶ MB | کوئری‌های تکرار شده سریعتر | | Result Set Memory | ۵۱۲ MB | مدیریت مجموعه داده‌های بزرگ | | Streaming Mode | فعال | بهتر برای نتایج بزرگ | | Auto-Refresh | ۳۰ ثانیه | تعادل تازگی/عملکرد |

بهینه‌سازی رابط کاربری

۱. انیمیشن‌ها را غیرفعال کنید در Preferences → Appearance ۲. تأخیر auto-complete را کاهش دهید به ۱۰۰ms ۳. عمق auto-expansion نوار کناری را محدود کنید ۴. از حالت تیره استفاده کنید برای کارایی نمایشگر OLED

میانبرهای صفحه‌کلید برای سرعت

این تقویت‌کننده‌های بهره‌وری را تسلط پیدا کنید:

| میانبر | اقدام | زمان ذخیره شده | | ------ | ------------- | -------------- | | ⌘ + R | اجرای کوئری | ۲-۳ ثانیه | | ⌘ + . | لغو کوئری | جلوگیری از انتظارها | | ⌘ + T | تب کوئری جدید | ۱-۲ ثانیه | | ⌘ + S | ذخیره کوئری | ۱ ثانیه | | ⌘ + E | صادرسازی نتایج | ۲ ثانیه | | ⌘ + F | جستجو در کوئری | ۳-۵ ثانیه |

بهینه‌سازی سیستم macOS

ملاحظات سخت‌افزاری

حافظه (RAM)

  • حداقل: ۸ GB برای استفاده پایه
  • توصیه شده: ۱۶ GB برای کار حرفه‌ای
  • بهینه: ۳۲ GB برای مجموعه داده‌های بزرگ

ذخیره‌سازی (SSD)

  • حداقل: ۲۵۶ GB فضای آزاد
  • توصیه شده: ۵۱۲ GB+ برای فایل‌های پایگاه داده و صادرسازی
  • از SSD خارجی استفاده کنید برای ذخیره‌سازی پایگاه داده بزرگ

پردازنده

  • Apple Silicon: M1/M2/M3 بهینه شده
  • Intel: i5 حداقل، i7/i9 توصیه شده

تنظیمات macOS

۱. Energy Saver (System Preferences):

  • "Put hard disks to sleep" را غیرفعال کنید
  • نمایشگر را در طول کوئری‌های طولانی روشن نگه دارید

۲. Activity Monitor:

  • استفاده حافظه HarborDB را نظارت کنید
  • منابع فرآیند PostgreSQL را بررسی کنید

۳. Disk Utility:

  • مطمئن شوید TRIM SSD فعال است
  • سلامت دیسک و فضای آزاد را نظارت کنید

دستورات عملکرد Terminal

# بررسی منابع سیستم
top -o cpu  # استفاده CPU
vm_stat     # استفاده حافظه
iostat      # Disk I/O

# نظارت خاص بر HarborDB
ps aux | grep HarborDB
lsof -p $(pgrep HarborDB) | wc -l  # فایل‌های باز

استراتژی‌های مجموعه داده بزرگ

کار با میلیون‌ها ردیف

۱. صفحه‌بندی سمت سرور

-- به جای بارگذاری تمام ردیف‌ها
SELECT * FROM huge_table;

-- از صفحه‌بندی استفاده کنید
SELECT * FROM huge_table
ORDER BY id
LIMIT 1000 OFFSET 0;

-- صفحه بعدی
SELECT * FROM huge_table
ORDER BY id
LIMIT 1000 OFFSET 1000;

۲. جریان‌دهی نتایج

در Preferences → Performance فعال کنید:

  • ✅ "Enable streaming for results > 10,000 rows"
  • ✅ "Stream chunk size: 1000 rows"
  • ✅ "Background streaming: Enabled"

۳. Viewهای مادی‌شده (Materialized Views)

-- کوئری‌های گران‌قیمت را از پیش محاسبه کنید
CREATE MATERIALIZED VIEW daily_sales_summary AS
SELECT
    DATE(order_date) as day,
    COUNT(*) as orders,
    SUM(total) as revenue
FROM orders
GROUP BY DATE(order_date);

-- به طور دوره‌ای تازه‌سازی کنید
REFRESH MATERIALIZED VIEW daily_sales_summary;

بهینه‌سازی صادرسازی

برای صادرسازی‌های بزرگ:

۱. به CSV صادر کنید (کارآمدتر از JSON) ۲. از صادرسازی تکه‌تکه استفاده کنید (Preferences → Export) ۳. صادرسازی‌ها را به طور خودکار فشرده کنید ۴. مستقیماً به ذخیره‌سازی خارجی صادر کنید

نظارت بر عملکرد

ابزارهای داخلی HarborDB

۱. Query Timer: زمان اجرا را در نوار وضعیت نشان می‌دهد ۲. Memory Monitor: در Window → Performance Monitor مشاهده کنید ۳. Connection Status: معیارهای شبکه بلادرنگ ۴. Query History: عملکرد کوئری گذشته را مرور کنید

کوئری‌های نظارت PostgreSQL

-- کوئری‌های فعال
SELECT
    pid,
    usename,
    query_start,
    state,
    query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY query_start DESC;

-- کوئری‌های کند
SELECT
    query,
    calls,
    total_time,
    mean_time,
    rows
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;

-- آمار جدول
SELECT
    schemaname,
    relname,
    seq_scan,
    idx_scan,
    n_tup_ins,
    n_tup_upd,
    n_tup_del
FROM pg_stat_user_tables
ORDER BY seq_scan DESC;

مشکلات رایج عملکرد و راه‌حل‌ها

مشکل: "کوئری خیلی طول می‌کشد"

چک‌لیست راه‌حل:

۱. [ ] ایندکس‌های مناسب اضافه کنید ۲. [ ] کوئری را بازنویسی کنید تا کارآمدتر باشد ۳. [ ] پیکربندی PostgreSQL را بررسی کنید ۴. [ ] اتصال شبکه را تأیید کنید ۵. [ ] در صورت نیاز تنظیمات timeout را افزایش دهید

مشکل: "HarborDB حافظه زیادی استفاده می‌کند"

مراحل راه‌حل:

۱. اندازه کش کوئری را کاهش دهید (Preferences → Performance) ۲. تب‌های کوئری استفاده نشده را ببندید ۳. HarborDB را به طور دوره‌ای ری‌استارت کنید ۴. برای نشت حافظه بررسی کنید (Activity Monitor) ۵. اگر به طور مداوم به محدودیت‌ها می‌رسید RAM سیستم را افزایش دهید

مشکل: "صادرسازی/واردسازی بسیار کند است"

نکات بهینه‌سازی:

۱. از قالب CSV به جای JSON استفاده کنید ۲. اسکن آنتی‌ویروس روی پوشه هدف را غیرفعال کنید ۳. به SSD به جای HDD صادر کنید ۴. برای عملیات بسیار بزرگ از ابزارهای بومی PostgreSQL (pg_dump/pg_restore) استفاده کنید ۵. عملیات بزرگ را به دسته‌های کوچکتر تقسیم کنید

مشکل: "رابط کاربری احساس کندی می‌دهد"

رفع سریع:

۱. رنگ‌آمیزی نحوی را برای کوئری‌های بسیار بزرگ غیرفعال کنید ۲. auto-expansion نوار کناری را کاهش دهید ۳. از تم UI ساده‌تر استفاده کنید ۴. سایر برنامه‌های با مصرف منابع بالا را ببندید ۵. HarborDB و macOS را مجدداً راه‌اندازی کنید

تکنیک‌های بهینه‌سازی پیشرفته

پارتیشن‌بندی جداول بزرگ

-- ایجاد جدول پارتیشن‌بندی شده
CREATE TABLE orders_partitioned (
    order_id BIGSERIAL,
    order_date DATE NOT NULL,
    customer_id INT,
    total DECIMAL(10,2)
) PARTITION BY RANGE (order_date);

-- ایجاد پارتیشن‌ها
CREATE TABLE orders_2024_q1 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

CREATE TABLE orders_2024_q2 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

نکات برنامه کوئری (Query Plan Hints)

-- اجبار به استفاده از ایندکس (با احتیاط استفاده کنید)
SET enable_seqscan = off;

-- افزایش موقت حافظه کار
SET work_mem = '64MB';

-- استفاده از روش join خاص
SET enable_nestloop = off;
SET enable_hashjoin = on;

Connection Pooling با PGBouncer

برای برنامه‌های با همروندی بالا:

۱. PGBouncer را نصب کنید (Homebrew: brew install pgbouncer) ۲. برای transaction pooling پیکربندی کنید ۳. HarborDB را از طریق PGBouncer متصل کنید ۴. آمار استفاده مجدد اتصال را نظارت کنید

تست عملکرد

ایجاد کوئری‌های بنچمارک

-- تست عملکرد کوئری
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
  AND status = 'completed'
ORDER BY total DESC
LIMIT 100;

-- مقایسه با رویکردهای مختلف
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE status = 'completed'
  AND order_date >= '2024-01-01'
  AND order_date <= '2024-12-31'
ORDER BY total DESC
LIMIT 100;

نظارت در طول زمان

جدول لاگ عملکرد ایجاد کنید:

CREATE TABLE query_performance_log (
    log_id SERIAL PRIMARY KEY,
    query_hash TEXT,
    execution_time_ms INTEGER,
    row_count INTEGER,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    notes TEXT
);

-- لاگ کردن کوئری‌های کند
INSERT INTO query_performance_log
    (query_hash, execution_time_ms, row_count, notes)
SELECT
    md5(query),
    EXTRACT(MILLISECONDS FROM NOW() - query_start),
    result_rows,
    'Slow query detected'
FROM pg_stat_activity
WHERE state = 'active'
  AND NOW() - query_start > INTERVAL '5 seconds';

خلاصه بهترین شیوه‌ها

جریان کاری روزانه

۱. با EXPLAIN شروع کنید برای کوئری‌های پیچیده جدید ۲. از LIMIT استفاده کنید هنگام کاوش داده ۳. اتصالات استفاده نشده را ببندید ۴. HarborDB را به طور منظم ری‌استارت کنید (هفتگی) ۵. منابع سیستم را در طول کار سنگین نظارت کنید

نگهداری هفتگی

۱. لاگ‌های عملکرد کوئری را مرور کنید ۲. ایندکس‌های استفاده نشده را بررسی کنید ۳. آمار PostgreSQL را به‌روزرسانی کنید (ANALYZE) ۴. فایل‌های موقت را پاک کنید ۵. پیکربندی‌های عملکرد را پشتیبان‌گیری کنید

بررسی ماهانه

۱. الگوهای کوئری کند را تحلیل کنید ۲. پارتیشن‌بندی جدول را برای رشد در نظر بگیرید ۳. نیازهای سخت‌افزاری را مرور کنید ۴. HarborDB و PostgreSQL را به‌روزرسانی کنید ۵. بهبودهای عملکرد را مستند کنید

دریافت کمک

پشتیبانی تنظیم عملکرد

اگر به کمک بیشتری نیاز دارید:

۱. برنامه‌های کوئری را به اشتراک بگذارید با تیم پشتیبانی ما ۲. لاگ‌های عملکرد را صادر کنید (Preferences → Export Logs) ۳. مشخصات سیستم را شامل کنید (نسخه macOS، RAM، ذخیره‌سازی) ۴. جریان کاری خود را توصیف کنید و اندازه‌های معمول مجموعه داده

منابع اضافی

آیا این مفید بود؟

با ارائه بازخورد به ما کمک کنید این مستندات را بهبود بخشیم.