2016-09-01

Performance Recommendations you DO NOT want to do in your Azure SQL DB

שלום לכולם
בתקופה האחרונה אני רואה טרנד מאד חזק של בלוגים ומאמרים שאומרים "אל תהיה טיפש.... אל תעשה את זה.." או בלוגים בסגנון של "רעיונות ממש - אבל ממש רעים..".
אז יילה גם אני ארחב על הגל הזה בהקשר של SQL Azure.
והיום ה - "אל תהיה טיפש" מספר 1:
 
יש בפורטל מסך השייך לכל בסיס נתונים ובו פעולות אפשריות על בסיס הנתונים - החל בפתיחת קריאה - עבור לשינוי יכולות וביצועים וכלה בהמלצות.
תחת הכותרת:
"SUPPORT + TROUBLESHOOTING"
יש 5 אפשרויות לחיצה
הראשונה בודקת מצב כללי של בסיס הנתונים.
האחרונה זו פתיחת קריאה ישר על בסיס הנתונים הזה - מאד נוח לשימוש וממליץ לפתוח קריאה מפה.
 

 

 
השניה מציגה סיכום קצר של נקודות 3 וארבע כלומר
 
Over view on Query insights - that is the same as query store
and Overview on Performance Recommendations.
 
זהו המסך:
 
 
 
 

המסך מחולק ל 4 חלקים - למעלה זהו החלק שאחראי על
 
 Overview on Performance Recommendations:
Create & Drop indexes & Fix Schema issues
 
כאשר בצד שמאל ההמלצות
באמצע סיכום של פעילות שמתבצעת עכשיו במידה ולחצת שאתה מוכן שיופעלו ההמלצות בצורה אוטמטית.
בצד ימין קישור למסך שמאפשר לך להחליט האם אתה מאשר שההמלצות יבוצעו אוטמטית.
 
בחלק התחתון של המסך יש סיכום של השאילות שמשפיעות ובעצם על פיהם ההמלצות נקבעות - שזהוא סוג של  אודיט מאד נוח ושימושי ומלמד מה עובר על המערכת - אבל לא עליו נדבר היום!.
 
בקיצור להלן 3 שלינקים שמסבירים היטב דברים על מסך זה:
 
 
מעולה - עכשיו כולם מומחים.
ועתה נסביר ממה צריך להיזהר כדי לא לצאת טיפשים:
 
יש לנו בסיס נתונים שעובדים עליו הרבה והוא גם מאד גדול
נכנסים אליו ומקבלים למעלה שורה סגולה עם המלצה
 
 
 
לוחצים על ההמלצה וההמלצה שלהם הייתה להוסיף דחוף אינדקס שישפר ביצועים
HIGH IMPACT
 
 
 

 
 
לוחצים על השורה - שמחים ומאושרים כדי לראות איזה אינדקס יציל לנו את המערכת:
 
 שימו לב לפרטים הרבים ואפילו - וזה חידוש ל
DISK SPACE NEEDED
 
וואו יש לנו פה 22 GB של אינדקס - די גדול.
 
אנו נמצאים בבסיס נתונים P1 - כלומר 500 GB.
שימו לב שהאינדקס יהיה 4.4% מבסיס הנתונים.

בואו נראה את הסקריפט שהם מציעים להריץ:
 
אפשר לומר שהם יודעים לכתוב SQL.
אחלה אינדקס.
 
עכשיו ל"אל תהיו טיפשים - 1"
כן אפשר לאפשר להם אוטמטית לבנות ואיפילו זה לא משפיע על המערכת ולא מסיים את המקום בלוג - הכל עובד חלק וזה יפה מאד.
אולם למה ??? למה הם לא הוסיפו
WITH (DATA_COMPRESSION =  <option>) 
דבר שהיה חוסך מספר לא מבוטל של GB.
 
לא מבין מדוע - אבל ההמלצה היא לא להדליק את האוטמציה אלא להשתמש בתבונה בהמלצות שלה
 
יום נפלא.
פיני



2016-08-11

Azure SQL DB - Service Tiers

Hi All
Since we got change in Azure SQL DB tiers last week - and have now P15 tier, I have collected some data about the tiers and put it all in 1 table.
I collected data from 3 sources:
 
Please note - all the DATA is not relevant to:
  • Elastic DB pools - collections few Azure SQL DB to a one pool.
  • Stretch DB - Migrated Tables from SQL Serve 2016 to Azure SQL DB.
  • SQL DWH - DB for DWH in Azure that can be stopped.
 
Changes can happened during time, the table is Updated for today (2015-08-11)
 
If you want it in you mail box let me know. 
 
Pini

2016-07-19

Azure Audit Logs and DBA's

שלום רב
כבר מעל חודשיים מעל הפוסט האחרון, הסיבה המרכזית היא שעברנו בחברה שלנו ל Storage חדש, בסביבת ה On Premise.
עברנו לסביבת All Flash של Kaminario הישראלית.
אבל מה לנו בפוסט על הענן ועל Storage....
היום נדבר על שליטה - אנו ה DBA הרי ידועים כ Control freaks. הרי למי אין איזה ג'וב שמתריע לו שיש DB חדש לגבות ? למי אין ג'וב שמתריע על כל שינוי?
ובכן ב Azure אפשר לשנות בסיסי נתונים על ידי פקודות T-SQL או PS, ורוב פקודות אלו מתועדות.
אבל יש דברים שעושים דרך הפורטל ואז זה לא מתועד בבסיסי הנתונים עצמם.

