יותר

מה התחביר הנכון עבור SQL SQL בעיבוד QGIS 2.6?

מה התחביר הנכון עבור SQL SQL בעיבוד QGIS 2.6?


הכנתי דגם קטן עם עיבוד ב- QGIS 2.6.

השכבה האחרונה צריכה להיות תוצאה של שאילתת SQL. עכשיו, בבצע SQLחלון דיאלוג אני יכול להוסיף את השאילתה:

בחר שם, מקסימום (ele) בתור ele, geom מקבוצת layer_id לפי מזהה

אבל לא הבנתי איזה שם עלי לציין בשאילתה (שכבת_זהותבדוגמה).


פרמטרים מסד נתונים [מחרוזת] שם מסד הנתונים, לא שם החיבור. כברירת מחדל אינך צריך למלא את השם, החיבור הנוכחי של מסד הנתונים ייבחר.

ברירת מחדל: (לא מוגדר)

שאילתת SQL [מחרוזת] מגדירה את שאילתת ה- SQL, למשל 'צור בדיקת סכמה;'.

ברירת מחדל: (לא מוגדר)


שינוי לוח

ALTER TABLE מאפשר לך להוסיף עמודות לטבלה במסד נתונים.

AND היא מפעילה המשלבת שני תנאים. שני התנאים חייבים להיות נכונים כדי שהשורה תיכלל במערך התוצאות.

AS היא מילת מפתח ב- SQL המאפשרת לך לשנות את שם העמודה או הטבלה באמצעות כינוי.

AVG () היא פונקציה מצטברת המחזירה את הערך הממוצע עבור עמודה מספרית.

בֵּין

אופרטור BETWEEN משמש לסינון קבוצת התוצאות בטווח מסוים. הערכים יכולים להיות מספרים, טקסט או תאריכים.

הצהרות CASE משמשות ליצירת פלטים שונים (בדרך כלל בהצהרת SELECT). זוהי הדרך להתמודד עם לוגיקה אם-אז.

לספור()

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

צור טבלה

CREATE TABLE יוצר טבלה חדשה במסד הנתונים. הוא מאפשר לך לציין את שם הטבלה ואת שם כל עמודה בטבלה.

לִמְחוֹק

משפטים DELETE משמשים להסרת שורות מהטבלה.

קבוצה לפי

GROUP BY הוא סעיף ב- SQL המשמש רק עם פונקציות מצטברות. הוא משמש בשיתוף עם הצהרת SELECT לסידור נתונים זהים לקבוצות.

יש

HAVING נוספה ל- SQL מכיוון שלא ניתן היה להשתמש במילת המפתח WHERE עם פונקציות מצטברות.

הצטרף פנימי

חיבור פנימי ישלב שורות מטבלאות שונות אם מצב הצטרפות נכון.

לְהַכנִיס

הצהרות INSERT משמשות להוספת שורה חדשה לטבלה.

IS NULL / IS NOT NULL

IS NULL ו- IS NOT NULL הם אופרטורים המשמשים את הסעיף WHERE כדי לבדוק אם יש ערכים ריקים.

LIKE הוא אופרטור מיוחד המשמש עם סעיף WHERE לחיפוש תבנית ספציפית בעמודה.

לְהַגבִּיל

LIMIT הוא סעיף המאפשר לך לציין את מספר השורות המרבי שיהיו לערכת התוצאות.

MAX () היא פונקציה שלוקחת את שם העמודה כארגומנט ומחזירה את הערך הגדול ביותר בעמודה זו.

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

OR הוא אופרטור שמסנן את קבוצת התוצאות כך שתכלול רק שורות שבהן כל התנאי נכון.

מיין לפי

ORDER BY הוא סעיף המציין שאתה רוצה למיין את התוצאה שנקבעה לפי עמודה מסוימת באלפביתית או במספרית.

חיבור חיצוני

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

עָגוֹל()

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

בחר

הצהרות SELECT משמשות לאחזור נתונים ממסד נתונים. כל שאילתה תתחיל ב- SELECT.

בחר DISTINCT

SELECT DISTINCT מציין שהמשפט עומד להיות שאילתה המחזירה ערכים ייחודיים בעמודות שצוינו.

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

עדכון

הצהרות UPDATE מאפשרות לך לערוך שורות בטבלה.

איפה

