הגדרת חלוקת טבלאות PostgreSQL (Range/List/Hash)

האם הטבלאות שלך גדלות, השאילתות מאטות, ותחזוקת מסד הנתונים הופכת לשגרה? אנו מגדירים partitioning הצהרתי ב-PostgreSQL (Range/List/Hash) כדי להחזיר את המהירות והניהוליות. הצוות שלנו מספק פרויקטים סוהריים—מביקורת ועד יישום ותמיכה שוטפת—תוך הבטחת פעילות יציבה ללא פספוס מועדים.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1331
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    783
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

הגדרת חלוקת טבלאות ב-PostgreSQL (Range/List/Hash)

תארו לעצמכם שטבלת events שלכם גדלה ל-2 מיליארד שורות. VACUUM נמשך שעות, pg_dump יוצר קובץ של 400 ג'יגה-בייט, ומחיקת נתונים ישנים עם DELETE חוסמת כתיבות למשך שעות—העסק שלכם סובל. הלקוחות שלנו מגיעים עם כאבים כאלה, ואנחנו פותרים אותם באמצעות חלוקה הצהרתית—מקצה לקצה, מבדיקה ועד תמיכה. ב-7+ שנים, ראינו מאות טבלאות: ב-90% מהמקרים, חלוקה פותרת את בעיית הביצועים ללא שינויי קוד. לפי הנתונים שלנו, חלוקה מוגדרת כראוי מפחיתה את זמן השאילתה פי 50 ואת נפח הגיבוי ב-70%. לקוח אחד חסך 15,000 דולר בשנה על אחסון על ידי ארכוב של חלוקות ישנות.

חלוקה מחלקת טבלה גדולה אחת למספר חלוקות פיזיות. המנגנון מובנה ב-PostgreSQL מאז גרסה 10 ומאיץ שאילתות, מפשט את ניהול הנתונים ומפחית את עומס מסד הנתונים. במאמר זה, נסקור את בחירת סוג החלוקה, אוטומציה והעברה עם זמן השבתה מינימלי. אנו מספקים תוכנית עבודה שקופה, לוחות זמנים קבועים ו-SLA. הניסיון שלנו מאושר על ידי 50+ פרויקטים מוצלחים.

מדוע חלוקה מאיצה שאילתות?

שלושה מנגנונים מרכזיים:

  • גיזום חלוקות—המתכנן מוציא חלוקות לא רלוונטיות מהתוכנית, ומפחית את זמן הסריקה פי 10–100.
  • מחיקת נתונים מיידית—DROP TABLE על חלוקה מסתיים במילישניות, אינו חוסם את הטבלה ואינו מנפח את ה-WAL.
  • תחזוקה מקבילית—VACUUM, ANALYZE וגיבויים יכולים להתבצע על חלוקות בודדות.

בטבלה של 500 ג'יגה-בייט, צפינו בהאצת שאילתות מ-30 שניות ל-300 מילישניות—שיפור של פי 100. מחיקת חודש ישן עם DROP במקום DELETE מהירה פי 1000.

כיצד לבחור את סוג החלוקה?

הטבלה שלהלן מסייעת בבחירה:

סוג מפתח תרחיש דוגמה
Range טווח (תאריך, מזהה) סדרות זמן, לוגים created_at
List רשימת ערכים נתונים קטגוריאליים region, status
Hash פונקציית גיבוב התפלגות אחידה user_id

Range עובד עבור נתונים עם סדר טבעי—לוגים, מדדים, עסקאות. List מיועד לקבוצה סופית של קטגוריות. Hash משמש כאשר יש צורך בהתפלגות אחידה אך אין מפתח ברור.

חלוקת Range: מקרה טיפוסי לנתוני סדרות זמן

-- Родительская таблица
CREATE TABLE events (
    id BIGSERIAL,
    created_at TIMESTAMPTZ NOT NULL,
    user_id BIGINT NOT NULL,
    event_type VARCHAR(64) NOT NULL,
    payload JSONB
) PARTITION BY RANGE (created_at);

-- Создание партиций (вручную или через pg_partman)
CREATE TABLE events_2024_01 PARTITION OF events FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');

אינדקס על טבלת האב נוצר אוטומטית על כל החלוקות:

CREATE INDEX ON events (created_at, user_id); 

אוטומציה עם pg_partman

יצירת חלוקות ידנית אינה הגישה שלנו. אנו משתמשים ב-pg_partman:

SELECT partman.create_parent(
    p_parent_table => 'public.events',
    p_control => 'created_at',
    p_type => 'range',
    p_interval => 'monthly',
    p_premake => 3
);

-- Настройка удаления через 2 года
UPDATE partman.part_config
SET retention = '2 years',
    retention_keep_table = false
WHERE parent_table = 'public.events';

-- Запуск обслуживания (можно через pg_cron)
SELECT partman.run_maintenance();
כיצד פועל גיזום חלוקות? גיזום חלוקות הוא אופטימיזציה של מתכנן PostgreSQL: הוא מוציא מהתוכנית חלוקות שאינן עומדות בתנאי `WHERE` על מפתח החלוקה. כדי שהגיזום יעבוד, התנאי חייב להכיל את המפתח. לדוגמה, `WHERE created_at >= '2023-01-01' AND created_at < '2023-02-01'` חותך את כל החודשים מלבד ינואר 2023. זה מפחית את כמות הנתונים הנסרקים בסדרי גודל.

