מאמרים
  • Register
תנו לנו לייק וקבלו עדכונים ישירות לפיד

איך מאתרים הכפלת רשומות במהירות?

פורסם על ידי ב ב קטגוריה ראשית
  • גודל פונט: Larger Smaller
  • Hits: 3206
  • 0 תגובות
  • עשו מנוי לעדכונים מהבלוג
  • Print

לפניכם מאמר כללי בDB, המתייחס לנושא הכאוב של הכפלת רשומות: כיצד ניתן לאתר, תוך מספר שניות,  את הטבלה או הטבלאות אשר גורמות להכפלת רשומות בשאילתא.

המאמר מאת: תמיר בר-נצר. תמיר מועסק כעצמאי בארגונים בניתוח,פיתוח, יישום והטמעה של מערכות Business Objects, מערכות DWH וBI. לתמיר נסיון של כ 13 שנה בנושאים אלו.

 


כל אחד העוסק בעיבוד נתונים נתקל מדי פעם במצב של הכפלת רשומות. כלומר , ערך מספרי אשר הוכפל מספר פעמים בשאילתת sql. לדוגמא, נסתכל על הסכמה הבאה:

 

לפנינו טבלת סוכנים עם מכירות לסוכן:

article004-01

בטבלה זאת, שדה  agent_id הוא המפתח ושדה agent_sales_num הוא הנתון המספרי. השדות האחרים מתחברים לטבלאות אחרות אשר מפענחות אותם.

כמובן שאם נבצע שאילתא הסוכמת את agent_sales_num, ברמה של agent_id, נקבל תוצאות תקינות (agent_id הוא המפתח):

SELECT     agent_id, SUM(agent_sales_num) AS agent_sales_num

FROM         agents

GROUP BY agent_id

והתוצאה תהיה:

article004-02

אם נשכלל את השאילתא ונחבר את שתי הטבלאות הנוספות: טבלת ערים (cities)

article004-03

וטבלת מחלקות (divisions)

article004-04

כלומר בשאילתא הבאה:

SELECT     agents.agent_id, SUM(agents.agent_sales_num) AS agent_sales_num

FROM         agents ,

                 cities ,

                divisions

where agents.agent_city_id = cities.city_id

and agents.agent_division_id = divisions.division_id

GROUP BY agents.agent_id

שוב, התוצאה תהיה תקינה:

article004-02

הבעיה מתחילה שנרצה להוסיף טבלה נוספת בעלת יחס של אחד לרבים לטבלת הagents, לדוגמא  טבלת כתובות (addresses):

article004-05

אם תשימו לב, לסוכן 1 ישנן שתי כתובות, לכן אם נוסיף טבלה זאת לשאילתא:

SELECT     agents.agent_id, SUM(agents.agent_sales_num) AS agent_sales_num

FROM         agents ,

cities ,

divisions,

addresses

where agents.agent_city_id = cities.city_id

and agents.agent_division_id = divisions.division_id

and agents.agent_id=addresses.agent_id

GROUP BY agents.agent_id

אם נתבונן היטב בתוצאות,נראה שקיבלנו הכפלת רשומות בסוכן מספר 1:

article004-06

הסיבה היא כמובן  שבטבלת הכתובות מוזנות שתי כתובות לסוכן מספר 1, מכאן ה100 המקורי הוכפל במספר רשומות הכתובת הקיימות לכל סוכן. אגב, אותו הדין לסוכן מספר 2, אלא שלו מוזנת רק כתובת אחת לכן לא נראה הכפלת רשומות.

מצב זה הוא כמובן לא תקין ונשאלת השאלה: כיצד ניתן לאתר שהבעיה היא בטבלת addresses?

הדרך הטרווילית שבה מנסים לאתר את הטבלאות הסוררות היא באמצעות הסרה של כל טבלה מהשאילתא  , הרצת השאילתא ובדיקת התוצאות וכך מסיקים מסקנות לגבי הטבלה הבעייתית. שיטה זאת אולי טובה ויפה כשמדובר בשאילתא של 3טבלאות היוצאות מטבלה אחת מרכזית,כמתואר במקרה זה, אך מה קורה כשמדובר בשאילתא בת 50 טבלאות הקשורות אחת לשנייה? או שאילתות שנוצרו על ידי כלים אוטומטים, כגון bo או קוגנוס. כמובן ששיטה זאת תהיה מסורבלת מאד ותדרוש הרבה זמן והבנה טובה של הסכמה.

