Tuesday 19 September 2017

Umzugsdurchschnitt Sql


Die meisten Leute sind mit der Phrase vertraut, quotthis wird zwei Vögel mit einem Steinbruch töten. Wenn es nicht geht, bezieht sich die Phase auf einen Ansatz, der zwei Ziele in einer Handlung anspricht. (Leider ist der Ausdruck selbst ziemlich unangenehm, da die meisten von uns es nicht wollen, Steine ​​auf unschuldige Tiere zu werfen) Heute I39m, um einige Grundlagen auf zwei großartige Features in SQL Server zu decken: der Columnstore-Index (nur in SQL Server Enterprise verfügbar) und Der SQL Query Store. Microsoft hat tatsächlich den Columnstore-Index in SQL 2012 Enterprise implementiert, obwohl sie es in den letzten beiden Releases von SQL Server erweitert haben. Microsoft hat den Query Store in SQL Server 2016 eingeführt. Also, was sind diese Features und warum sind sie wichtig Nun, ich habe eine Demo, die beide Features vorstellen und zeigen, wie sie uns helfen können. Bevor ich noch weiter gehe, decke ich auch diese (und andere SQL 2016 Features) in meinem CODE Magazin Artikel über neue Features SQL 2016. Als Grundeinführung kann der Columnstore Index dazu beitragen, Abfragen zu beschleunigen, die über große Datenmengen scanaggregieren und Der Abfrage-Store verfolgt Abfragen Ausführungen, Ausführungspläne und Laufzeitstatistiken, die Sie normalerweise manuell erfassen müssen. Vertrauen Sie mir, wenn ich sage, das sind tolle Features. Für diese Demo werde ich die Microsoft Contoso Retail Data Warehouse Demo Datenbank verwenden. Lose gesprochen, Contoso DW ist wie Quota wirklich große AdventureWorksquot, mit Tischen mit Millionen von Zeilen. (Die größte AdventureWorks-Tabelle enthält höchstens 100.000 Zeilen). Sie können die Contoso DW Datenbank hier herunterladen: microsoften-usdownloaddetails. aspxid18279. Contoso DW arbeitet sehr gut, wenn man die Leistung bei Abfragen gegen größere Tische testen möchte. Contoso DW enthält eine Standard-Data Warehouse Fact-Tabelle namens FactOnLineSales mit 12,6 Millionen Zeilen. Das ist sicherlich nicht der größte Data-Warehouse-Tisch der Welt, aber es geht auch nicht um Kinder. Angenommen, ich möchte die Produktverkäufe für 2009 zusammenfassen und die Produkte bewerten. Ich könnte die Faktentabelle abfragen und sich der Produktdimensionstabelle anschließen und eine RANK-Funktion verwenden, wie folgt: Hier ist ein Teilergebnissatz der Top 10 Zeilen, bei Total Sales. Auf meinem Laptop (i7, 16 GB RAM), nimmt die Abfrage überall von 3-4 Sekunden zu laufen. Das scheint vielleicht nicht wie das Ende der Welt zu sein, aber manche Benutzer könnten nahezu sofortige Ergebnisse erwarten (wie du bei der Verwendung von Excel gegen einen OLAP-Cube nahezu sofortige Ergebnisse sehen kannst). Der einzige Index, den ich derzeit auf dieser Tabelle habe, ist ein gruppierter Index auf einem Umsatzschlüssel. Wenn ich den Ausführungsplan betrachte, macht SQL Server einen Vorschlag, einen Deckelindex der Tabelle hinzuzufügen: Nun, nur weil SQL Server einen Index vorschlägt, bedeutet das nicht, dass du blindlings Indizes für jede quotmissing Indexquot-Nachricht erstellen solltest. In diesem Fall erkennt SQL Server jedoch, dass wir basierend auf dem Jahr filtern und den Produktschlüssel und den Verkaufsbetrag verwenden. So schlägt SQL Server einen Deckungsindex vor, mit dem DateKey als Indexschlüsselfeld. Der Grund, warum wir dies einen quotcoveringquot-Index nennen, liegt daran, dass SQL Server die Nicht-Schlüsselfelder quittiert, die wir in der Abfrage verwendet haben, für den Ridequot. Auf diese Weise muss SQL Server nicht die Tabelle oder den gruppierten Index verwenden, die Datenbank-Datenbank kann einfach den Deckungsindex für die Abfrage verwenden. Covering-Indizes sind in bestimmten Data-Warehousing und Reporting-Datenbank-Szenarien beliebt, obwohl sie zu einem Preis der Datenbank-Engine beibehalten sie kommen. Anmerkung: Die Bedeckungsindizes sind schon lange her, also habe ich noch den Columnstore-Index und den Query Store abgedeckt. Also, ich werde den Deckungsindex hinzufügen: Wenn ich die gleiche Abfrage erneut ausführen würde, lief ich vor kurzem (derjenige, der die Verkaufsmenge für jedes Produkt aggregierte), die Abfrage scheint manchmal um eine Sekunde schneller zu laufen, und ich bekomme ein Ein anderer Ausführungsplan, der einen Index-Suchvorgang anstelle eines Index-Scans verwendet (mit dem Datumsschlüssel auf dem Deckungsindex, um den Umsatz für 2009 abzurufen). Also, vor dem Columnstore Index, könnte dies eine Möglichkeit sein, diese Abfrage in viel älteren Versionen von SQL Server zu optimieren. Es läuft ein wenig schneller als das erste, und ich bekomme einen Ausführungsplan mit einem Index Seek anstelle eines Index-Scans. Allerdings gibt es einige Probleme: Die beiden Ausführungsoperatoren quotIndex Seekquot und quotHash Match (Aggregate) beide betreiben im Wesentlichen Zitat durch rowquot. Stellen Sie sich das in einem Tisch mit Hunderten von Millionen von Reihen vor. Verwandte, über den Inhalt einer Faktentabelle nachdenken: In diesem Fall kann ein einziger Datumsschlüsselwert und ein einzelner Produktschlüsselwert über Hunderte von Tausenden von Zeilen wiederholt werden (erinnern Sie sich, dass die Faktentabelle auch Schlüssel für Geographie, Promotion, Verkäufer hat , Etc.) Also, wenn die quotIndex Seekquot und quotHash Matchquot Zeile für Zeile arbeiten, tun sie dies über Werte, die möglicherweise über viele andere Zeilen wiederholt werden. Dies ist normalerweise, wo I39d zu dem SQL Server Columnstore Index, der ein Szenario bietet, um die Leistung dieser Abfrage auf erstaunliche Weise zu verbessern. Aber bevor ich das mache, gehen wir zurück in die Zeit. Let39s gehen zurück auf das Jahr 2010, als Microsoft ein Add-In für Excel als PowerPivot bekannt. Viele Leute erinnern sich wahrscheinlich daran, Demos von PowerPivot für Excel zu sehen, wo ein Benutzer Millionen von Zeilen aus einer externen Datenquelle in Excel lesen konnte. PowerPivot würde die Daten komprimieren und eine Engine zur Verfügung stellen, um Pivot-Tabellen und Pivot-Charts zu erstellen, die mit erstaunlichen Geschwindigkeiten gegen die komprimierten Daten durchgeführt wurden. PowerPivot verwendete eine In-Memory-Technologie, die Microsoft als quotVertiPaqquot bezeichnete. Diese In-Memory-Technologie in PowerPivot würde grundsätzlich doppelte Business Keyforeign Schlüsselwerte und komprimieren sie auf einen einzigen Vektor. Die In-Memory-Technologie würde diese Werte auch parallel in Blöcken von mehreren hundert zu einer Zeit scanaggregieren. Die Quintessenz ist, dass Microsoft eine große Menge an Leistungsverbesserungen in die VertiPaq In-Memory-Funktion für uns zu verwenden, direkt aus der sprichwörtlichen Box gebacken. Warum gehe ich diesen kleinen Spaziergang in die Erinnerungsspur Weil in SQL Server 2012 Microsoft eine der wichtigsten Features in der Geschichte ihrer Datenbank-Engine implementiert hat: den Columnstore-Index. Der Index ist wirklich ein Index im Namen nur: Es ist ein Weg, um eine SQL Server-Tabelle und erstellen Sie eine komprimierte, in-Memory-Spalte Store, die doppelte Fremdschlüssel Werte bis hin zu einzelnen Vektor-Werte komprimiert. Microsoft hat auch einen neuen Pufferpool erstellt, um diese komprimierten Vektorwerte parallel zu lesen und so das Potenzial für große Leistungssteigerungen zu schaffen. Also, ich werde einen Spaltenladen-Index auf dem Tisch erstellen und ich sehe, wie viel besser (und effizienter) die Abfrage läuft, im Vergleich zu der Abfrage, die gegen den Deckungsindex läuft. Also schaffe ich eine doppelte Kopie von FactOnlineSales (I39ll nennen es FactOnlineSalesDetailNCCS), und ich erstelle einen columnstore Index auf der duplizierten Tabelle, wie ich mich mit der ursprünglichen Tabelle und dem Cover-Index in irgendeiner Weise interferiere. Als nächstes erstelle ich einen columnstore-Index auf der neuen Tabelle: Notiere mehrere Dinge: I39ve spezifiziert mehrere Fremdschlüsselspalten sowie den Verkaufsbetrag. Denken Sie daran, dass ein columnstore-Index nicht wie ein traditioneller row-store-Index ist. Es gibt kein quotkeyquot. Wir geben einfach an, welche Spalten SQL Server komprimieren und in eine Spalte im Speicher speichern soll. Um die Analogie von PowerPivot für Excel zu verwenden, wenn wir einen columnstore-Index erstellen, erzählen wir SQL Server im Wesentlichen, dasselbe, was PowerPivot tat, als wir 20 Millionen Zeilen in Excel importierten, mit PowerPivot So, I39ll die Abfrage erneut ausführen, diesmal mit Die duplizierte FactOnlineSalesDetailNCCS-Tabelle, die den columnstore-Index enthält. Diese Abfrage läuft sofort in weniger als einer Sekunde. Und ich kann auch sagen, dass selbst wenn der Tisch Hunderte von Millionen von Reihen hatte, würde es immer noch auf dem sprichwörtlichen Quatschen eines Wimperns laufen. Wir könnten uns den Ausführungsplan anschauen (und in wenigen Augenblicken werden wir), aber jetzt ist es Zeit, die Query Store zu decken. Stellen Sie sich für einen Moment vor, dass wir beide Fragen über Nacht geführt haben: die Abfrage, die die reguläre FactOnlineSales-Tabelle (mit dem Cover-Index) und dann die Abfrage verwendet hat, die die doppelte Tabelle mit dem Columnstore-Index verwendet hat. Wenn wir uns am nächsten Morgen anmelden, sehen wir gern den Ausführungsplan für beide Abfragen, wie sie stattgefunden haben, sowie die Ausführungsstatistik. Mit anderen Worten, wir sehen gern die gleichen Statistiken, die wir sehen können, ob wir beide Abfragen interaktiv in SQL Management Studio geleitet haben, in TIME und IO Statistics gedreht und den Ausführungsplan direkt nach dem Ausführen der Abfrage angesehen haben. Nun, das, was der Abfrage-Shop ermöglicht es uns, können wir einschalten (aktivieren) Query Store für eine Datenbank, die SQL Server auslösen wird, um Abfrageausführung zu speichern und Planstatistiken zu speichern, damit wir sie später sehen können. Also, um den Query Store auf der Contoso-Datenbank mit dem folgenden Befehl zu aktivieren (und I39ll auch aus irgendeinem Caching herauszuholen): Dann kommst du die beiden Abfragen aus (und quotpretendquot, dass ich sie vor Stunden lief): Jetzt lassen wir sie vor, dass sie Stunden laufen ließen vor. Nach dem, was ich sagte, wird der Query Store die Ausführungsstatistiken erfassen. Also, wie sehe ich sie Glücklicherweise ist das ganz einfach. Wenn ich die Contoso DW Datenbank erweitere, sehe ich einen Query Store Ordner. Der Query Store hat enorme Funktionalität und ich versuche, viel davon in den nachfolgenden Blogeinträgen zu decken. Aber für jetzt möchte ich die Ausführungsstatistiken auf die beiden Abfragen anzeigen und die Ausführungsoperatoren für den Spaltenstartindex genau untersuchen. So klicken Sie mit der rechten Maustaste auf die Top Resource Consuming Queries und führen diese Option aus. Das gibt mir ein Diagramm wie das unten, wo ich die Ausführungsdauer (in Millisekunden) für alle abgefragten Abfragen sehen kann. In diesem Fall war Abfrage 1 die Abfrage gegen die ursprüngliche Tabelle mit dem Deckungsindex, und Query 2 war gegen die Tabelle mit dem Spaltenstartindex. Die Zahlen, die der Säulenständerindex liegen, übertrafen den ursprünglichen Tischdeckungsindex um einen Faktor von fast 7 zu 1. Ich kann die Metrik ändern, um den Speicherverbrauch zu betrachten. In diesem Fall ist zu beachten, dass die Abfrage 2 (die Spaltenstart-Indexabfrage) weit mehr Speicher verwendet hat. Dies zeigt deutlich, warum der columnstore-Index die quotin-memoryquot-Technologie darstellt. SQL Server lädt den gesamten columnstore-Index im Speicher und verwendet einen völlig anderen Pufferpool mit erweiterten Ausführungsoperatoren, um den Index zu verarbeiten. OK, also haben wir einige Graphen, um die Ausführungsstatistiken zu sehen, können wir den Ausführungsplan (und Ausführungsoperatoren), die mit jeder Ausführung verknüpft sind, sehen. Ja, wir können Wenn Sie auf die vertikale Leiste für die Abfrage klicken, die den Spaltenladenindex verwendet hat, sehen Sie die Ausführung Plan unten Das erste, was wir sehen, ist, dass SQL Server eine Spalte Stores Index-Scan durchgeführt, und das stellte fast 100 der Kosten der Abfrage. Sie könnten sagen, quotWait eine Minute, die erste Abfrage verwendet einen Deckungsindex und führte einen Index suchen, so wie kann ein Spaltenstart-Index-Scan schneller sein. Das ist eine legitime Frage, und zum Glück gibt es eine Antwort. Sogar wenn die erste Abfrage eine Indexsuche durchgeführt hat, hat sie immer noch einen Satz durch rowquot ausgeführt. Wenn ich die Maus über den Spaltenstart-Index-Scan-Operator stecke, sehe ich eine Tooltip (wie die unten unten) mit einer wichtigen Einstellung: Der Execution Mode ist BATCH (im Gegensatz zu ROW, was wir mit der ersten Abfrage mit dem Deckungsindex). Dieser BATCH-Modus sagt uns, dass SQL Server die komprimierten Vektoren (für alle Fremdschlüsselwerte, die dupliziert werden, wie zB Produktschlüssel und Datumsschlüssel) in Chargen von fast 1.000 parallel verarbeiten. So ist SQL Server immer noch in der Lage, den columnstore Index viel effizienter zu verarbeiten. Darüber hinaus, wenn ich die Maus über die Hash Match (Aggregate) Aufgabe platziere, sehe ich auch, dass SQL Server aggregiert den columnstore Index mit Batch-Modus (obwohl der Betreiber selbst stellt so ein winziges Prozent der Kosten der Abfrage) Endlich, Sie Könnte gefragt werden, quotOK, so dass SQL Server die Werte in den Daten komprimiert, behandelt die Werte als Vektoren und liest sie in Blöcken von fast tausend Werten parallel, aber meine Abfrage wollte nur Daten für 2009. So ist SQL Server Scannen über die Ganzer Satz von Datenquot Wieder eine gute Frage. Die Antwort ist, quotNot wirklich quot. Glücklicherweise für uns, der neue columnstore Index Puffer Pool führt eine andere Funktion namens quotsegment eliminationquot. Grundsätzlich wird SQL Server die Vektorwerte für die Datumsschlüsselspalte im Spaltenstartindex untersuchen und Segmente eliminieren, die außerhalb des Geltungsbereichs des Jahres 2009 liegen. In den darauffolgenden Blogposten decken Sie den Spaltenstartindex und den Query Store detaillierter ab. Im Wesentlichen, was wir heute hier gesehen haben, ist, dass der Columnstore-Index erheblich beschleunigen kann Abfragen, die über große Datenmengen scanaggregieren, und der Query Store wird Abfrage-Ausführungen erfassen und erlauben uns, Ausführungs - und Leistungsstatistiken später zu untersuchen. Am Ende werden wir gerne eine Ergebnismenge produzieren, die folgendes zeigt. Beachten Sie drei Sachen: Die Spalten verschwinden im Wesentlichen alle möglichen Rückgabegründe, nachdem Sie den Verkaufsbetrag angelegt haben. Die Ergebnismenge enthält Zwischensummen nach Wochenende (Sonntag) Datum über alle Clients (wo der Client NULL ist) Die Ergebnismenge enthält eine Gesamtsumme Zeile (wo der Client und das Datum sind beide NULL) Erstens, bevor ich in das SQL-Ende gelangen, könnten wir die dynamische Pivotmatrix-Fähigkeit in SSRS nutzen. Wir müssten einfach die beiden Ergebnismengen um eine Spalte kombinieren und dann könnten wir die Ergebnisse der SSRS-Matrixsteuerung zuführen, die die Rückgabegründe über die Spaltenachse des Berichts verbreiten wird. Allerdings nutzt nicht jeder SSRS (obwohl die meisten Leute sollten). Aber auch damals müssen die Entwickler die Ergebnismengen in etwas anderes als ein Reporting-Tool verbrauchen. Also für dieses Beispiel gehen wir davon aus, dass wir die Ergebnismenge für eine Web-Raster-Seite generieren wollen und evtl. der Entwickler die Zwischensummen-Zeilen (wo ich einen ResultSetNum-Wert von 2 und 3 habe) ausgeben und sie in ein zusammenfassendes Raster stellen möchte. Also Grundlinie, wir müssen die Ausgabe direkt aus einer gespeicherten Prozedur generieren. Und als eine weitere Wendung nächste Woche könnte es geben Rückkehr X und Y und Z. Also wir don39t wissen, wie viele Rückkehr Gründe dort sein könnte. Wir wollen einfach die Abfrage auf die möglichen unterschiedlichen Werte für Return Reason platzieren. Hier ist, wo die T-SQL PIVOT hat eine Beschränkung müssen wir ihm die möglichen Werte. Da wir wissen, dass bis zur Laufzeit, müssen wir die Abfrage Zeichenfolge dynamisch mit dem dynamischen SQL-Muster zu generieren. Das dynamische SQL-Muster beinhaltet das Erzeugen der Syntax, Stück für Stück, das Speichern in einem String und das Ausführen des Strings am Ende. Dynamic SQL kann schwierig sein, da wir die Syntax in einen String einbetten müssen. Aber in diesem Fall ist es unsere einzige wahre Option, wenn wir eine variable Anzahl von Rückgabegründen behandeln wollen. Ich habe immer herausgefunden, dass der beste Weg, um eine dynamische SQL-Lösung zu schaffen, ist, herauszufinden, was die quittale Quotie-Abfrage am Ende sein würde (in diesem Fall angesichts der Rückkehr Gründe, die wir kennen) und dann Reverse-Engineering es durch Piecing Es zusammen ein Teil zu einer Zeit. Und so ist hier das SQL, das wir brauchen, wenn wir wüssten, dass die Rückkehrgründe (A bis D) statisch waren und sich nicht ändern würden. Die Abfrage führt die folgenden aus: Kombiniert die Daten aus SalesData mit den Daten von ReturnData, wo wir das Wort Sales als Aktionstyp aus der Verkaufstabelle quonarddraht und dann den Rückgabegrund aus den Rückgabedaten in dieselbe ActionType-Spalte verwenden. Das gibt uns eine saubere ActionType Spalte, auf der man sich drehen kann. Wir kombinieren die beiden SELECT-Anweisungen in einen gemeinsamen Tabellenausdruck (CTE), der grundsätzlich eine abgeleitete Tabellenunterabfrage ist, die wir später in der nächsten Anweisung (zu PIVOT) verwenden. Eine PIVOT-Anweisung gegen den CTE, die die Dollars für den Aktionstyp summiert In einem der möglichen Aktionstyp-Werte liegen. Beachten Sie, dass dies die endgültige Ergebnismenge ist. Wir stellen diese in einen CTE, der aus dem ersten CTE liest. Der Grund dafür ist, dass wir am Ende mehrere Gruppierungen machen wollen. Die endgültige SELECT-Anweisung, die von der PIVOTCTE liest und sie mit einer nachfolgenden Abfrage gegen dieselbe PIVOTCTE kombiniert, aber wo wir auch zwei Gruppierungen in der GROUPING SETS-Funktion in SQL 2008 implementieren: GROUPING nach dem Wochenenddatum (dbo. WeekEndingDate) GRUPPE für alle Zeilen () Also, wenn wir mit Sicherheit wüssten, dass wir niemals mehr Rückgaberecht-Codes haben, dann wäre das die Lösung. Allerdings müssen wir andere Ursachencodes berücksichtigen. Also müssen wir diese ganze Abfrage als eine große Zeichenkette generieren, wo wir die möglichen Rückkehrgründe als eine durch Kommas getrennte Liste konstruieren. I39m zeigt den gesamten T-SQL-Code zu generieren (und ausführen) die gewünschte Abfrage. Und dann brechen sie in Teile und erklären jeden Schritt. Also zuerst, hier ist der ganze Code, um dynamisch zu generieren, was ich oben bekommen habe. Es gibt grundsätzlich fünf Schritte, die wir abdecken müssen. Schritt 1 . Wir wissen, dass irgendwo in der Mischung, müssen wir einen String für diese in der Abfrage zu generieren: SalesAmount, Grund A, Grund B, Grund C, Grund D0160016001600160 Was wir tun können, ist ein temporärer gemeinsamer Tabellenausdruck gebaut, der die hart verdrahteten Quoten kombiniert Anzahl der Spalten mit der eindeutigen Liste der möglichen Ursachencodes. Sobald wir das in einem CTE haben, können wir den netten kleinen Trick von FOR XML PATH (3939) benutzen, um diese Zeilen in eine einzelne Saite zu kollabieren, ein Komma vor jeder Zeile zu setzen, die die Abfrage liest und dann STUFF verwenden, um zu ersetzen Die erste Instanz eines Kommas mit einem leeren Raum. Dies ist ein Trick, den Sie in Hunderten von SQL-Blogs finden können. Also dieser erste Teil baut einen String namens ActionString, den wir weiter unten verwenden können. Schritt 2 . Wir wissen auch, dass wir die generierten pivotierten Grundspalten, zusammen mit der Standard-Verkaufsspalte, sortieren möchten. Also brauchen wir dafür einen separaten String, den ich SUMSTRING nenne. Ich benutze einfach den originalen ActionString und schalte dann die äußeren Klammern mit SUM-Syntax und den originalen Klammern wieder auf. Schritt 3: Jetzt beginnt die eigentliche Arbeit. Wenn wir diese Originalabfrage als Modell verwenden, wollen wir die ursprüngliche Abfrage generieren (beginnend mit der UNION der beiden Tabellen), aber das Ersetzen von Referenzen auf verschwenkte Spalten mit den Strings, die wir dynamisch oben erstellt haben. Auch, während nicht unbedingt erforderlich, habe ich auch eine Variable zu einfach jedem Wagen Rücklauf Feed Kombinationen, die wir in die generierte Abfrage (für Lesbarkeit) eingebettet wollen. So konstruieren wir die gesamte Abfrage in eine Variable namens SQLPivotQuery. Schritt 4 . Wir fortsetzen, die Abfrage erneut zu konstruieren und die Syntax zu verknüpfen, die wir mit dem ActionSelectString quothard-wirequot verknüpfen können (die wir dynamisch generiert haben, um alle möglichen Rückgabewerte zu halten) Schritt 5. Schließlich werden wir den letzten Teil der Pivot-Abfrage generieren, der aus dem 2. gemeinsamen Tabellenausdruck (PIVOTCTE, aus dem obigen Modell) liest und das endgültige SELECT aus dem PIVOTCTE liest und es mit einem 2. gelesenen PIVOTCTE kombiniert Implementiere die gruppierungssätze. Schließlich können wir quotexecutequot die Zeichenfolge mit dem SQL-System gespeichert proc spexecuteSQL So hoffentlich können Sie sehen, dass der Prozess, um für diese Art von Aufwand zu bestimmen ist festzustellen, was die endgültige Abfrage wäre, basierend auf Ihrem aktuellen Satz von Daten und Werte (dh gebaut Ein Abfrage-Modell) Schreiben Sie den notwendigen T-SQL-Code, um dieses Abfrage-Modell als String zu generieren. Der wichtigste Teil ist die Bestimmung des einzigartigen Satzes von Werten, auf denen du PIVOT siehst und dann in eine Zeichenkette mit der STUFF-Funktion und dem FOR XML PATH (3939) Trick kollabst. Also, was ist mir heute gut, mindestens 13 Artikel Zwei Vor kurzem habe ich einen BDR geschrieben, der sich zum Teil auf die Rolle der Bildung und den Wert eines guten liberalen Kunsthintergrundes konzentrierte, nicht nur für die Softwareindustrie, sondern auch für andere Branchen. Einer der Themen dieses BDR betonte einen entscheidenden und erleuchteten Standpunkt des renommierten Softwarearchitekten Allen Holub in Bezug auf freie Kunst. Ill (treu) paraphrasieren seine Botschaft: er hob die Parallelen zwischen Programmierung und Studium der Geschichte, indem sie alle daran erinnern, dass die Geschichte liest und schreibt (und krank hinzufügen, identifizieren Muster), und Software-Entwicklung ist auch Lesen und Schreiben (und wieder, Identifizierung von Mustern ). Und so schrieb ich eine Meinung Stück, das auf diese und andere verwandte Themen konzentriert. Aber bis heute habe ich mich nie dazu veranlasst, es zu veröffentlichen. Jeder so oft Id denke daran, es zu überarbeiten, und Id sogar sitzen für ein paar Minuten und machen einige Anpassungen an sie. Aber dann würde das Leben im Allgemeinen in den Weg gehen und Id nie beenden. Also, was hat sich vor ein paar Wochen, Kollegen CoDe Magazine Kolumnist und Branchenführer Ted Neward schrieb ein Stück in seiner regulären Spalte, Managed Coder, die meine Aufmerksamkeit gefangen. Der Titel des Artikels ist On Liberal Arts. Und ich empfehle, dass jeder es liest. Ted diskutiert den Wert eines liberalen Kunsthintergrundes, die falsche Dichotomie zwischen einem liberalen Kunsthintergrund und Erfolg in der Softwareentwicklung und die Notwendigkeit, gut zu schreiben. Er spricht über einige seiner eigenen vergangenen Begegnungen mit HR Personalmanagement in Bezug auf seinen pädagogischen Hintergrund. Er unterstreicht auch die Notwendigkeit, sich an Veränderungen in unserer Branche anzupassen und anzupassen, sowie die Kennzeichen eines erfolgreichen Software-Profis (zuverlässig, vorausschauend und lernen, anfänglichen Konflikt mit anderen Teammitgliedern zu kommen). So ist es ein tolles Lesen, wie sind Teds andere CoDe Artikel und Blog-Einträge. Es hat mich auch dazu gebracht, über meine Ansichten zu diesem (und anderen Themen) nachzudenken und mich schließlich zu motivieren, meine eigene Redaktion zu beenden. Also, besser spät als nie, hier sind meine aktuellen Bäcker Dutzend von Reflexionen: Ich habe ein Sprichwort: Wasser friert bei 32 Grad ein. Wenn du in einer Trainingsrolle bist, kannst du dich vielleicht in der Welt alles tun, um jemanden zu helfen, der in der Tat nur eine Temperatur von 34 Grad fühlt und deshalb die Dinge für sie verfestigen. Manchmal dauert es nur ein bisschen mehr Aufwand oder einen anderen ideachemischen Katalysator oder eine neue Perspektive, die bedeutet, dass die mit vorheriger Ausbildung auf unterschiedliche Quellen zurückgreifen können. Wasser friert bei 32 Grad ein. Manche Menschen können ein hohes Maß an Konzentration auch mit einem Raum voller lärmender Menschen beibehalten. Im nicht einer von ihnen gelegentlich brauche ich etwas Privatsphäre, um durch eine kritische Frage zu denken. Manche Leute beschreiben dies, wie Sie lernen müssen, weg von ihm zu gehen. Ein anderer Weg, es ist eine Suche nach der verdünnten Luft. In der vergangenen Woche verbrachte ich stundenlang in halb beleuchtetem, ruhigem Zimmer mit einem Whiteboard, bis ich ein Problem völlig verstanden habe. Erst dann konnte ich mit anderen Entwicklern über eine Lösung sprechen. Die Botschaft hier ist nicht zu predigen, wie Sie über Ihr Geschäft der Lösung von Problemen gehen sollten, sondern für alle, ihre Stärken zu kennen und was funktioniert, und nutzen sie zu Ihrem Vorteil so viel wie möglich. Einige Phrasen sind wie Fingernägel an einer Tafel für mich. Verwenden Sie es als Unterricht Moment ist eins. (Warum ist es wie Fingernägel an einer Tafel Denn wenn du in einer Mentoring-Rolle bist, dann solltest du in der Regel den Moment-Modus unterrichten, aber subtil). Heres ein anderes kann ich nicht wirklich erklären, es in Worte, aber ich verstehe es. Das klingt ein bisschen kalt, aber wenn eine Person wirklich nicht etwas in Worte erklären kann, vielleicht versteht sie es nicht. Sicher, eine Person kann einen unscharfen Sinn haben, wie etwas funktioniert, kann ich bluffen meinen Weg durch die Beschreibung, wie eine Digitalkamera funktioniert, aber die Wahrheit ist, dass ich nicht wirklich verstehen, dass alles so gut. Es gibt ein Feld der Studie bekannt als Erkenntnistheorie (das Studium des Wissens). Eine der grundlegenden Grundlagen des Verständnisses, ob es sich um eine Kamera oder ein Designmuster handelt - ist die Fähigkeit, den Kontext zu etablieren, die Kette der verwandten Ereignisse zu identifizieren, die Attribute aller Komponenten auf dem Weg usw. Ja, das Verständnis ist manchmal sehr harte Arbeit , Aber tauchen in ein Thema und brechen es auseinander ist die Mühe wert. Sogar diejenigen, die die Zertifizierung verzichten, werden anerkennen, dass der Prozess des Studiums für Zertifizierungsprüfungen dazu beitragen wird, Lücken in Wissen zu füllen. Ein Datenbank-Manager ist eher zu einem Datenbank-Entwickler, der extemporane (und mühelos) über Transaktions-Isolation Ebenen und Auslöser sprechen können, im Gegensatz zu jemandem, der Art davon weiß, aber kämpft, um ihre Verwendung zu beschreiben. Theres ein anderes Korollar hier Ted Neward empfiehlt, dass Entwickler öffentlich sprechen, Bloggen, etc. Ich stimme zu 100. Der Prozess der öffentlichen Rede und Blogging wird Sie praktisch zwingen, darüber nachzudenken, Themen und Abbau Definitionen, die Sie sonst für selbstverständlich genommen haben könnte. Vor ein paar Jahren habe ich gedacht, dass ich die T-SQL MERGE-Anweisung ziemlich gut verstanden habe. Aber erst nach dem Schreiben darüber, sprachen, Fragen von anderen, die Perspektiven hatten, die mir nie einfallen, dass mein Verständnisgrad exponentiell zunahm. Ich kenne eine Geschichte von einem Anmelde-Manager, der einmal einen Autorenentwickler für eine Vertragsposition interviewte. Der Einstellungsleiter war verächtlich von Publikationen im Allgemeinen und bellte bei der Bewerberin an. Also, wenn du hier arbeiten wirst, würdest du lieber Bücher schreiben oder schreiben, schreibe ich ja, ich gebe es in jeder Branche ein paar reine Akademiker. Aber was der Anmelde-Manager verpasst hat, war die Chance für die Stärkung und Schärfung von Skill-Sets. Während ich ein altes Kasten Bücher brauchte, stieß ich auf einen Schatz aus den 1980er Jahren: Programmierer bei der Arbeit. Die Interviews mit einem sehr jungen Bill Gates, Ray Ozzie und anderen bekannten Namen enthält. Jedes Interview und jede Einsicht ist den Preis des Buches wert. Aus meiner Sicht war das interessanteste Interview mit Butler Lampson. Wer gab einen mächtigen Ratschlag. Zur Hölle mit Computerkenntnis. Sein absolut lächerliches. Mathematik studieren Lerne zu denken Lesen. Schreiben. Diese Dinge sind von dauerhafterem Wert. Erfahren Sie, wie die Theoreme zu beweisen: Eine Menge Beweise hat sich im Laufe der Jahrhunderte angesammelt, die darauf hindeutet, dass diese Fähigkeit auf viele andere Dinge übertragbar ist. Butler spricht die Wahrheit. Krank fügen Sie zu diesem Punkt lernen, wie man Teufel befürworten gegen sich selbst zu spielen. Je mehr Sie Realität - überprüfen Sie Ihre eigenen Prozesse und arbeiten, desto besser daneben. Der große Informatiker Allen Holub machte den Zusammenhang zwischen Software-Entwicklung und den freien Künsten speziell, dem Thema Geschichte. Hier war sein Punkt: Was ist Geschichte Lesen und Schreiben. Was ist Software-Entwicklung Unter anderem, Lesen und Schreiben. Ich habe meinen Schülern T-SQL Essay Fragen als Praxis-Tests gegeben. Ein Student scherzte, dass ich mehr wie ein Juraprofessor gehandelt habe. Nun, genau wie Coach Donny Haskins sagte in der Film Glory Road, mein Weg ist schwer. Ich glaube fest an eine starke intellektuelle Grundlage für jeden Beruf. So wie Anwendungen von Rahmenbedingungen profitieren können, können Einzelpersonen und ihre Denkprozesse auch von menschlichen Rahmenbedingungen profitieren. Das ist die Grundlagen der Stipendien. Es gibt eine Geschichte, die in den 1970er Jahren, IBM erweitert ihre Rekrutierung Bemühungen in den großen Universitäten durch die Konzentration auf die besten und hellsten liberalen Kunst Absolventen. Sogar dann erkannten sie, dass die besten Leser und Schriftsteller irgendwann zu starken Programmiersystemanalysten werden könnten. (Fühlen Sie sich frei, diese Geschichte zu jedem HR-Typ zu verwenden, der darauf besteht, dass ein Kandidat einen Informatik-Abschluss haben muss) Und von der Geschichte zu sprechen: Wenn aus keinem anderen Grund, ist es wichtig, sich an die Geschichte der Produktfreigaben zu erinnern, wenn ich bei der Arbeit arbeite Client-Site, die immer noch mit SQL Server 2008 oder sogar (Gasp) SQL Server 2005, muss ich mich erinnern, welche Features wurden in den Versionen im Laufe der Zeit implementiert. Hast du jemals einen Lieblingsarzt, den du gemocht hast, weil er die Dinge in einfachem Englisch erklärt hat, gab dir die gerade Wahrheit und verdiente dein Vertrauen, auf dich zu operieren. Das sind wahnsinnige Fähigkeiten. Und sind das Ergebnis von Erfahrung und HARTE ARBEIT, die Jahre und sogar Jahrzehnte zu kultivieren. Es gibt keine Garantien für den Job Erfolg Fokus auf die Fakten, nehmen Sie ein paar kalkulierte Risiken, wenn youre sicher, dass Sie Ihren Weg in die Ziellinie sehen können, lassen Sie die Chips fallen, wo sie können, und nie aus den Augen verlieren, nur wie der Arzt, der verdient hat Dein Vertrauen. Obwohl einige Tage ich kurz bin, versuche ich, meinen Klienten zu behandeln und ihre Daten als Arzt würden Patienten behandeln. Obwohl ein Arzt mehr Geld macht Es gibt viele Klischees, die ich verabscheue, aber Herde, die ich nicht hasse: Es gibt keine solche Sache wie eine schlechte Frage. Als ehemaliger Lehrer hörte eine Sache, die meinen Zorn zog, jemand, der eine andere Person kritisierte, um eine angeblich, dumme Frage zu stellen. Eine Frage bedeutet, dass eine Person anerkennt, dass sie eine gewisse Lücke haben, um sie zu füllen. Ja, einige Fragen sind besser formuliert als andere, und einige Fragen erfordern zusätzliche Framing, bevor sie beantwortet werden können. Aber die Reise von einer Frage zu einer Antwort ist wahrscheinlich, einen aktiven geistigen Prozess in anderen zu erzeugen. Es gibt alles gute Dinge. Viele gute und fruchtbare Diskussionen entspringen einer dummen Frage. Ich arbeite auf der ganzen Linie in SSIS, SSAS, SSRS, MDX, PPS, SharePoint, Power BI, DAX alle Werkzeuge im Microsoft BI Stack. Ich schreibe immer noch einen Code von Zeit zu Zeit. Aber erraten, was ich noch so viel Zeit damit verbringen, T-SQL-Code zu Profildaten als Teil des Entdeckungsprozesses zu schreiben. Alle Anwendungsentwickler sollten gute T-SQL-Koteletts haben. Ted Neward schreibt (richtig) über die Notwendigkeit, sich an die technologischen Veränderungen anzupassen. Krank dazu beitragen, die Notwendigkeit, sich an clientemployer Änderungen anzupassen. Unternehmen ändern Geschäftsregeln. Unternehmen erwerben andere Unternehmen (oder werden das Ziel einer Akquisition). Unternehmen machen Fehler bei der Vermittlung von Geschäftsanforderungen und Spezifikationen. Ja, wir können manchmal eine Rolle bei der Hilfe bei der Bewältigung dieser Änderungen spielen und manchmal waren die Fliege, nicht die Windschutzscheibe. Diese verursachen manchmal große Schmerzen für alle, besonders die I. T. Menschen. Darum besteht der Begriff der Tatsache des Lebens, wir müssen damit umgehen. Genau wie kein Entwickler schreibt Bug-Free-Code jedes Mal, kein I. T. Person befasst sich gut mit dem Wechsel jedes Mal. Einer der größten Kämpfe, die ich in meinen 28 Jahren in dieser Branche hatte, zeigt Geduld und Zurückhaltung, wenn Veränderungen aus vielen verschiedenen Richtungen fliegen. Hier ist, wo meine vorherige Vorschlag über die Suche nach der gereinigten Luft kann helfen. Wenn Sie es schaffen, Änderungen in Ihren Gedankenprozess zu integrieren, und ohne das Gefühl überwältigt, sind die Chancen youll ein wichtiges Kapital. In den letzten 15 Monaten musste ich mit einer riesigen Menge an professionellem Wechsel umgehen. Es war schon sehr schwierig, aber Ive beschloss, dass diese Änderung die Norm sein wird, und ich habe versucht, meine eigenen Gewohnheiten so gut wie möglich zu machen, um mit häufigen (und unsicheren) Veränderungen fertig zu werden. Es ist schwer, sehr hart Aber als Trainer Jimmy Duggan sagte in der Film Eine Liga ihrer eigenen: Natürlich ist es schwer. Wenn es nicht schwer war, würde jeder es tun. Das ist hart, was macht es toll Eine kraftvolle Botschaft. Theres wurde in den letzten Jahren über die Durchführung von Fachkonferenzen (und in der Branche als Ganzes) geführt. Viele angesehene Schriftsteller haben sehr gute Editorials zum Thema geschrieben. Heres meine Eingabe, für was seinen Wert. Its a message to those individuals who have chosen to behave badly: Dude, it shouldnt be that hard to behave like an adult. A few years ago, CoDe Magazine Chief Editor Rod Paddock made some great points in an editorial about Codes of Conduct at conferences. Its definitely unfortunate to have to remind people of what they should expect out of themselves. But the problems go deeper. A few years ago I sat on a five-person panel (3 women, 2 men) at a community event on Women in Technology. The other male stated that men succeed in this industry because the Y chromosome gives men an advantage in areas of performance. The individual who made these remarks is a highly respected technology expert, and not some bozo making dongle remarks at a conference or sponsoring a programming contest where first prize is a date with a bikini model. Our world is becoming increasingly polarized (just watch the news for five minutes), sadly with emotion often winning over reason. Even in our industry, recently I heard someone in a position of responsibility bash software tool XYZ based on a ridiculous premise and then give false praise to a competing tool. So many opinions, so many arguments, but heres the key: before taking a stand, do your homework and get the facts . Sometimes both sides are partly rightor wrong. Theres only one way to determine: get the facts. As Robert Heinlein wrote, Facts are your single clue get the facts Of course, once you get the facts, the next step is to express them in a meaningful and even compelling way. Theres nothing wrong with using some emotion in an intellectual debate but it IS wrong to replace an intellectual debate with emotion and false agenda. A while back I faced resistance to SQL Server Analysis Services from someone who claimed the tool couldnt do feature XYZ. The specifics of XYZ dont matter here. I spent about two hours that evening working up a demo to cogently demonstrate the original claim was false. In that example, it worked. I cant swear it will always work, but to me thats the only way. Im old enough to remember life at a teen in the 1970s. Back then, when a person lost hisher job, (often) it was because the person just wasnt cutting the mustard. Fast-forward to today: a sad fact of life is that even talented people are now losing their jobs because of the changing economic conditions. Theres never a full-proof method for immunity, but now more than ever its critical to provide a high level of what I call the Three Vs (value, versatility, and velocity) for your employerclients. I might not always like working weekends or very late at night to do the proverbial work of two people but then I remember there are folks out there who would give anything to be working at 1 AM at night to feed their families and pay their bills. Always be yourselfyour BEST self. Some people need inspiration from time to time. Heres mine: the great sports movie, Glory Road. If youve never watched it, and even if youre not a sports fan I can almost guarantee youll be moved like never before. And Ill close with this. If you need some major motivation, Ill refer to a story from 2006. Jason McElwain, a high school student with autism, came off the bench to score twenty points in a high school basketball game in Rochester New York. Heres a great YouTube video. His mother said it all . This is the first moment Jason has ever succeeded and is proud of himself. I look at autism as the Berlin Wall. He cracked it. To anyone who wanted to attend my session at todays SQL Saturday event in DC I apologize that the session had to be cancelled. I hate to make excuses, but a combination of getting back late from Detroit (client trip), a car thats dead (blown head gasket), and some sudden health issues with my wife have made it impossible for me to attend. Back in August, I did the same session (ColumnStore Index) for PASS as a webinar. You can go to this link to access the video (itll be streamed, as all PASS videos are streamed) The link does require that you fill out your name and email address, but thats it. And then you can watch the video. Feel free to contact me if you have questions, at kgoffkevinsgoff November 15, 2013 Getting started with Windows Azure and creating SQL Databases in the cloud can be a bit daunting, especially if youve never tried out any of Microsofts cloud offerings. Fortunately, Ive created a webcast to help people get started. This is an absolute beginners guide to creating SQL Databases under Windows Azure. It assumes zero prior knowledge of Azure. You can go to the BDBI Webcasts of this website and check out my webcast (dated 11102013). Or you can just download the webcast videos right here: here is part 1 and here is part 2. You can also download the slide deck here. November 03, 2013 Topic this week: SQL Server Snapshot Isolation Levels, added in SQL Server 2005. To this day, there are still many SQL developers, many good SQL developers who either arent aware of this feature, or havent had time to look at it. Hopefully this information will help. Companion webcast will be uploaded in the next day look for it in the BDBI Webcasts section of this blog. October 26, 2013 Im going to start a weekly post of T-SQL tips, covering many different versions of SQL Server over the years Heres a challenge many developers face. Ill whittle it down to a very simple example, but one where the pattern applies to many situations. Suppose you have a stored procedure that receives a single vendor ID and updates the freight for all orders with that vendor id. create procedure dbo. UpdateVendorOrders update Purchasing. PurchaseOrderHeader set Freight Freight 1 where VendorID VendorID Now, suppose we need to run this for a set of vendor IDs. Today we might run it for three vendors, tomorrow for five vendors, the next day for 100 vendors. We want to pass in the vendor IDs. If youve worked with SQL Server, you can probably guess where Im going with this. The big question is how do we pass a variable number of Vendor IDs Or, stated more generally, how do we pass an array, or a table of keys, to a procedure Something along the lines of exec dbo. UpdateVendorOrders SomeListOfVendors Over the years, developers have come up with different methods: Going all the way back to SQL Server 2000, developers might create a comma-separated list of vendor keys, and pass the CSV list as a varchar to the procedure. The procedure would shred the CSV varchar variable into a table variable and then join the PurchaseOrderHeader table to that table variable (to update the Freight for just those vendors in the table). I wrote about this in CoDe Magazine back in early 2005 (code-magazinearticleprint. aspxquickid0503071ampprintmodetrue. Tip 3) In SQL Server 2005, you could actually create an XML string of the vendor IDs, pass the XML string to the procedure, and then use XQUERY to shred the XML as a table variable. I also wrote about this in CoDe Magazine back in 2007 (code-magazinearticleprint. aspxquickid0703041ampprintmodetrue. Tip 12)Also, some developers will populate a temp table ahead of time, and then reference the temp table inside the procedure. All of these certainly work, and developers have had to use these techniques before because for years there was NO WAY to directly pass a table to a SQL Server stored procedure. Until SQL Server 2008 when Microsoft implemented the table type. This FINALLY allowed developers to pass an actual table of rows to a stored procedure. Now, it does require a few steps. We cant just pass any old table to a procedure. It has to be a pre-defined type (a template). So lets suppose we always want to pass a set of integer keys to different procedures. One day it might be a list of vendor keys. Next day it might be a list of customer keys. So we can create a generic table type of keys, one that can be instantiated for customer keys, vendor keys, etc. CREATE TYPE IntKeysTT AS TABLE ( IntKey int NOT NULL ) So Ive created a Table Typecalled IntKeysTT . Its defined to have one column an IntKey. Nowsuppose I want to load it with Vendors who have a Credit Rating of 1..and then take that list of Vendor keys and pass it to a procedure: DECLARE VendorList IntKeysTT INSERT INTO VendorList SELECT BusinessEntityID from Purchasing. Vendor WHERE CreditRating 1 So, I now have a table type variable not just any table variable, but a table type variable (that I populated the same way I would populate a normal table variable). Its in server memory (unless it needs to spill to tempDB) and is therefore private to the connectionprocess. OK, can I pass it to the stored procedure now Well, not yet we need to modify the procedure to receive a table type. Heres the code: create procedure dbo. UpdateVendorOrdersFromTT IntKeysTT IntKeysTT READONLY update Purchasing. PurchaseOrderHeader set Freight Freight 1 FROM Purchasing. PurchaseOrderHeader JOIN IntKeysTT TempVendorList ON PurchaseOrderHeader. VendorID Te mpVendorList. IntKey Notice how the procedure receives the IntKeysTT table type as a Table Type (again, not just a regular table, but a table type). It also receives it as a READONLY parameter. You CANNOT modify the contents of this table type inside the procedure. Usually you wont want to you simply want to read from it. Well, now you can reference the table type as a parameter and then utilize it in the JOIN statement, as you would any other table variable. So there you have it. A bit of work to set up the table type, but in my view, definitely worth it. Additionally, if you pass values from , youre in luck. You can pass an ADO data table (with the same tablename property as the name of the Table Type) to the procedure. For developers who have had to pass CSV lists, XML strings, etc. to a procedure in the past, this is a huge benefit. Finally I want to talk about another approach people have used over the years. SQL Server Cursors. At the risk of sounding dogmatic, I strongly advise against Cursors, unless there is just no other way. Cursors are expensive operations in the server, For instance, someone might use a cursor approach and implement the solution this way: DECLARE VendorID int DECLARE dbcursor CURSOR FASTFORWARD FOR SELECT BusinessEntityID from Purchasing. Vendor where CreditRating 1 FETCH NEXT FROM dbcursor INTO VendorID WHILE FETCHSTATUS 0 EXEC dbo. UpdateVendorOrders VendorID FETCH NEXT FROM dbcursor INTO VendorID The best thing Ill say about this is that it works. And yes, getting something to work is a milestone. But getting something to work and getting something to work acceptably are two different things. Even if this process only takes 5-10 seconds to run, in those 5-10 seconds the cursor utilizes SQL Server resources quite heavily. Thats not a good idea in a large production environment. Additionally, the more the of rows in the cursor to fetch and the more the number of executions of the procedure, the slower it will be. When I ran both processes (the cursor approach and then the table type approach) against a small sampling of vendors (5 vendors), the processing times where 260 ms and 60 ms, respectively. So the table type approach was roughly 4 times faster. But then when I ran the 2 scenarios against a much larger of vendors (84 vendors), the different was staggering 6701 ms versus 207 ms, respectively. So the table type approach was roughly 32 times faster. Again, the CURSOR approach is definitely the least attractive approach. Even in SQL Server 2005, it would have been better to create a CSV list or an XML string (providing the number of keys could be stored in a scalar variable). But now that there is a Table Type feature in SQL Server 2008, you can achieve the objective with a feature thats more closely modeled to the way developers are thinking specifically, how do we pass a table to a procedure Now we have an answer Hope you find this feature help. Feel free to post a comment. SQL Correlated Subquery Summary . in this tutorial, you will learn about the SQL correlated subquery . which is a subquery that depends on the outer query. This tutorial requires a good knowledge of subquery. If you don8217t know anything about the subquery. check it out the subquery tutorial before moving forward with this tutorial. Introduction to SQL correlated subquery A correlated subquery is a subquery that depends on the outer query. It means that the WHERE clause of the correlated subquery uses the data of the outer query. The main difference between a correlated subquery and a non-correlated subquery is that you cannot execute a correlated subquery alone like a non-correlated subquery. In addition, a correlated subquery executes once for each selected row from the outer query. A correlated subquery is also known as repeating subquery or synchronized subquery. SQL correlated subquery examples Lets take a look at some examples to understand the idea of the correlated subquery. SQL correlated subquery in the SELECT clause example The following query selects top five customers by sales:Computational tools Analogously, DataFrame has a method cov to compute pairwise covariances among the series in the DataFrame, also excluding NAnull values. Unter der Annahme, dass die fehlenden Daten zufällig fehlen, ergibt sich eine Schätzung für die Kovarianzmatrix, die unvoreingenommen ist. Für viele Anwendungen ist diese Schätzung jedoch nicht akzeptabel, da die geschätzte Kovarianzmatrix nicht als positiv halb-definitiv garantiert ist. Dies könnte zu geschätzten Korrelationen mit absoluten Werten führen, die größer als eins sind und eine nicht invertierbare Kovarianzmatrix. Siehe Schätzung der Kovarianzmatrizen für weitere Details. DataFrame. cov unterstützt auch ein optionales Minperiod-Keyword, das die erforderliche Mindestanzahl von Beobachtungen für jedes Spaltenpaar angibt, um ein gültiges Ergebnis zu erhalten. Die im Fenster verwendeten Gewichte werden durch das Schlüsselwort wintype angegeben. Die Liste der anerkannten Typen sind: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (benötigt beta) gaussian (benötigt std) generalgaussian (benötigt Macht, Breite) slepian (braucht Breite). Beachten Sie, dass das Kastenfenster dem Mittelwert entspricht (). Für einige Fensterfunktionen müssen zusätzliche Parameter angegeben werden: Für. sum () mit einem Wintype. Es gibt keine Normalisierung an den Gewichten für das Fenster. Wenn man benutzerdefinierte Gewichte von 1, 1, 1 erhält, ergibt sich ein anderes Ergebnis als die Gewichte von 2, 2, 2. zum Beispiel. Beim Überschreiten eines Wintyps anstatt explizit die Gewichte zu spezifizieren, sind die Gewichte bereits normalisiert, so dass das größte Gewicht 1 ist. Im Gegensatz dazu ist die Art der. mean () - Berechnung so, dass die Gewichte in Bezug aufeinander normalisiert werden. Gewichte von 1, 1, 1 und 2, 2, 2 ergeben das gleiche Ergebnis. Time-aware Rolling Neu in Version 0.19.0. Neu in der Version 0.19.0 sind die Möglichkeit, einen Offset (oder Cabrio) an eine. rolling () - Methode zu übergeben und es auf der Grundlage des übergebenen Zeitfensters variable Fenster zu erzeugen. Für jeden Zeitpunkt sind alle vorangegangenen Werte innerhalb der angegebenen Zeit delta enthalten. Dies kann besonders nützlich für einen nicht regelmäßigen Zeitfrequenzindex sein. Dies ist ein regelmäßiger Frequenzindex. Die Verwendung eines Integer-Fensterparameters funktioniert, um die Fensterfrequenz zu rollen. Die Angabe eines Offsets ermöglicht eine intuitivere Spezifikation der Rollfrequenz. Mit einem nicht regelmäßigen, aber immer noch monotonen Index, das Rollen mit einem ganzzahligen Fenster gibt keine spezielle Berechnung. Die Verwendung der Zeit-Spezifikation erzeugt variable Fenster für diese spärlichen Daten. Darüber hinaus erlauben wir nun einen optionalen Parameter, um eine Spalte (und nicht die Standardeinstellung des Index) in einem DataFrame anzugeben. Time-aware Rolling vs. Resampling Mit. rolling () mit einem zeitbasierten Index ähnelt dem Resampling. Sie betreiben und führen reduktive Operationen auf zeitindizierten Pandasobjekten durch. Bei Verwendung von. rolling () mit einem Offset. Der Versatz ist ein Zeit-Dreieck. Nehmen Sie ein Rückwärts-in-Zeit-Fenster und aggregieren alle Werte in diesem Fenster (einschließlich der Endpunkt, aber nicht der Startpunkt). Dies ist der neue Wert zu diesem Zeitpunkt im Ergebnis. Dies sind variable Fenster im Zeitraum für jeden Punkt der Eingabe. Sie erhalten ein gleiches Ergebnis wie die Eingabe. Bei Verwendung von. resample () mit einem Offset. Konstruieren Sie einen neuen Index, der die Häufigkeit des Offsets ist. Für jeden Frequenz-Bin, Aggregat Punkte aus der Eingabe in einem Rückwärts-in-Zeit-Fenster, die in diesem bin. Das Ergebnis dieser Aggregation ist die Ausgabe für diesen Frequenzpunkt. Die Fenster sind im Größenbereich feste Größe. Ihr Ergebnis hat die Form einer regelmäßigen Frequenz zwischen dem Min und dem Maximum des ursprünglichen Eingabeobjekts. Zusammenfassen. Rolling () ist eine zeitbasierte Fensterbedienung, während. resample () eine frequenzbasierte Fensteroperation ist. Zentrieren von Windows Standardmäßig sind die Etiketten am rechten Rand des Fensters eingestellt, aber ein zentrales Schlüsselwort steht zur Verfügung, so dass die Etiketten in der Mitte eingestellt werden können. Binäre Fensterfunktionen cov () und corr () können bewegte Fensterstatistiken über zwei Serien oder eine beliebige Kombination von DataFrameSeries oder DataFrameDataFrame berechnen. Hier ist das Verhalten in jedem Fall: zwei Serien. Berechnen Sie die Statistik für die Paarung. DataFrameSeries. Berechnen Sie die Statistik für jede Spalte des DataFrame mit der übergebenen Serie und geben so ein DataFrame zurück. DataFrameDataFrame. Standardmäßig berechnen Sie die Statistik für passende Spaltennamen und geben ein DataFrame zurück. Wenn das Keyword-Argument paarweiseTrue übergeben wird, berechnet man die Statistik für jedes Spaltenpaar und gibt ein Panel zurück, dessen Elemente die betreffenden Termine sind (siehe nächster Abschnitt). Computing Rolling Paarweise Kovarianzen und Korrelationen In der Finanzdatenanalyse und anderen Bereichen it8217s gemeinsam, um Kovarianz und Korrelationsmatrizen für eine Sammlung von Zeitreihen zu berechnen. Oft ist man auch an Moving-Fenster-Kovarianz - und Korrelationsmatrizen interessiert. Dies kann getan werden, indem man das paarweise Schlüsselwort-Argument übergibt, das im Fall von DataFrame-Eingaben ein Panel liefert, dessen Elemente die Daten sind. Im Falle eines einzigen DataFrame-Arguments kann das paarweise Argument sogar weggelassen werden: Fehlende Werte werden ignoriert und jeder Eintrag wird mit den paarweise vollständigen Beobachtungen berechnet. Bitte beachten Sie die Kovarianz-Sektion für Einschränkungen, die mit dieser Methode zur Berechnung von Kovarianz - und Korrelationsmatrizen verbunden sind. Abgesehen davon, dass kein Fensterparameter vorhanden ist, haben diese Funktionen die gleichen Schnittstellen wie ihre. rolling-Pendants. Wie oben sind die Parameter, die sie alle akzeptieren: minperiods. Schwelle von Nicht-Null-Datenpunkten zu erfordern. Standardmäßig benötigt, um die Statistik zu berechnen. Es werden keine NaNs ausgegeben, sobald Minimalperioden Nicht-Null-Datenpunkte gesehen wurden. Center. Boolean, ob die Etiketten in der Mitte gesetzt werden sollen (Standard ist False) Die Ausgabe der. rolling - und. expanding-Methoden gibt kein NaN zurück, wenn es im aktuellen Fenster mindestens Minimalperioden gibt. Das unterscheidet sich von cumsum. Cumprod Cummax Und cummin Die NaN in der Ausgabe zurückgeben, wo ein NaN in der Eingabe angetroffen wird. Eine expandierende Fensterstatistik wird stabiler (und weniger reaktionsfähig) als sein Rollfenster, da die zunehmende Fenstergröße die relative Auswirkung eines einzelnen Datenpunktes verringert. Als Beispiel hierbei handelt es sich um die mittlere () Ausgabe für den vorherigen Zeitreihen-Datensatz: Exponentiell gewichtetes Fenster Ein verwandter Satz von Funktionen sind exponentiell gewichtete Versionen mehrerer der obigen Statistiken. Eine ähnliche Schnittstelle zu. rolling und. expanding wird durch die. ewm-Methode aufgerufen, um ein EWM-Objekt zu empfangen. Es werden eine Reihe von expandierenden EW (exponentiell gewichtete) Methoden bereitgestellt:

No comments:

Post a Comment