Mar 23, 2018 Approximately, after 30 hours, Azure SQL automatic tuning generated a recommendation to create an index. For this waiting time, Microsoft notes that “Azure SQL Database needs to monitor activities at least for a day in order to identify some recommendations”. This tuning recommendation index is the same as the missing index.
Automatic tuning is a database feature that provides insight into potential query performance problems, recommend solutions, and automatically fix identified problems.
Automatic tuning in SQL Server 2017 (14.x) notifies you whenever a potential performance issue is detected, and lets you apply corrective actions,or lets the Database Engine automatically fix performance problems.Automatic tuning in SQL Server 2017 (14.x) enables you to identify and fix performance issues caused by query execution plan choice regressions. Automatic tuning in Azure SQL Database also creates necessary indexes and drops unused indexes. For more information on query execution plans, see Execution Plans.
The SQL Server Database Engine monitors the queries that are executed on the database and automatically improves performance of the workload. The Database Engine has a built-in intelligence mechanism that can automatically tune and improve performance of your queries by dynamically adapting the database to your workload. There are two automatic tuning features that are available:
Three of the main tasks in classic database administration are monitoring the workload, identifying critical Transact-SQL queries, indexes that should be added to improve performance, and identifying rarely used. The SQL Server Database Engine provides detailed insight into the queries and indexes that you need to monitor. However, constantly monitoring a database is a hard and tedious task, especially when dealing with many databases. Managing a huge number of databases might be impossible to do efficiently. Instead of monitoring and tuning your database manually, you might consider delegating some of the monitoring and tuning actions to the Database Engine using automatic tuning feature.
Automatic tuning is a continuous monitoring and analysis process that constantly learns about the characteristics of your workload and identify potential issues and improvements.
This process enables database to dynamically adapt to your workload by finding what indexes and plans might improve performance of your workloads and what indexes affect your workloads. Based on these findings, automatic tuning applies tuning actions that improve performance of your workload. In addition, database continuously monitors performance after any change made by automatic tuning to ensure that it improves performance of your workload. Any action that didn't improve performance is automatically reverted. This verification process is a key feature that ensures that any change made by automatic tuning does not decrease the performance of your workload.
Automatic plan correction is an automatic tuning feature that identifies execution plans choice regression and automatically fix the issue by forcing the last known good plan. For more information about query execution plans and the query optimizer, see the Query Processing Architecture Guide.
The SQL Server Database Engine may use different execution plans to execute the Transact-SQL queries. Query plansdepend on the statistics, indexes, and other factors. The optimal plan that should be used to execute some Transact-SQL query might be changedover time. In some cases, the new plan might not be better than the previous one, and the new plan might cause a performance regression.
Whenever you notice the plan choice regression, you should find some previous good plan and force it instead of the current one using
sp_query_store_force_plan procedure.Database Engine in SQL Server 2017 (14.x) provides information about regressed plans and recommended corrective actions.Additionally, Database Engine enables you to fully automate this process and let Database Engine fix any problem found relatedto the plan changes.
Database Engine can automatically switch to the last known good plan whenever the plan choice regression is detected.
Database Engine automatically detects any potential plan choice regression including the plan that should be used instead of the wrong plan.When the Database Engine applies the last known good plan, it automatically monitors the performance of the forced plan. If the forced plan is not betterthan the regressed plan, the new plan will be unforced and the Database Engine will compile a new plan. If the Database Engine verifies that the forced plan is better than the regressed plan, the forced plan will be retained if it is better than the regressed plan, until a recompile occurs (for example, on next statistics update or schema change).
Any execution plans auto forced are not persisted between restarts of the SQL Server instance.
You can enable automatic tuning per database and specify that last good plan should be forced whenever some plan change regression is detected. Automatic tuning is enabled usingthe following command:
Once you enable this option, the Database Engine will automatically force any recommendation where the estimated CPU gain is higher than 10 seconds, or the number of errors in the new plan is higher than the number of errors in the recommended plan, and verify that the forced plan is better than the current one.
Without automatic tuning, users must periodically monitor system and look for the queries that regressed. If any plan regressed, user should find some previous good plan and force it instead of the current one using
sp_query_store_force_plan procedure. The best practice would be to force the last known good plan because older plans might be invalid due to statistic or index changes. The user who forces the last known good plan should monitor performance of the query that is executed using the forced plan and verify that forced plan works as expected. Depending on the results of monitoring and analysis, plan should be forced or user should find some other way to optimize the query.Manually forced plans should not be forced forever, because the Database Engine should be able to apply optimal plans. The user or DBA should eventuallyunforce the plan using
sp_query_store_unforce_plan procedure, and let the Database Engine find the optimal plan.
Alternatively, use the Queries With Forced Plans Query Store view to locate and unforce plans.
SQL Server provides all necessary views and procedures required to monitor performance and fix problems in Query Store.
In SQL Server 2016 (13.x), you can find plan choice regressions using Query Store system views. In SQL Server 2017 (14.x), the Database Engine detects and shows potential plan choice regressions and the recommended actions that should be applied in the sys.dm_db_tuning_recommendations (Transact-SQL)view. The view shows information about the problem, the importance of the issue, and details such as the identified query, the ID of the regressed plan, the ID of the plan that was used as baseline for comparison, and the Transact-SQL statement that can be executed to fix the problem.
|CPU time changed from 4 ms to 14 ms||3/17/2017||83|
|CPU time changed from 37 ms to 84 ms||3/16/2017||26|
Some columns from this view are described in the following list:
Use the following query to obtain a script that fixes the issue and additional information about the estimated gain:
Here is the result set.
|reason||score||script||query_id||current plan_id||recommended plan_id||estimated_gain||error_prone|
|CPU time changed from 3 ms to 46 ms||36||EXEC sp_query_store_force_plan 12, 17;||12||28||17||11.59||0|
estimated_gain represents the estimated number of seconds that would be saved if the recommended plan would be executed instead of the current plan. The recommended plan should be forced instead of the current plan if the gain is greater than 10 seconds. If there are more errors (for example, time-outs or aborted executions) in the current plan than in the recommended plan, the column
error_prone would be set to the value
YES. Error prone plan is another reason why the recommended plan should be forced instead of the current one.
Although Database Engine provides all information required to identify plan choice regressions; continuousmonitoring and fixing performance issues might be a tedious process. Automatic tuning makes this process much easier.
Data in the sys.dm_db_tuning_recommendations DMV is not persisted between restarts of the SQL Server instance.
In Azure SQL Database, index management is easy because Azure SQL Database learns about your workload and ensures that your data is always optimally indexed. Proper index design is crucial for optimal performance of your workload, and automatic index management can help you optimize your indexes. Automatic index management can either fix performance issues in incorrectly indexed databases, or maintain and improve indexes on the existing database schema. Automatic tuning in Azure SQL Database performs the following actions:
Indexes speed up some of your queries that read data from the tables; however, they can slow down the queries that update data. You need to carefully analyze when to create an index and what columns you need to include in the index. Some indexes might not be needed after some time. Therefore, you would need to periodically identify and drop the indexes that do not bring any benefits. If you ignore the unused indexes, performance of the queries that update data would be decreased without any benefit on the queries that read data. Unused indexes also affect overall performance of the system because additional updates require unnecessary logging.
Finding the optimal set of indexes that improve performance of the queries that read data from your tables and have minimal impact on updates might require continuous and complex analysis.
Azure SQL Database uses built-in intelligence and advanced rules that analyze your queries, identify indexes that would be optimal for your current workloads, and the indexes might be removed. Azure SQL Database ensures that you have a minimal necessary set of indexes that optimize the queries that read data, with the minimized impact on the other queries.
In addition to detection, Azure SQL Database can automatically apply identified recommendations. If you find that the built-in rules improve the performance of your database, you might let Azure SQL Database automatically manage your indexes.
To enable automatic tuning in Azure SQL Database and allow the automatic tuning feature to fully manage your workload, see Enable automatic tuning in Azure SQL Database using Azure portal.
When the Azure SQL Database applies a CREATE INDEX or DROP INDEX recommendation, it automatically monitors the performance of the queries that are affected by the index. New index will be retained only if performances of the affected queries are improved. Dropped index will be automatically re-created if there are some queries that run slower due to the absence of the index.
Actions required to create necessary indexes in Azure SQL Database might consume resources and temporally affect workload performance. To minimize the impact of index creation on workload performance, Azure SQL Database finds the appropriate time window for any index management operation. Tuning action is postponed if the database needs resources to execute your workload, and started when the database has enough unused resources that can be used for the maintenance task. One important feature in automatic index management is a verification of the actions. When Azure SQL Database creates or drops index, a monitoring process analyzes performance of your workload to verify that the action improved the performance. If it didn't bring significant improvement - the action is immediately reverted. This way, Azure SQL Database ensures that automatic actions do not negatively impact performance of your workload. Indexes created by automatic tuning are transparent for the maintenance operation on the underlying schema. Schema changes such as dropping or renaming columns are not blocked by the presence of automatically created indexes. Indexes that are automatically created by Azure SQL Database are immediately dropped when related table or columns is dropped.
Without automatic index management, user would need to manually query sys.dm_db_missing_index_details (Transact-SQL) view or use the Performance Dashboard report in Management Studio to find indexes that might improve performance, create indexes using the details provided in this view, and manually monitor performance of the query. In order to find the indexes that should be dropped, users should monitor operational usage statistics of the indexes to find rarely used indexes.
Azure SQL Database simplifies this process. Azure SQL Database analyzes your workload, identifies the queries that could be executed faster with a new index, and identifies unused or duplicated indexes. Find more information about identification of indexes that should be changed at Find index recommendations in Azure portal.
ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL)
Monitor and Tune for Performance
Performance Monitoring and Tuning Tools
Monitoring Performance By Using the Query Store
Query Tuning Assistant
Azure SQL Database has a built-in intelligence mechanism that can automatically tune and improve performance of your queries by dynamically adapting the database schema to your workload. In Azure SQL Database, you don’t need to worry about the index analysis and design, because Azure SQL Database learns about your workload and ensures that your data is always optimally indexed.
Why do you need index management?Download cooking games myplaycity.
Indexes speed up some of your queries that read data from the tables; however, they might slowdown the queries that update data. You need to carefully analyze when to create a new index and what columns you need to include in the index. Some indexes might not be needed after some time; therefore, you would need to periodically identify them and drop them if they bring no benefits. If you ignore the unused indexes, performance of the queries that update data would be decreased without any benefit on the queries that read data. Unused indexes also affect overall performance of the system because additional updates requires unnecessary logging and increases WRITELOG wait statistics.
Finding the optimal set of indexes that will improve performance of the queries that read data from your tables that at the same time minimally impact updates, might require continuous and very complex analysis.
Some database systems try to solve index management problem by introducing advanced indexes that automatically include as much as possible fields in the index. In these cases, you don’t need to think about the indexes that should be added on your data, because one general-purpose index can be used in a variety of queries that read data. However, these indexes still affect update performance, so they are good solution for unpredictable read-only workloads.
Azure SQL Database supports a variety of workload types, so it cannot assume that one index might solve all performance problems. Also, it will not enforce users to do all hard and tedious index management analysis.
Azure SQL Database uses built-in intelligence and advanced rules that analyze your queries, identify what kind of indexes would be optimal for your current workloads, and what indexes might be removed. This way, Azure SQL Database ensures that you have a minimal necessary set of indexes that optimize most of your queries that read data, with the minimized impact on the queries that updates.
These are the best practices based on the experience of the thousands database experts who manage their own database last 20 years. The best practices are built-in directly into the Azure SQL Database engine and available to all Azure SQL Database users.
How to identify indexes that need to be changed in your database?
Azure SQL Database makes index management process easy. Instead of the tedious process of manual workload analysis and index monitoring, Azure SQL Database analyzes your workload, identifies the queries that could be executed faster if you create an index, identifies indexes that are not used in a longer period of time, and identifies duplicated indexes in the database.
On the Azure portal, you can find a set of recommendations that you might apply to optimize performance of your database by creating missing indexes or dropping duplicate indexes.
In this report, you might see the actions that you might execute, information about the index that you should create, or name of the index that you might drop. All recommendations have associated impact that indicates the gain that you can get if you apply this recommendation
Automatic index management
If you find that the built-in rules improve the performance of your database – you might let Azure SQL database automatically manage your indexes, decide when to create necessary indexes and remove unused indexes.
You can go to Azure portal, and enable Azure SQL Database to automatically create or drop indexes:
You can let Azure SQL Database to both create necessary indexes and remove unnecessary indexes, or choose which of these options should automatically done and what you want to do manually. You can always change your decision and turn on/off some of these automatic tuning options.
One important feature in Automatic index management is continuous verification of the actions. When Azure SQL Database executes create index or drop index action, a continuous monitoring process analyzes performance of your workload, and analyzes did the action improve the performance. If the assumption was not correct or if it didn’t bring significant improvement – the action will be immediately reverted. This way, Azure SQL Database ensures that automatic actions will not affect performance of your workload.
Azure SQL Database has intelligent automatic tuning mechanism that takes care of your indexes. If you cannot identify and monitor your indexes, you can let the Azure SQL database do index management for you, tune your database, and ensure that your data structures dynamically adapts to your workload.
Find more information about automatic index management on Azure Documentation.