WHERE הוא סעיף המציין שאתה רוצה לסנן את קבוצת התוצאות כך שתכלול רק שורות שבהן יש את הדברים הבאים מַצָב נכון.

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

פסקת ה- WITH ידועה גם בשם ביטוי טבלה נפוץ (CTE) ופקטורינג תת -שאילתות.


3 תשובות 3

עבור RDBMS מודרני אין הבדל בין "JOIN מפורש" לבין "JOIN-in-the-WHERE" (אם כל ה- JOINS הם פנימיים) לגבי הביצועים ותכנית השאילתה.

תחביר JOIN המפורש ברור יותר ופחות מעורפל (ראה קישורים למטה)

עכשיו, הצטרף לפני-איפה הגיוני עיבוד לא מַמָשִׁי העיבוד והאופטימיזורים המודרניים חכמים מספיק כדי להבין זאת.

הבעיה שלך כאן היא ככל הנראה אינדקס.

אנא הצג בפנינו את כל האינדקסים והמפתחות בטבלאות אלה. ותוכניות השאילתה

הערה: שאלה זו הייתה קרובה ל- StackOverflow כיוון שכעת היא כפילה. COUNT (1) לעומת COUNT (*) הוא גם מיתוס אחר שנפסק.

עליך לבנות מחדש את השאילתה לגמרי

נסה לבצע את סעיפי WHERE קודם לכן ואת ה- JOINs מאוחר יותר

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

@gbn הזכיר לוודא שיש לך את האינדקסים הנכונים. במקרה זה, אנא אינדקס את העמודה שנוצרה ב- MasterTable.

עדכון 2011-06-24 22:31 EDT

עליך להריץ את השאילתות הבאות:

אם NullRoles X 20 & lt AllRoles (במילים אחרות, אם NullRoles קטן מ -5% משורות הטבלה), עליך ליצור אינדקס לא ייחודי של התפקיד ב- UserTable. אחרת, טבלה מלאה של UserTable תספיק מאחר וכלי אופטימיזציית השאילתות עשוי לשלול שימוש באינדקס.

עדכון 2011-06-25 12:40 EDT

מכיוון שאני DBA של MySQL, השיטה שלי לעשות דברים דורשת לא לתת אמון בכלי אופטימיזציית השאילתות MySQL באמצעות פסימיות חיובית ולהיות שמרנית. לפיכך, אנסה לשחזר שאילתה או ליצור אינדקס כיסוי הכרחי כדי להקדים את ההרגלים הרעים הנסתרים של MySQL Query Optimizer. התשובה של @gbn נראית שלמה יותר בכך שייתכן שיש לשרת SQL יותר "תקינות נפש" בהערכת שאילתות.


שאילתות זמניות

35.6.2.1 טבלת תקופות דוח

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

טבלת תקופת הדוחות נותנת שם לטווח תאריכים המשותף לכל הארגון.

צור טבלה Something_Report_Periods