ולכך יש את ה Audit logs.

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

יש 2 דרכים לראות את הלוגים הללו מהפורטל עצמו ומ POWER BI.
  1. פורטל עצמו: לוחצים על הכפתור של הלוגים,
 
לאחר שלחצתם על הכפתור מגיעים למסך חיפוש, זהו מסך יחסית חדש (עד לפני שבועיים זה הייתה רשימה וכיום מסך חיפוש, שבטח עוד יעבור שיפוץ).
ניתן לפלטר לפי מספר קריטריונים - אני חיפשתי פעולות אדמינסטטיביות שקשורות לבסיסי נתונים כמו יצירת בסיס נתונים, שרתים, הדלקת audit ועוד.
 
להלן מסך החיפוש המחודש ומספר תוצאות
ריבועים אדומים אלו דוגמאות לפילטרים.
ריבועים כחולים מייצגים דוגמא למידע - אם זה מישהו בפורטל או אם זה אוטמציה שהופעלה בענן ואז זה SQL User.
 
רואים פה את מרחב הפעולות שבוצעו ומתי ואם לוחצים על השורה יש פרטים למטה, ואפשר לשמור את זה לאקסל...


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

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

2016-05-02

Geo-Replications Types in SQL Azure - New features

שלום רב
והיום לשם שינוי פוסט בעיברית.

בתאריך 2015-02-19 כתבתי פוסט בנושא Geo-Replications Types in SQL Azure.

http://www.sqlazure.co.il/2015/02/geo-replications-types-in-sql-azure.html

שם הצגתי את 2  האפשרויות שקיימות ב Azure SQL בנושא זה:
  • Standard Geo-Replication.
  • Active Geo-Replication. 
כאשר ההבדלים המרכזיים היו בתחום של Readable / NON Readable, מיקום הרפליקות ועוד.

בתאריך 2015-11-23 הצגתי בפוסט נוסף את החידוש של Fail Over - כלומר שאפשר לשחק בין Primary and Secondary.

http://www.sqlazure.co.il/2015/11/failover-in-sql-azure-db-with-geo.html

והיום אציג את הצעד השלישי בהתפתחות עולם ה - DR ב SQL Azure.
וזה מה שמעניין בענן - צריך חזון - ואז האפשרויות בלתי מוגבלות - ולנו המשתמשים הכל תלוי בעומק הכיס....
השינוי הכי מהותי לדעתי הוא זה:
  • The performance objectives can be different between primary and secondary. 
כלומר ניתן יהיה לעבוד עם קונפיגורציה כזו שה Primary יהיה בעלות למשל של S3, ואילו ה Secondary יהיה S0. וכך יורדו עלויות בצורה דרמטית. חייבים לקחת בחשבון שאם מדובר על DB  שהוא Heavy Write, הכתיבה בצד השני תהיה הרבה יותר איטית וזה לא מומלץ כל כך.
 
מיגבלה נוספת היא שבין tiers כלומר בין Standard and Premium - אי אפשר לעשות קונפיגורציה. P1 Primary לא יכול להיות עם S0 Secondary.
 
כבר לא תהיה אפשרות להרים NON Readable Secondary (ממש באסה - שוב צריך לדחוף את היד לכיס, האפשרות הזו חסכה 20 אחוז מעלות ה Primary).
 
אופציה נוספת שנפתחה היא שבשכבות הזולות ניתן יהיה לפתוח 4  Secondaries, ובכך לעשות סוג של Load balance , בפעולות קריאה. גם פתיחת אופציה למיקומים ברחבי העולם נשמעת מעניינת.
 
להלן 2 לינקים שמרחיבים על האופציות החדשות:
 
 
 
למי שיש היום  Non-readable secondary, צריך לתכנן מעבר ושידרוג עד אפריל 2017:
 
 
 
בקיצור יללה התחילו לרפלק מה שאפשר - לא לשכוח לחשוב על הכיס ועל הביצועים.
פיני
 
 

2016-04-11

Dashboards in Azure Portal

Hi
 
Today I will be reviewing the Azure Portal Dashboard.
We have seen lots of improvements in that field.
It has developed to include a variety of options, and lot of use cases:
 
  1. Monitoring, with full screen and charts.
  2. Shortcuts to the most usable apps.
  3. Share dashboards between users.
  4. You can have multi Dashboards, like Dashboard for DB's, for Storage or VM's or per application or resource group.
I find these new features very useful and very easy to implement.
Here are some screenshots showing the uses.
 
Image 1 - shows what options we have for the Dashboards
 
 
:
We can add new, edit an exiting one, share to other users, clone and delete.
 
 
Image 2 - shows the options when clicking on the arrow near the Dashboard, we see the list of my dashboards, and the dashboards that was shared with me.
 
 
 
