שאילתות משנה סקלריות

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

סכימת מסד נתונים

השאילתות ותוכניות הביצוע בדף הזה מבוססות על סכימת מסד הנתונים הבאה:

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX),
  BirthDate  DATE
) PRIMARY KEY(SingerId);

CREATE INDEX SingersByFirstLastName ON Singers(FirstName, LastName);

CREATE TABLE Albums (
  SingerId        INT64 NOT NULL,
  AlbumId         INT64 NOT NULL,
  AlbumTitle      STRING(MAX),
  MarketingBudget INT64
) PRIMARY KEY(SingerId, AlbumId),
  INTERLEAVE IN PARENT Singers ON DELETE CASCADE;

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget);

CREATE TABLE Songs (
  SingerId  INT64 NOT NULL,
  AlbumId   INT64 NOT NULL,
  TrackId   INT64 NOT NULL,
  SongName  STRING(MAX),
  Duration  INT64,
  SongGenre STRING(25)
) PRIMARY KEY(SingerId, AlbumId, TrackId),
  INTERLEAVE IN PARENT Albums ON DELETE CASCADE;

CREATE INDEX SongsBySingerAlbumSongNameDesc ON Songs(SingerId, AlbumId, SongName DESC), INTERLEAVE IN Albums;

CREATE INDEX SongsBySongName ON Songs(SongName);

CREATE TABLE Concerts (
  VenueId      INT64 NOT NULL,
  SingerId     INT64 NOT NULL,
  ConcertDate  DATE NOT NULL,
  BeginTime    TIMESTAMP,
  EndTime      TIMESTAMP,
  TicketPrices ARRAY<INT64>
) PRIMARY KEY(VenueId, SingerId, ConcertDate);

אפשר להשתמש בהצהרות הבאות של שפת טיפול בנתונים (DML) כדי להוסיף נתונים לטבלאות האלה:

INSERT INTO Singers (SingerId, FirstName, LastName, BirthDate)
VALUES (1, "Marc", "Richards", "1970-09-03"),
       (2, "Catalina", "Smith", "1990-08-17"),
       (3, "Alice", "Trentor", "1991-10-02"),
       (4, "Lea", "Martin", "1991-11-09"),
       (5, "David", "Lomond", "1977-01-29");

INSERT INTO Albums (SingerId, AlbumId, AlbumTitle)
VALUES (1, 1, "Total Junk"),
       (1, 2, "Go, Go, Go"),
       (2, 1, "Green"),
       (2, 2, "Forever Hold Your Peace"),
       (2, 3, "Terrified"),
       (3, 1, "Nothing To Do With Me"),
       (4, 1, "Play");

INSERT INTO Songs (SingerId, AlbumId, TrackId, SongName, Duration, SongGenre)
VALUES (2, 1, 1, "Let's Get Back Together", 182, "COUNTRY"),
       (2, 1, 2, "Starting Again", 156, "ROCK"),
       (2, 1, 3, "I Knew You Were Magic", 294, "BLUES"),
       (2, 1, 4, "42", 185, "CLASSICAL"),
       (2, 1, 5, "Blue", 238, "BLUES"),
       (2, 1, 6, "Nothing Is The Same", 303, "BLUES"),
       (2, 1, 7, "The Second Time", 255, "ROCK"),
       (2, 3, 1, "Fight Story", 194, "ROCK"),
       (3, 1, 1, "Not About The Guitar", 278, "BLUES");

השאילתה הבאה מדגימה אופרטור של ביטוי סקלרי:

SELECT firstname,
  IF(firstname = 'Alice', (SELECT Count(*)
                          FROM   songs
                          WHERE  duration > 300), 0)
FROM   singers;

/*-----------+----+
 | FirstName |    |
 +-----------+----+
 | Alice     | 1  |
 | Catalina  | 0  |
 | David     | 0  |
 | Lea       | 0  |
 | Marc      | 0  |
 +-----------+----*/

תוכנית הביצוע מוצגת כך:

תוכנית ביצוע של אופרטור של שאילתת משנה סקלרית

תוכנית הביצוע מציגה שאילתת משנה סקלרית כ-Scalar Subquery (שאילתת משנה סקלרית) מעל אופרטור aggregate (מצטבר).

לפעמים Spanner ממיר שאילתות משנה סקלריות לאופרטור אחר, כמו join או cross apply, כדי לשפר את הביצועים.

השאילתה הבאה מדגימה את האופרטור הזה:

SELECT *
FROM   songs
WHERE  duration = (SELECT Max(duration)
                   FROM   songs);

/*----------+---------+---------+---------------------+----------+-----------+
 | SingerId | AlbumId | TrackId | SongName            | Duration | SongGenre |
 +----------+---------+---------+---------------------+----------+-----------+
 |        2 |       1 |       6 | Nothing Is The Same |      303 |     BLUES |
 +----------+---------+---------+---------------------+----------+-----------*/

תוכנית הביצוע מוצגת כך:

תוכנית ביצוע של שאילתת משנה סקלרית שהומרה ל-CROSS APPLY

תוכנית הביצוע לא כוללת שאילתת משנה סקלרית כי Spanner המיר את שאילתת המשנה הסקלרית ל-cross apply.

מאפיינים ונתונים סטטיסטיים של הרצה

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

מאפיינים

שם תיאור
שיטת הביצוע בביצוע שורה, האופרטור מעבד שורה אחת בכל פעם. בביצוע באצ'ים, האופרטור מעבד באצ' של שורות בבת אחת.

נתוני ביצוע

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