חלוקת Hash: התפלגות אחידה

שימו לב: כאשר אין מפתח ברור, השתמשו ב-Hash:

CREATE TABLE user_sessions (
    id UUID DEFAULT gen_random_uuid(),
    user_id BIGINT NOT NULL,
    data JSONB,
    expires_at TIMESTAMPTZ
) PARTITION BY HASH (user_id);
CREATE TABLE user_sessions_p0 PARTITION OF user_sessions FOR VALUES WITH (MODULUS 4, REMAINDER 0);

מקרה בוחן: העברת טבלת לוגים של 500 ג'יגה-בייט

לקוח—פלטפורמת פינטק—התמודד עם השפלה: שאילתות ללוגים אחרונים לקחו מעל 30 שניות, VACUUM רווה את ה-I/O. ביצענו בדיקה, בחרנו Range על -- Родительская таблица CREATE TABLE events ( id BIGSERIAL, created_at TIMESTAMPTZ NOT NULL, user_id BIGINT NOT NULL, event_type VARCHAR(64) NOT NULL, payload JSONB ) PARTITION BY RANGE (created_at); -- Создание партиций (вручную или через pg_partman) CREATE TABLE events_2024_01 PARTITION OF events FOR VALUES FROM ('2024-01-01') TO ('2024-02-01'); עם חלוקות חודשיות ו-pg_partman.

תהליך ההעברה:

  1. יצרנו טבלה מחולקת חדשה CREATE INDEX ON events (created_at, user_id); .
  2. הגדרנו שכפול לוגי באמצעות pglogical לסנכרון.
  3. העתקנו נתונים ישנים בקבוצות של 10 מיליון שורות.
  4. העברנו את היישום ל-SELECT partman.create_parent( p_parent_table => 'public.events', p_control => 'created_at', p_type => 'range', p_interval => 'monthly', p_premake => 3 ); -- Настройка удаления через 2 года UPDATE partman.part_config SET retention = '2 years', retention_keep_table = false WHERE parent_table = 'public.events'; -- Запуск обслуживания (можно через pg_cron) SELECT partman.run_maintenance(); (זמן השבתה: 2 דקות).

תוצאות: שאילתות לשבוע—300 מילישניות במקום 30 שניות; מחיקת נתונים מיושנים—DROP מיידי; עומס VACUUM הופחת פי 5. זה חסך עד 60% באחסון על ידי ארכוב חלוקות ישנות. אם אתם מתמודדים עם בעיה דומה, אל תדחו—הזמינו בדיקה והגדרת חלוקה עוד היום.

כיצד להעביר טבלה ללא זמן השבתה?

העברת טבלה קיימת לחלוקה היא הצעד הקריטי ביותר. אנו משתמשים בשילוב של pg_partman ושכפול לוגי. הגישה הסטנדרטית: יצירת טבלה מחולקת חדשה, סנכרון נתונים דרך pglogical, העתקת נתונים ישנים בקבוצות, והעברת היישום. עבור טבלאות מעל 1 טרה-בייט, אנו ממליצים על שכפול סטרימינג עם עצירת כתיבה זמנית. בכל מקרה, אנו ממזערים את זמן ההשבתה לכמה דקות. קבלו ייעוץ והערכת לוחות זמנים—צרו קשר.

מה כוללת העבודה שלנו

  • בדיקת טבלאות מועמדות (גודל, דפוסי גישה, סוגי שאילתות).
  • בחירת אסטרטגיית חלוקה (סוג, מפתח, מרווח).
  • עיצוב סכמת חלוקות ואוטומציה (pg_partman + cron).
  • הגדרת גיזום חלוקות וניטור ביצועים.
  • העברת טבלאות קיימות עם זמן השבתה מינימלי.
  • תיעוד, הדרכת צוות ותמיכה לאחר הפריסה.

אנו מבטיחים תוכנית עבודה שקופה, לוחות זמנים קבועים ו-SLA לתמיכה. הניסיון שלנו: 7+ שנים ב-PostgreSQL, 50+ פרויקטים מוצלחים.

תהליך

  1. ניתוח—איסוף מדדים, זיהוי צווארי בקבוק, הערכת נפחים.
  2. עיצוב—בחירת סוג חלוקה, עיצוב סכמה.
  3. יישום—כתיבת סקריפטים להעברה, הגדרת אוטומציה.
  4. בדיקות—אימות גיזום חלוקות, השוואת ביצועים בסביבת בדיקות.
  5. פריסה—ביצוע העברה בייצור, ניטור.

לוחות זמנים משוערים

נפח נתונים זמן (ימי עבודה)
טבלה חדשה מ-2 ימים
טבלה קיימת עד 100 ג'יגה-בייט מ-5 ימים
טבלה 100+ ג'יגה-בייט עם בדיקות עד שבועיים

העלות מחושבת באופן אישי—כתבו לנו, נעריך את הפרויקט שלכם תוך 1-2 ימים. צרו קשר—נעזור לכם עם חלוקה ונאיץ את מסד הנתונים שלכם.