Image 3 - shows the screen after clicking on "Share", we can share to a subscription, and put it in a location as resource group.
 
 
 
 
Image 4 - shows a custom Dashboard I created for a 10 sharded DB system - to have the DTU and Storage in the same place - also adding the management DB.
 
  
 
So enjoy your journey with in the new Dashboards world.
 
Thanks
Pini 
 

2016-02-11

Cross Database Queries in SQL Azure DB - Part 2

Hi All
 
So After a month of using Cross Database Queries in SQL Azure DB, I can say that we have a very useful tool.
 
We can use in many scenarios, I will show today one.
 
We are using 10 shards DB's to balance read operations to many DB's. The write operations goes to the DB's as well.
 
I' as a DBA wants to know the status of all DB's, so instead of creating PowerShell that connect to all of the DB's I have created external tables in 1 DB that reads the  
 
sys.dm_db_resource_stats 
 
from all DB's' so I have now 1 real table and 9 external tables.
 
I have created a view that reads from al 10 tables' and now I see all data from all shards.
 
I also put it in PowerBI and I see it in a visual way - and also in my Mobile.
 
Here I have in the first line DTU AVG value for each shard in the last 10 minutes, 1 clock that avg all shards.
 
The second line is the DTU real value in the last 10 Minutes per Shard.
The Third line is the DATA IO value in the last 10 Minutes per Shard.
 
 
 
I More thing, in ssms in sql server 2016 you have special place for external tables:
 
 
 
 
But in SQL Azure - not yet, and even if you will run create script you will not see it.... just use :
 
select * from sys.external_data_sources
select * from sys.external_tables
 
enjoy.
 

2016-01-04

Cross Database Queries in SQL Azure DB - Part 1

Hi
 
I wanted to write this post a long time ago but have not had the chance, so now with the new year - this will be the first post for 2016.
 
Cross Database Queries in SQL Azure DB was a key feature that was missing from day 1 on SQL Azure DB.
Finally we have this  key feature, and no, it is not the same as in the regular SQL Server. We have a new way to do this. It is bases on the new key feature  in SQL Server 2016 called "External Tables" (https://msdn.microsoft.com/en-us/library/dn935021.aspx).
Also known as "PolyBase".
 
The logic behind the feature is that you can query tables with-in your DB (like you are doing today) and also at any other DATA source like it is a table within the DB.
 
From one SQL Azure DB to another we can not connect to it via linked server. However a second SQL Azure DB is referenced like any other external data source.
Microsoft thinking is that SQL Azure DB is another DATA sources for External tables ( like Hadoop, Blob storage ect..).
 
 
I am adding some scripts to make it all easy for you to run and test (here I will not elaborate now about the query performance and execution plans...).
 
First are 2 scripts with reference to security issues (its all about trusted connections between 2 DATA sources):
 
IN DB1
 
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'youramazingpassword';
 
CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryCred
WITH IDENTITY = 'youramazingID',
SECRET = 'youramazingpassword';

The "username" and "password" should be the username and password used to login into the DB2 database.
 
IN DB2 (you create a regular table):
 
CREATE TABLE [dbo].[Customers223](
[CustomerId] [int] NOT NULL,
[Name] [nvarchar](256) NOT NULL,
[RegionId] [int] NOT NULL

);

 
IN DB1  (you create an external table):
 

you create an external DATA Source :
 
CREATE EXTERNAL DATA SOURCE RemoteReferenceData
WITH
(
TYPE=RDBMS,
LOCATION='YOURSERVERNAME.database.secure.windows.net',
DATABASE_NAME='DB2',
CREDENTIAL= ElasticDBQueryCred

 

);


 
 
 
you create an external table that reference to that table in DB2 - with the same name:
 
CREATE EXTERNAL TABLE [dbo].[Customers223](
[CustomerId] [int] NOT NULL,
[Name] [nvarchar](256) NOT NULL,
[RegionId] [int] NOT NULL

)

WITH
(
DATA_SOURCE = RemoteReferenceData
);
 
IN DB2
insert into [Customers223] select 2,'TestPini',3
 
IN DB1
 
select * from [dbo].[Customers223]
 
And....................Yeeeeeeeessssssssssssssssssssssssssss
you will see data from DB2
4 long years I am waiting for this !!!!!!
 
A few things to remember:
  1. If you will do not have an object with the same name in DB2 - you will get error when query it saying "The underlying error message received was: 'Invalid object name 'dbo.Customers224'.'." 
  2. If you add column in DB2 in the table. and you do not add it in the EXTERNAL Table... then you will not see the data. BUT an error " The feature 'ALTER TABLE' is not supported with external tables." You need to drop and create the external table.
  3. the first query - when creating the connection is extremely slow - make your coffee - relax and then all will be good.

  4. the external table can be in a different name then the source, but then - when you create it you must add this in the "WITH" clause:
    WITH
    (
      DATA_SOURCE = RemoteReferenceData,
    SCHEMA_NAME = N'dbo',
    OBJECT_NAME = N'Customers226',
     
    ); 
in DB1 you can check these DMV's:
 
select * from sys.external_data_sources
select * from sys.external_tables
 
have a lovely year.