- Activity MonitorThis tool can be opened with Management Studio and it gives detail view of current activities. It includes five sections: Overview, Processes, Resource Waits, Data File I/O, Recent Expensive Queries.
https://msdn.microsoft.com/en-us/library/hh212951.aspx
http://www.kodyaz.com/sql-server-tools/sql-server-activity-monitor-tool.aspx. - Dynamic Management View and FunctionsThese views and functions return state information that can be used to monitor the health of the instance, diagnose problems and tune performance. There are two type of views and functions: Server-scoped and Database-scoped. These are one of the best tools for monitoring, specifically on ad-hoc monitoring.
https://msdn.microsoft.com/en-us/library/ms188754.aspx
http://download.red-gate.com/ebooks/SQL/eBook_Performance_Tuning_Davidson_Ford.pdf - Performance MonitorThis Windows administrative tool allows to track resource usage on Microsoft Operating System and can be used to monitor information specific to SQL Server. This is used as a monitoring tool for identifying trends over a period of time and as a ad-hoc monitoring for identifying resource bottleneck responsible for performance issue.
http://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/
https://www.youtube.com/watch?v=nAtlan1qgso. - SQL Server ProfilerThis graphical tool allows to capture a trace of all events occurred in SQL Server. This is heavily used for seeing current T-SQL activities and captured info can be saved for further analysis. This tool also offers the captured events to be replayed.** This tool has been deprecated in SQL Server 2012, instead use Extended events for capturing and Distributed replay for replaying events.
https://msdn.microsoft.com/en-us/library/ms181091.aspx
http://www.codeproject.com/Articles/21371/SQL-Server-Profiler-Step-by-Step. - SQL TraceThis is T-SQL way that provides same SQL Server Profiler tracing facility. Since it does not provide GUI, it is bit difficult to set it up but it is not as heavy as Profiler and leverages T-SQL features.
https://technet.microsoft.com/en-us/library/ms191006(v=sql.105).aspx
http://blogs.msdn.com/b/sqlsecurity/archive/2008/12/12/how-to-create-a-sql-trace-without-using-sql-profiler.aspx. - Database Engine Tuning AdvisorThis tool facilitates getting queries or workload analyzed and getting recommendations on indexes and statistics. This is a useful tool for determining the best index for queries and identifying less-efficient indexes added.
- Distributed Replay
This is an advanced tool that support replaying captured workload across distributed set of servers. This is useful for accessing the impact of SQL Sever upgrades, hardware upgrades and operating system upgrades.
https://msdn.microsoft.com/en-us/library/ff878183.aspx
http://blogs.msdn.com/b/mspfe/archive/2012/11/08/using-distributed-replay-to-load-test-your-sql-server-part-1.aspx
https://msdn.microsoft.com/en-us/library/ee210548.aspx
. - SQL Server Extended Events
This is a highly scalable and configurable architecture that offers a lightweight system with an UI for collecting information to troubleshoot SQL Server.
https://technet.microsoft.com/en-us/library/bb630354(v=sql.105).aspx
https://www.simple-talk.com/sql/database-administration/getting-started-with-extended-events-in-sql-server-2012/
. - SQL Server Data Collection
This is an automated system for collecting and storing and reporting performance data for multiple SQL Server instances.
https://msdn.microsoft.com/en-us/library/bb677179.aspx
http://blog.sqlauthority.com/2010/04/13/sql-server-configure-management-data-collection-in-quick-steps-t-sql-tuesday-005/
. - SQL Server Utility Control Point
This is a centralized management portal for monitoring multiple instances of SQL Server based on specific collection sets.
https://technet.microsoft.com/en-us/library/ee210548(v=sql.120).aspx
http://sqlmag.com/sql-server-2008/introducing-sql-server-utility.
. - Microsoft System Center Operations Manager
This is an enterprise level infrastructure management solution that uses management packs to collect performance and health info from windows and application services such as SQL Server. SQL Server has a management pack that enables to create exception-driven events for resolving specific issues.
http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/DCIM-B419#fbid=
http://www.microsoft.com/en-us/download/details.aspx?id=10631
Monday, February 23, 2015
Tools for carrying out performance monitoring and tuning of SQL Server
Friday, February 20, 2015
Does my table hold invalid data after importing data? Constraints have been violated?
-- Create a table with a check constraint
USE tempdb;
GO
CREATE TABLE dbo.Customer
(
CustomerId int not null
, CustomerName varchar(10) not null
, CreditAmount decimal(18,2) not null
, CONSTRAINT Customer_SalaryCheck CHECK (CreditAmount < 100000)
);
GO
-- Inserting valid data
INSERT INTO dbo.Customer
VALUES (1, 'Joe Brown', 65000);
INSERT INTO dbo.Customer
VALUES (2, 'Mary Smith', 75000);
-- Inserting invalid data
-- This will not be possible as it violates the constraint
INSERT INTO dbo.Customer
VALUES (3, 'Joe Brown', 110000);
-- Disabling the constraint and inserting the same again
-- Now it allows to insert a row with an invalid value
ALTER TABLE dbo.Customer NOCHECK CONSTRAINT Customer_SalaryCheck;
GO
INSERT INTO dbo.Customer
VALUES (3, 'Joe Brown', 110000);
GO
-- Enabling the constraint.
-- Note that updated records are not validated
ALTER TABLE dbo.Customer CHECK CONSTRAINT Customer_SalaryCheck;
GO
-- Now table contains invalid data.
-- Checking with sys.check_constraints catalog view.
SELECT name, is_not_trusted FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID('dbo.Customer');
-- This shows the value of is_not_trusted as 1
-- indicating that table might contain invalid data
-- Query the table and see. This shows 3 records including the invalid row.
SELECT * FROM dbo.Customer;
GO
-- If you want to make sure no invalid data exist
-- and validate all records agains the constraint
-- disable it again and enable it with CHECK option
ALTER TABLE dbo.Customer NOCHECK CONSTRAINT Customer_SalaryCheck;
GO
ALTER TABLE dbo.Customer WITH CHECK CHECK CONSTRAINT Customer_SalaryCheck;
GO
-- This will throw and error because current rowset has an invalid value.
-- This can be corrected by either updating it or deleting it.
DELETE FROM dbo.Customer WHERE CustomerId = 3;
-- Now constraint can be enabled with CHECK option
ALTER TABLE dbo.Customer WITH CHECK CHECK CONSTRAINT Customer_SalaryCheck;
GO
-- And if you run sys.check_constraint again, you will see 0 for is_not_trusted column.
Wednesday, February 18, 2015
SSAS: How to find User-Defined Member Properties of a dimension?
-- from MSDN
SELECT
CROSSJOIN([Ship Date].[Calendar].[Calendar Year].Members,
[Measures].[Sales Amount]) ON COLUMNS,
NON EMPTY Product.Product.MEMBERS
DIMENSION PROPERTIES
Product.Product.[List Price],
Product.Product.[Dealer Price] ON ROWS
FROM [Adventure Works]
WHERE ([Date].[Month of Year].[January])
However, if you do not know all user-defined properties added and need to get a list, you can simply use Analysis Services Schema Rowsets for querying out information such as objects, state, sessions, connections, etc. There are many schema rowset under OLEDB for OLAP Schema Rowsets and the one we have to use is MDSCHEMA_PROPERTIES. Here is the query for getting all user-defined properties of a level in a dimension.
SELECT * FROM $SYSTEM.MDSCHEMA_PROPERTIES WHERE [DIMENSION_UNIQUE_NAME] = '[Dim Customer]' AND [HIERARCHY_UNIQUE_NAME] = '[Dim Customer].[Customer]' AND [LEVEL_UNIQUE_NAME] = '[Dim Customer].[Customer].[Customer]' AND [PROPERTY_TYPE] = 1;
Read more on Analysis Services Schema Rowsets: https://msdn.microsoft.com/en-us/library/ms126233.aspx
Read more on OLE DB for OLAP Schema Rowsets: https://msdn.microsoft.com/en-us/library/ms126079.aspx
Tuesday, February 10, 2015
Reading the content of the databse while restoring backup-sets: Restore with STANDBY
-- Creating a database for testing
USE master;
GO
IF EXISTS (SELECT * FROM sys.databases WHERE name = 'TestDatabase')
DROP DATABASE TestDatabase;
GO
CREATE DATABASE TestDatabase
ON PRIMARY
(
NAME = N'TestDatabase_Data'
, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\TestDatabase_Data.mdf'
, SIZE = 10240KB, FILEGROWTH = 1024KB
)
LOG ON
(
NAME = N'TestDatabase_Log'
, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\TestDatabase_Log.ldf'
, SIZE = 5120KB, FILEGROWTH = 10%
);
GO
-- Changing the recovery model to full
ALTER DATABASE TestDatabase SET RECOVERY FULL;
GO
-- Take the initial backup
BACKUP DATABASE TestDatabase
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\TestDatabase.bak'
WITH INIT;
GO
-- create a table for testing purposes
USE TestDatabase;
GO
CREATE TABLE dbo.TestTable
(
Id int identity(1,1) PRIMARY KEY
, StringColumn nvarchar(600)
, IntColumn bigint
);
GO
-- Insert the first record
INSERT INTO dbo.TestTable
(StringColumn, IntColumn)
VALUES ('This is the first data', 12345);
-- Check records. You should see one record
SELECT * FROM dbo.TestTable
-- Perform first transaction log backup
-- This backup contains our first record inserted
BACKUP LOG TestDatabase
TO DISK =
'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\TestDatabase_log.trn'
WITH INIT;
GO
-- Insert the second record
INSERT INTO dbo.TestTable
(StringColumn, IntColumn)
VALUES ('This is the second data', 12345);
-- Check records. You should see two records now
SELECT * FROM dbo.TestTable
-- Perform the second transaction log backup
-- This backup contains first and second records inserted
BACKUP LOG TestDatabase
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\TestDatabase_log.trn'
WITH NOINIT;
GO
-- Insert the third record
INSERT INTO dbo.TestTable
(StringColumn, IntColumn)
VALUES ('This is the third data', 12345);
-- Check records. You should see three records now
SELECT * FROM dbo.TestTable
-- Perform the third transaction log backup
-- This backup contains first, second and third records inserted
BACKUP LOG TestDatabase
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\TestDatabase_log.trn'
WITH NOINIT;
GO
-- Restoring the full backup USE master; GO RESTORE DATABASE TestDatabase FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\TestDatabase.bak' WITH REPLACE, NORECOVERY; GO -- Check the state of the database -- This will show as "Restoring" SELECT name, state_desc FROM sys.databases WHERE name = 'TestDatabase'; GO -- Restore first log with STANDBY instead NORECOVERY RESTORE DATABASE TestDatabase FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\TestDatabase_log.trn' WITH FILE =1, STANDBY = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\ROLLBACK_UNDO_TestDatabase_.bak'; GO -- Read the state of the database -- Now you will see that it is "online". -- But remember, now the database is read-only. -- Have a look on it with Object Explorer, you will the state. SELECT name, state_desc FROM sys.databases WHERE name = 'TestDatabase'; GO -- Read the table USE TestDatabase; GO SELECT * FROM dbo.TestTable; -- We see the first record, but we need the second record. -- Now let's try with our second log backup. USE master; GO RESTORE LOG TestDatabase FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\TestDatabase_log.trn' WITH FILE =2, STANDBY = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\ROLLBACK_UNDO_TestDatabase_.bak'; GO -- Again, let read the table USE TestDatabase; GO SELECT * FROM dbo.TestTable; -- As you see, we have the required record. -- No need to continue the restore operation. -- Let's complete the restore process USE master; GO RESTORE DATABASE TestDatabase WITH RECOVERY; -- Done.
Tuesday, January 27, 2015
How to find the protocol used by the connetion
Details of the connection established can be obtained from sys.dm_exec_connections dynamic management view. Here is the result of it with for a connection established to local instance.
SELECT CONVERT(nvarchar(128), SERVERPROPERTY('SERVERNAME')) ServerConnected, *
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
Since all protocols are enabled and connection made to a local instance, as you see, Connection uses Shared Memory as the protocol. Here is the result when only Named Pipes is enabled.
With TCP/IP enabled;
Tuesday, January 20, 2015
Log is getting automatically truncated with FULL Recovery Model
-- 1. -- Creating a database with SIMPLE recovery model USE master; GO IF EXISTS (SELECT * FROM sys.databases WHERE name = 'Database_SimpleRecovery') DROP DATABASE Database_SimpleRecovery GO CREATE DATABASE [Database_SimpleRecovery] CONTAINMENT = NONE ON PRIMARY ( NAME = N'Database_SimpleRecovery', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\Database_SimpleRecovery.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'Database_SimpleRecovery_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\Database_SimpleRecovery_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) GO ALTER DATABASE [Database_SimpleRecovery] SET RECOVERY SIMPLE GO -- 2. -- Creating a database with FULL recovery model USE master; GO IF EXISTS (SELECT * FROM sys.databases WHERE name = 'Database_FullRecovery') DROP DATABASE Database_FullRecovery GO CREATE DATABASE [Database_FullRecovery] CONTAINMENT = NONE ON PRIMARY ( NAME = N'Database_FullRecovery', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\Database_FullRecovery.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'Database_FullRecovery_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\Database_FullRecovery_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) GO ALTER DATABASE Database_FullRecovery SET RECOVERY FULL GO
Let's add some records to these two databases and check the space used by log files.
-- Adding some transactions to Database_SimpleRecovery USE Database_SimpleRecovery; GO SELECT * INTO dbo.TestTable FROM AdventureWorksDW2014.dbo.FactInternetSales2; -- Checking for freespace in the log SELECT DB_NAME() AS DatabaseName, name AS FileName, size/128.0 AS CurrentSizeMB, size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS FreeSpaceMB FROM sys.database_files; -- Adding some transactions to Database_FullRecovery USE Database_FullRecovery; GO SELECT * INTO dbo.TestTable FROM AdventureWorksDW2014.dbo.FactInternetSales2; -- Checking for freespace in the log SELECT DB_NAME() AS DatabaseName, name AS FileName, size/128.0 AS CurrentSizeMB, size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS FreeSpaceMB FROM sys.database_files;
- Full database backup has never been taken.
- Full or differential backup has never been taken after switching from SIMPLE to FULL recovery model.
-- Connecting with Database_FullRecovery USE Database_FullRecovery; GO -- Dropping table DROP TABLE dbo.TestTable; GO -- Taking full backup BACKUP DATABASE Database_FullRecovery TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Backup\Database_FullRecovery.bak'; GO -- Loading data again SELECT * INTO dbo.TestTable FROM AdventureWorksDW2014.dbo.FactInternetSales2; -- Checking for freespace in the log SELECT DB_NAME() AS DatabaseName, name AS FileName, size/128.0 AS CurrentSizeMB, size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS FreeSpaceMB FROM sys.database_files;
SELECT * FROM sys.database_recovery_status WHERE database_id = DB_ID();
Saturday, January 3, 2015
Non Reversible Encryption with SQL Server: HASHBYTES function
-- Creating table
IF OBJECT_ID('dbo.UserCredential', 'U') IS NOT NULL
DROP TABLE dbo.UserCredential
GO
CREATE TABLE dbo.UserCredential
(
UserId int identity(1,1) PRIMARY KEY
, UserName varchar(20) NOT NULL
, Password binary(64) NOT NULL
)
GO
-- Inserting records
INSERT INTO dbo.UserCredential
(UserName, Password)
VALUES
('Dinesh', HASHBYTES('SHA2_512', 'Pa$$w0rd'))
, ('Yeshan', HASHBYTES('SHA2_512', 'P@$$w0rD'))
-- Checking records inserted
SELECT * FROM dbo.UserCredential;
Since the cipher text cannot be reverted back with HASHBYTES, here is the way of doing the comparison.
-- Validating user
IF EXISTS (SELECT * FROM dbo.UserCredential
WHERE UserName = 'Yeshan'
AND Password = HASHBYTES('SHA2_512', 'P@$$w0rD'))
Print 'User authenticated'
ELSE
Print 'Invalid user!'
Thursday, January 1, 2015
CONVERT returns '*' - [Happy New Year]
DECLARE @Integer int = 123; SELECT 'My Integer is ' + CONVERT(char(2), @Integer); GO
Analyze the code above, as you see, CONVERT function returns '*' instead of '12'. This could happen with conversion because when converting from one type to another, data may be truncated, might be appeared as cut-off, or an error could be thrown because the new type is not fit enough to display the result. The conversion in the above code tries to convert 123 into char(2) which is too small to hold the value, hence displays '*'.
However, this behavior depends on the types involved. If you are converting varchar(3) to char(2), do not expect '*' but a cut-off value.
And all SQL lovers and my followers;
Sunday, October 12, 2014
Automated notifications on SQL Server errors
Once the alert is created, an action has to be added for responding to the event. There are two types of actions that can be configured; Execute a Job, Notify Operators. Since the post is speaking about notifications, let's see how to configure the action for notifying a person.
As you see, "Database Administrator" operator has been configured with "Email name" notification option. Note that, in order to send emails by SQL Server, Database Mail has to be configured. Let's go back to the Alert and configure the "Response".
We need to do one more configuration for receiving alerts. You need to enable "Enable mail profile" of "Alert System" that comes under SQL Server Agent properties.
All okay now. Let's test and see whether administrator gets the error via an email. Below code creates a database with 4mb size data file and disables "File Growth" of it. Next it inserts bunch of records until the data file gets fully filled. Once the data file is full, SQL Server throws an error with 1105.
-- Create new DB called 'AlertTestDB"
USE master;
GO
CREATE DATABASE [AlertTestDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'AlertTestDB'
, FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\AlertTestDB.mdf'
, SIZE = 4096KB
, MAXSIZE = UNLIMITED
, FILEGROWTH = 0)
LOG ON
( NAME = N'AlertTestDB_log'
, FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\AlertTestDB_log.ldf'
, SIZE = 1024KB
, MAXSIZE = 2048GB
, FILEGROWTH = 10%)
GO
-- Connnect and create a table
USE AlertTestDB;
GO
CREATE TABLE TestTable
(
Id int identity(1,1) PRIMARY KEY
, Column1 char(2000)
);
GO
-- Insert record until Sever throws an error
SET NOCOUNT ON;
WHILE 1=1
BEGIN
INSERT INTO TestTable (Column1) VALUES ('test data');
END;
GO
and administrator automatically receives an email like this.
Monday, October 6, 2014
MDX: Get last 24 hours periods
Surrogate Key and Granularity
Surrogate key is very common with data warehouse dimension tables (See why we need surrogate keys). However, specifically for Date dimension table, rather than the general integer value with no semantic meaning, it is always better to have a numeric which is concatenation of each date part. For example, the key of 7th of July, 2006 is 20060707. Time dimension can use general integer values for keys as other usual dimensions with one exception which is the starting value. Make sure that the starting value of the key is 0 for time 00:00:00. Here are sample data for both tables;
Last 24-hours periods
One of the common reporting requirements related to date and time is, getting values for last 24 hours period. Although there are many ways of getting the required result, having the above structure for both Date and Time Dimensions definitely offers most easiest ways. Here is one way;
As you see, the slicer is formed with two tuples and each has two coordinates. First tuple represents today’s date for time periods starting with 00:00:00 to 09:34:45. The second tuple represents yesterday with time periods starting with 09:34:46 to 23:59:59. See the result;
Now all we have to do is, build the slicer dynamically. Here is the way. Note that I have used Now function for getting current date and time, Cstr function for converting string values to numeric and StrToMember for converting a string to MDX member.
SELECT {[Measures].[Sales Amount] } ON 0
, NON EMPTY {([Order Date].[Year - Quarter - Month - Date].[Date], [Time].[Time].[Time]) } ON 1
FROM
(SELECT {(StrToMember( "[Order Date].[Date].&[" + Format(Now(), 'yyyyMMdd') + "]")
, [Time].[Time].&[0]:StrToMember( "[Time].[Time].&["
+ Cstr((Format(Now(), 'HH') * 60 * 60 ) + (Format(Now(), 'mm') * 60 ) + (Format(Now(), 'ss') ))
+ "]"))
, (StrToMember( "[Order Date].[Date].&[" + Format(Now() -1, 'yyyyMMdd') + "]")
,StrToMember( "[Time].[Time].&["
+ Cstr((Format(Now(), 'HH') * 60 * 60 ) + (Format(Now(), 'mm') * 60 ) + (Format(Now(), 'ss') ) + 1)
+ "]"):[Time].[Time].&[86399])} ON 0
FROM [Sales]);
Monday, September 1, 2014
Cumulative Update 1 for SQL Server 2012 SP2
Microsoft has released Cumulative Update 1 for SQL Server 2012 Service Pack 2 and it is available for downloading.
Here is the link for downloading: http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2976982&kbln=en-us
Here is the link for the list of bugs fixed:http://support.microsoft.com/kb/2976982
Read this for understanding versions and service packs released for all SQL Server versions:http://dinesql.blogspot.com/2014/01/versions-and-service-packs-of-sql.html
SQL Server 2014 Sample Databases and applications
Are you looking for SQL Server 2014 AdventureWorks databases and applications? It is now available and here is the link:
Tuesday, June 24, 2014
What if SQL Server Service is paused?
If you have gone through Windows services, specifically SQL Server services, either through SQL Server Configurations manager or Windows Services, you might have noticed that some services can be paused in addition to stopped or restarted. What if the service is paused?
If you pause the SQL Server service, there will not be any issue for existing connection but new connections will not be allowed. Users who have been working with databases can continue until they disconnect the connection. This is generally useful when you need to shutdown the service without disturbing existing users’ activities. Since this does not allow new connection, no user can establish a new connection and once all existing connections are disconnected, server can be safely shutdown.
Here is an example;
User makes a connection and runs a query:
Monday, June 23, 2014
Service Pack 2 is available for SQL Server 2012
Microsoft has released SQL Server 2012 Service Pack 2 and it is available for downloading.
Here is the link for downloading: http://www.microsoft.com/en-us/download/details.aspx?id=43340
Here is the link for the list of bugs fixed: http://support.microsoft.com/KB/2958429
Read this for understanding versions and service packs released for all SQL Server versions: http://dinesql.blogspot.com/2014/01/versions-and-service-packs-of-sql.html
Tuesday, June 17, 2014
What are the advantages of a SQL Server database with multiple files located on one physical drive ?
This is a common question I always get from my classes/workshops. Do we really get some benefits out of a database with multiple data files on one physical drive? Obviously, no performance benefits, but in certain situation, it gives you some benefits;
- Taking partial backups, file backups, file group backups
Although the files have not been distributed on multiple physical drives, still partial backups, files backups and file-groups backups are possible. Assume that your database is very large and some tables are infrequently updated, then you can separate tables into two file groups, using multiple data files, one group for tables that are frequently updated and other for tables that are infrequently updated (or read-only tables). This allows you to have a time-saving and efficient backup strategy, setting different backup plans on two file groups. - Restoration into smaller multiple physical drives
Assume that you maintain a database with single 100GB size data file. What if the exiting drive crashes and you get two 50GB physical drives for restoring the database from one of the backups? As you know, it is not possible, but, if the database is maintained with multiple data files even with a single physical drive, scenario like this can be easily addressed. - Moving files into another drive
For various reasons, either the entire database or part of the database is required to be moved to a different physical drives. Some of the reasons could be, moving from test environment to production environment, moving some file-groups to optimized physical drives, moving entire database to a different location. If the database is constructed with multiple files, moving files for above scenario can be easily done with less effort.
MDX: Getting name of the user connected
Are you looking for a way of adding the name of the account used for the session to the resultset? Here is the way of adding it;
Thursday, June 12, 2014
What is “sysname” data type used for object names?
You might have noticed that the data type of object names such as database name is “sysname” which is not listed in data type list when creating a table via table designer. This data type can be clearly seen when creating objects using templates (CREATE DATABASE template). What is this sysname data type? Can we use it? Should we use it?
Sysname is a built-in system data type defined as nvarchar(128). Initially, with older versions (up to 6.5 if I am not mistaken, TBV) it was equivalent to varchar(30). It is a non-nullable data type and mainly used to store object names. This data type is not listed in data-type list which comes when creating tables via table designer. However, it can be used for defining columns for tables when they are created using T-SQL. Have a look on following code;
-- using sysname for variables
DECLARE @TestVariable sysname = 'Test Value'
SELECT @TestVariable
GO
-- using sysname for creating tables
CREATE TABLE dbo.TestTable
(
Id int PRIMARY KEY
, Name sysname
)
GO
If your system is configured with case-sensitive collation, make sure you type the word in lowercase.
As you see, it can be used with our codes. However, many recommend not to use because of; 1. nvarchar(128) can be simply used instead, 2. there can be a change in future version. Therefore, even though it is possible to use sysname data type with T-SQL, it is better not to use.
Connecting with Windows Azure SQL Server database via Power Pivot
While trying to get some records from a database configured in a Windows Azure machine (NOT SQL AZURE), I noticed that the connection can be made using Power Query but Power Pivot. Power Query has an option for connecting with Windows Azure Database using “From Windows Azure SQL Database” as shown in below images;
However, there is no such option with Power Pivot. If you try to connect using “From SQL Server”, you will get an error as below;
“Unable to retrieve list of databases. Reason: Failed to connect to the server. Reason: Login timeout expired
A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
Named Pipes Provider: Could not open a connection to SQL Server [53]. ”
The error indicates that Excel tries to establish the connecting using Named Pipes protocol which is not valid with this context. Though it can be considered as the reason for this error, there is no option for changing the protocol as TCP/IP. This makes establishing the connection impossible. However, found a workaround for connecting with Windows Azure SQL Database, not using the default Provider which is “SQL Server Native Client 11.0” but using “Microsoft OLEDB Provider for SQL Server”. All we have to do is, open the Advanced window clicking “Advanced” button and change the Provider as Microsoft OLEDB Provider for SQL Server.
I still cannot figure out the exact reason for this and how to connect using SQL Server Native Client. If you have done it, please share.
Related post: http://dinesql.blogspot.com/2014/06/connecting-with-sql-server-virtual.html
Tuesday, June 10, 2014
SQL Server Installation: Are Shared components getting upgraded with Side-by-side Upgrade?
As you know, some of the components such as Management Studio (SSMS) and Configuration Manager are shared components of SQL Server instances and they are upgraded when an in-place upgrade is performed. However, they are not supposed to get upgraded with Side-by-side upgrade unless a certain criteria is met.
In-place and Side-by-side upgrades
In-place upgrades refers an installation of newer version of SQL Server that replaces an existing instance of SQL Server completely, including shared components. The key advantage with this is lesser requirements for additional hardware resources and the key disadvantage is incapability of rolling back at a failure of an installation. Side-by-side upgrades refers an installation of newer version of SQL Server as a new instance without replacing the older version of SQL Server installed. This is the most safest way of upgrading a system because it reduces the risk associated with upgrades leaving the original system in place and intact. However, there are few disadvantages with this, such as copying user defined databases manually, configuring security and configuring jobs used manually.
Side-by-side upgrades does not suppose to replace shared components of older version installed. However a replacement can be happened if the major build number of old instance and the major build number of the new instance are identical. This condition is rare to be occurred but this has been seen with SQL Server 2008 and 2008 R2. If you perform an installation of SQL Server 2008 R2 (version is 10.50) as a side-by-side upgrade for SQL Server 2008 (version is 10.00), though it is not an in-place upgrade, new installation will replace all shared components of SQL Server 2008 instance.
Monday, June 9, 2014
What is the fastest/quickest way of getting the total number of records (COUNT) in a SQL Server table?
Are you trying to get the total number of records in one of your tables? If yes, what is the best, or what is the quickest way of getting the number?
Generally we use COUNT aggregate function for retrieving the record count from the table. This does not take much time if the table contains low number of records. However, when COUNT is run against a table that contains millions of records, it can take a noticeable time. In a situation like that, if the table is a clustered table, the required result can be retrieved with lesser time using sys.indexes system catalog view.
The following query runs against a tables called Fact.Sales in ContosoRetailDW database (one of Microsoft sample database). This table is clustered table and it contains 3.4 millions records. Have a look on the query and the result;
USE [ContosoRetailDW]
GO
DECLARE @CurrentTime AS datetime = GetDate()
SELECT Count(*) NumberOfRecords
FROM dbo.FactSales;
SELECT Cast(DateDiff(SECOND, @CurrentTime, GetDate()) AS varchar)
+ ','
+ Cast(DateDiff(MILLISECOND, @CurrentTime, GetDate()) AS varchar)
+ ','
+ Cast(DateDiff(MICROSECOND, @CurrentTime, GetDate()) AS varchar)
AS ExecutionTime
GO
DECLARE @CurrentTime AS datetime = GetDate()
SELECT [rows] NumberOfRecords
FROM sys.sysindexes
WHERE id = OBJECT_ID('dbo.FactSales') and indid =1
SELECT Cast(DateDiff(SECOND, @CurrentTime, GetDate()) AS varchar)
+ ','
+ Cast(DateDiff(MILLISECOND, @CurrentTime, GetDate()) AS varchar)
+ ','
+ Cast(DateDiff(MICROSECOND, @CurrentTime, GetDate()) AS varchar)
AS ExecutionTime
As you see, the second method produces the result less than one microsecond while first method takes about 76 milliseconds. This proves that querying sys.indexes is more efficient than COUNT table when querying a clustered table. However, there is chance of seeing an inaccurate number with this method if statistics are not updated. In addition to that, if the table is a heap table, same performance may not be seen with second method.
Friday, June 6, 2014
Connecting with SQL Server virtual machine on Azure using Management Studio
If you have a requirement for connecting with SQL Serer virtual machine configured on Windows Azure, there are few things to be done. The following link explains step-by-step for getting the necessary tasks done for connecting via local Management Studio.
http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-provision-sql-server/
Tuesday, June 3, 2014
What is LRU (Last Recent Used) algorithm?
The LRU, or Last Recent Used algorithm determines the data pages to be dropped from the cache when Data Cache section, which is the largest part of the Buffer Pool needs space.
Data Cache section is used for caching database data pages. In order to satisfy users’ requests, SQL Server loads data pages to this section and then fulfills the requirements such as SELECT, INSERT, UPDATE and DELETE. No modifications are performed on the data files directly. Once pages are cached, other than the initial request, other requests are satisfied using cached pages too.
In addition to Data Cache section, Buffer Pool comprises two more sections; Free Pages and Stolen Pages. First section contains pages that are not used yet and are kept to handle new requests. Second section is for pages that are used by other SQL Server components.
The LRU policy determines the timeframe for data pages to be stayed in the Data Cache after they have been flushed to the disk by Checkpoint process. The process that drops pages from the cache is called as Lazy Writer. The determination of dropping pages are done based on a counter maintained on the page header, that is decreased if the page has not been scanned for a while. Pages with lowest counter are always dropped by Lazy Writer.
Maximum amount of memory to SQL Server is 8TB, is it really consuming 8TB?
“As per MSDN, the maximum memory can be consumed by SQL Server is 8TB, Will SQL Server surely use 8TB if the box is configured with 8TB?”. This was a question raised by an enthusiast.
“It will, but currently it is impossible”. It was my answer. Do you agree with me? Let me explain.
Virtual Address Memory, which is called as VAS refers the total amount of memory can be used by a Windows process or an application such as SQL Server. The size of the VAS varies according the to processor architecture (32-bit or 64-bit) and the edition of the operating system. If the processor architecture is 32-bit, VAS is 4GB. Under standard installation, 2GB is reserved for the system (kernel mode address space) and 2GB is reserved for the application (user mode address space). This proportion can be changed by adding a /3GB switch to the boot.ini for setting 3GB for user mode address space.
This is bit different when a 32-bit version of SQL Server is installed on 64-bit version of Windows. This installation provides full 4GB to SQL Server using WOW emulation technology.
The amount “8TB” comes with 64-bit processor architecture. This architecture offers full 8TB for applications, hence 64-bit version of SQL Server running on 64-bit Windows should use 8TB without any issue. However, this is not possible yet because of unavailability of Windows operating system that supports 8TB. The maximum amount of RAM supported by Windows 2012 is 4TB. Therefore, we need to wait for seeing SQL Server using full 8TB for user address space :).
