למזלנו, ישנה שיטה הרבה יותר טובה ומהירה. כדי לאתר הטבלה הבעיתית, נבצע את הפעולות הבאות:

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

2. ניקח את השאילתא המקורית ונבצע עליה את הפעולות הבאות:

2.1 נוסיף לחלק הwhere את הערך אחד של המפתח שבחרנו (במקרה זה, סוכן 1)

2.2 בחלק הselect נחליף את כל מה שרשום ל * .

2.3 נסיר את הgroup by מהשאילתא

בקיצור, נהפוך את השאילתא מ:

SELECT     agents.agent_id, SUM(agents.agent_sales_num) AS agent_sales_num

FROM         agents ,

cities ,

divisions,

addresses

where agents.agent_city_id = cities.city_id

and agents.agent_division_id = divisions.division_id

and agents.agent_id=addresses.agent_id

GROUP BY agents.agent_id

לשאילתא:

SELECT    *

FROM         agents ,

cities ,

divisions,

addresses

where agents.agent_city_id = cities.city_id

and agents.agent_division_id = divisions.division_id

and agents.agent_id=addresses.agent_id

and agents.agent_id=1

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

במקרה שלנו, נריץ את השאילתא:

article004-07

החלק המסומן הוא התוצאה הנכונה מוכפלת במספר הרשומות (2).

שימו לב שרשומה 1 ו2 זהות לחלוטין, אך כשנמשיך לגלול ימינה, נראה את ההבדל ברשומות:

article004-08

ההבדל בין השורות הוא הדבר שגורם להכפלת הרשומות. לכן ברור לנו שההכפלה נגרמת מטבלת הכתובות. מצאנו את הבעיה במהירות!

הערות:

  1. שיטה זאת תהיה טובה גם למקרה שבו הכפלת הרשומות נגרמת כתוצאה ממכפלה קרטזית, כלומר אם לדוגמא , שכחנו בשאילתא את הjoin המחבר את טבלת agents לטבלת divisions.
  2. המקרה היחידי (שעולה לי כרגע בראש) שבו שיטה זאת לא תפעל הוא מקרה הקצה שבו הטבלאות עצמם מזובלות בערכים כפולים לדוגמא, אם בטבלת ערים היו שתי רשומות זהות עם קוד עיר =1, שיטה זאת לא הייתה מצליחה לעלות על מצב כזה. כאמור זה מקרה קצה, במיוחד במקרים שבהם מגדירים מפתחות על הטבלאות. אך במידה ונתקלנו בשתי רשומות זהות לחלוטין, אחד מהטבלאות בשאילתא מכיל רשומות כאלה.
0

תגובות

  • אין תגובות עדיין לידיעה זאת. מדוע שלא תהיה זה שיגיב ראשון?

כיתבו תגובה

Guest שבת, 16 דצמבר 2017

Sap

Oracle

Informatica

SAS

Microstrategy

IBM

Microsoft

Qlikview

Teradata

Webfocus

קליק אחד ואתם מחוברים. מהיר .קל .מאובטח.

מעניין? שתפו דף זה באמצעות הטלפון הנייד

איך מאתרים הכפלת רשומות במהירות? - מערכת הבלוגים של אתר dwh.co.il - QR Code Friendly
Powered by QR Code Friendly

מאמרים

מגמות של ביג דאטה בעולם הביטוח
CA Technologies
SSIS - Buffer Size Optimization
קטגוריה ראשית
בדיקות BI ו-DWH לעומת הבדיקות בתחומים אחרים
קטגוריה ראשית
איסוף דרישות לפרויקטי BI
קטגוריה ראשית
כח המידע במיקוד
קטגוריה ראשית
0

הדף שלנו בפייסבוק

התחברות

כניסות למאמרים
6695691