(something_report_name CHAR (10) מפתח ראשוני לא NULL

CHECK (Something_report_name LIKE & lt pattern & gt),

eat_report_start_date תאריך לא אפסי,

משהו_דווח_סוף_תאריך DATE NOT NULL,

CHECK (something_report_start_date & lt = something_report_end_date),

תקופות דיווח אלה יכולות לחפוף או שיהיו פערים. לתת שם לתקופה קשה יותר משאתה חושב. אני אוהב את מוסכמת MySQL של ​​שימוש באפסים כפולים במשך חודשים ושנים, כלומר 'yyyy-mm-00' במשך חודש בתוך שנה ו- 'yyyy-00-00' לכל השנה. היתרונות הם שזה ימיין עם פורמט הנתונים ISO-8601 הנדרש על ידי Standard SQL וזה בלתי תלוי בשפה. תבנית האימות היא '[12] [0-9] [0-9] [0-9] -00-00' ו- '[12] [0-9] [0-9] [0-9]- [01] [0-9] -00 '.


כנראה ככה הייתי עושה את זה. פעולה זו תפעיל את העבודה כל 4 שעות, בשעות 00:00, 04:00, 08:00 12:00, 16:00, 20:00.

זוהי דרך קצת יותר מילולית לכתוב */4, אך היא אמורה לפעול אותו דבר.

ההודעה המקורית, לפני העריכה, הציגה את התצורה כדלקמן:

הכרזה לא הכירה את Markdown ושמה כוכבית בעמודה הראשונה וגרמה לה להופיע ככדור. ערכתי את הפוסט שלהם כדי לשקף את מה שהם התכוונו לפרסם:

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

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

זה יפעל בדקה ה -15 אחרי כל שעה.

חיבור כל זה: כדי לרוץ פעם בשעה במהלך שעות המחולקות באופן שווה ב- 4 השתמש בתחביר זה:


2 תשובות 2

אחריות לבטוח 100% מהזרקת SQL? לא הולך לקבל את זה (ממני).

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

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

עם פרמטרים מאוגדים, תוכנית ביצוע שאילתת ה- SQL שלך מובנת מבעוד מועד מבלי להסתמך על קלט משתמש, מה שאמור לא לגרום להזרקת SQL (שכן כל ציטוטים, סימני הערה וכו 'מוכנסים רק בתוך משפט SQL שכבר נערך).

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

לַעֲרוֹך: תגובה לשתי ביקורות (שהן קצת ארוכות מדי להערות):

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

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

לדוגמה, אם ביישום שלך כתבת קוד פסאודו כמו:

לא יכולה להיות הזרקת SQL בעת הפעלת משפט SQL זה ברמת היישום. אולם אם פונקציית מסד הנתונים שהוגדרה על ידי המשתמש נכתבה בצורה לא בטוחה (באמצעות תחביר PL/pgSQL):

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

עם זאת, אלא אם כן אתה מנסה להיות לא בטוח (בניית הצהרות SQL באמצעות שרשור מחרוזות), זה יהיה טבעי יותר לכתוב את הגדרת המשתמש בצורה בטוחה כמו:

יתר על כן, אם באמת הרגשת צורך להרכיב משפט SQL ממחרוזת בפונקציה המוגדרת על ידי משתמש, תוכל עדיין להפריד בין משתני נתונים לבין משפט SQL באותו אופן כמו מאפייני_הליכים/פרמטרים מאוגדים אפילו בתוך פונקציה שהוגדרה על ידי משתמש. לדוגמה ב- PL/pgSQL:

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


דרך נוספת היא להשתמש בפקודה זו בקובץ האצווה:

מצאתי שזה הפתרון הטוב ביותר וזה עובד במסוף או בתוך סקריפט:

כשהבנתם כעת שהבעיה שלכם היא בקובץ ה- sql עצמו, הבינו שצריך להגיד ל- sqlplus לצאת. הדרך שבה אני עושה זאת היא:

(החתך חשוב. הוא אומר ל- sqlplus לבצע את הסטטמטים שמעליו).

הדרך הטובה ביותר להסתיר פרטי משתמשים ויציאות היא:

יציאה מסופקת לפלט של sqlplus ומאלצת אותה להפסיק. -S מדכא את כל פלט השרת מלבד שאילתת SQL לאחר מכן בתסריט.

תוכל גם לעשות זאת בסקריפט המעטפת שלך.

ייתכן שיהיה עליך לברוח מה- "" עם .

כן, זה אפשרי - צור סקריפט עוטף שמגדיר את SQLPlus כראוי, כולל את הסקריפט שלך (כלומר @YourTargetScript.sql) ולאחר מכן מבצע יציאה.

עם זאת, אני לא ממליץ על גישה זו כלל-ל- SQLPlus יש הרבה מאוד gotchas לשימוש פרוגרמטי בעת כתיבת סקריפטים בעבר שהשתמשו באורקל, בניתי סביבו עטיפת Python (הוספתי התנהגות סבירה יותר של טיפול בשגיאות, הפרדה שפויה של הפלט בין stdout/stderr, תמיכת פלט CSV מקומית ועוד דברים כאלה), וזה עבד הרבה יותר טוב.

אם אתה שם את זה בקובץ אצווה, הבקרה תמשיך עם ההצהרות שאחריו.


מגבלות

בנוסף למגבלות הכלליות של שאילתות מאוחדות, למסדי נתונים של Cloud SQL יש את המגבלות הבאות.

סוגי נתונים שאינם נתמכים

אם השאילתה החיצונית שלך מכילה סוג נתונים שאינו נתמך ב- BigQuery, השאילתה תיכשל באופן מיידי. אתה יכול להעביר את סוג הנתונים שאינו נתמך לסוג נתונים נתמך אחר של MySQL או PostgreSQL.

סוג נתוני MySQL שאינו נתמך

  • הודעת שגיאה: פונקציה לא חוקית בעלת ערך טבלה external_query נמצאה סוג MySQL לא נתמך ב- BigQuery בשעה [1:15]
  • סוג לא נתמך: גיאומטריה, ביס
  • פתרון הבעיה: העבר את סוג הנתונים שאינו נתמך ל- STRING.
  • דוגמא: בחר ST_AsText (ST_GeomFromText ('POINT (1 1) ')) פקודה זו מעבירה את סוג הנתונים הלא נתמך GEOMETRY ל- STRING.

סוג נתוני PostgreSQL שאינו נתמך

  • הודעת שגיאה: פונקציה לא חוקית בעלת ערך טבלה external_query סוג Postgres (OID = 790) אינו נתמך כעת בשעה [1:15]
  • סוג לא נתמך: כסף, זמן עם אזור זמן, inet, נתיב, pg_lsn, נקודה, מצולע, tsquery, tsvector, txid_snapshot, uuid, box, cidr, מעגל, מרווח, jsonb, קו, lseg, macaddr, macaddr8
  • פתרון הבעיה: העבר את סוג הנתונים שאינו נתמך ל- STRING.
  • דוגמא: SELECT CAST (཈.34 ' :: float8 :: numeric :: money AS varchar (30)) פקודה זו מעבירה את הכסף מסוג נתונים שאינו נתמך ל- STRING.

שולחן טמפ '

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

שולחנות זמניים מגיעים בשני סוגים: מקומי וגלובלי. במונחים של MS Sql Server אתה משתמש ביישום #tableName עבור מקומי, ובשם ## tableName עבור הגלובלי (שים לב לשימוש ב #יחיד או כפול כמאפיין המזהה).

שים לב שעם טבלאות טמפ ', בניגוד למשתני טבלה או CTE, תוכל להחיל אינדקסים וכדומה, מכיוון שאלו טבלאות לגיטימיות במובן הרגיל של המילה.

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

התשובה המקובלת כאן אומרת "לעולם אין להשתמש ב- CTE לביצועים" - אך הדבר עלול להטעות. בהקשר של CTEs מול טבלאות זמניות, בדיוק סיימתי להסיר שטף של זבל מחבילה של procs מאוחסנים כי כמה doofus בוודאי חשבו שיש מעט או לא תקורה לשימוש בטבלאות זמניות. דחפתי את המגרש לתוך CTEs, מלבד אלה שהיו בשימוש לגיטימי בשימוש מחדש לאורך כל התהליך. צברתי בערך 20% ביצועים מכל המדדים. לאחר מכן התחלתי להסיר את כל הסמנים שניסו ליישם עיבוד רקורסיבי. כאן ראיתי את הרווח הגדול ביותר. בסופו של דבר קיצצתי את זמני התגובה בפקטור של עשר.

CTEs וטבלאות זמניות אכן מקרי שימוש שונים מאוד. אני רק רוצה להדגיש כי למרות שזה לא תרופת פלא, ההבנה והשימוש הנכון ב- CTE יכולים להוביל לכמה שיפורים כוכבים באמת הן באיכות הקוד/בתחזוקה והן במהירות. מכיוון שיצא לי להתמודד איתם, אני רואה טבלאות זמניות וסמנים כרעות הגדולות של עיבוד SQL. אני יכול להסתדר מצוין עם משתני טבלה ו- CTE כמעט בכל דבר עכשיו. הקוד שלי נקי ומהיר יותר.

ניתן לקרוא CTE שוב ושוב בתוך שאילתה והוא מוערך בכל פעם שהוא מפנה אליו - תהליך זה יכול להיות רקורסיבי. אם הוא מופנה רק פעם אחת אז הוא מתנהג ממש כמו שאילתת משנה, למרות שניתן לפרמט CTEs.

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

משתני הטבלה IIRC (מצד שני) הם תמיד מבנים בתוך הזיכרון.

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

הסיבה העיקרית לשימוש ב- CTE היא גישה לפונקציות חלון כגון row_number () ועוד.

זה אומר שאתה יכול לעשות דברים כמו לקבל את השורה הראשונה או האחרונה לכל קבוצה מהר מאוד ויעיל - ביעילות רבה יותר מאמצעים אחרים ברוב המקרים המעשיים.

אתה יכול להריץ שאילתה דומה לאמור לעיל באמצעות שאילתת משנה מתואמת או באמצעות שאילתת משנה אך ה- CTE יהיה מהיר יותר כמעט בכל התרחישים.

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

בנוסף, CTEs יכולים לשפר את הביצועים אם אתה מבין את ההיגיון העסקי שלך ויודע אילו חלקים מהשאילתה יש להפעיל תחילה - בדרך כלל, שים את השאילתות הסלקטיביות ביותר שלך קודם כל שיובילו לקבוצות תוצאות שיכולות להשתמש באינדקס בהצטרפות הבאה שלהן ולהוסיף את האפשרות (רמז לשאילתא)

לבסוף, CTEs אינם משתמשים ב- tempdb כברירת מחדל, כך שתפחית את המחלוקת על צוואר הבקבוק הזה באמצעות השימוש בהם.

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

נראה שיש כאן קצת שליליות כלפי CTE.

ההבנה שלי לגבי CTE היא שבעצם זהו סוג של תצוגה אדג'וקית. SQL היא גם שפה הצהרתית וגם מבוססת קבוצות. CTE הם דרך מצוינת להכריז על סט! לא להיות מסוגל לאנדקס CTE הוא למעשה דבר טוב כי אתה לא צריך! זה באמת סוג של סוכר תחבירי כדי להפוך את השאילתה לקלה יותר לקריאה/כתיבה. כל אופטימיזציה הגונה תכין את תוכנית הגישה הטובה ביותר באמצעות אינדקסים בטבלאות הבסיסיות. המשמעות היא שתוכל להאיץ את שאילתת ה- CTE שלך ביעילות על ידי ביצוע העצות לאינדקס בטבלאות הבסיסיות.

כמו כן, רק בגלל שהגדרת קבוצה כ- CTE, אין זה אומר שיש לעבד את כל השורות במערך. תלוי בשאילתה, כלי האופטימיזציה עשוי לעבד שורות "מספיקות" כדי לספק את השאילתה. אולי היית צריך רק את 20 הראשונות למסך שלך. אם בנית שולחן זמני אז אתה באמת צריך לקרוא/לכתוב את כל השורות האלה!

בהתבסס על זה הייתי אומר ש- CTE הם תכונה מצוינת של SQL וניתן להשתמש בהם בכל מקום שהם הופכים את השאילתה לקלה יותר לקריאה. הייתי חושב רק על שולחן טמפ 'לתהליך אצווה שבאמת יצטרך לעבד כל רשומה. גם אז afaik זה לא ממש מומלץ כי על שולחן זמני מסד הנתונים הרבה יותר קשה לעזור לך בקובץ שמור ובאינדקסים. אולי עדיף שיהיה לך שולחן קבוע עם שדה PK ייחודי לעסקה שלך.

אני חייב להודות שהניסיון שלי הוא בעיקר ב- DB2 ולכן אני מניח שהעבודה של CTE פועלת בצורה דומה בשני המוצרים. אני אשמח לתקן אם CTE איכשהו נחות בשרת SQL. )


ציין שפה ידנית להדגשת תחביר [כפול]

זהו המשך לשאלה שעניתי עליה קודם (שינויים בהדגשת התחביר).

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

קח למשל את התרחיש שאני מתאר להלן.

כאשר התשובה ניתנת בשפה שאינה "השפה הראשית" (שבמקרה היא C#), הקוד עדיין מודגש כ- C# גם אם הוא אינו נמצא בשפה זו!

  1. קח כל שאלה שיש לה מספר תגים מפורשים הקשורים לשפה.
    לדוגמה: Webclient.UploadFile המתויג מתויג c#, .net, vb.net ו- webclient.
  2. נסה לענות על השאלה בקוד השונה מהשפה ה'מג'ורית '.
    במקרה זה, נסה להשיב על השאלה באמצעות קוד VB.NET.

תוצאות צפויות: קוד צריך להיות מודגש ב- VB.NET.
תוצאה אמיתית: הקוד הודגש ב- C#!

פתרון מוצע
צריכה להיות דרך להגדיר במפורש את השפה להדגשת תחביר.

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

תייג את השאלה כדלקמן (בסדר הספציפי) vb.net, .net c#

ללא שם: לב אתה קוד C# מודגש כראוי ואת קוד vb.net לא.

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


צפו בסרטון: QGIS - Buffer layer - Add as Virtual Layer from PostGIS using SQL Statements