SQL Cheat Sheet
this is about sql statements which we have collected by the time.
Useful links
Glenn Berry's SQL Server Diagnostic Scripts
Or the local copy here: http://wiki.intern/index.php/Glenn_Berry%27s_SQL_Server_Diagnostic_Scripts
Top 10 Bookings
SELECT count(*) as exp1,bookingdate FROM tblIBE_LiveBookings_Basic where test=0 and bookingdate >= 20151216 and bookingdate <= 20170117 group by bookingdate order by exp1 desc
Add mySQL User
mysql> GRANT ALL PRIVILEGES ON mylvs.* TO mylvsuser@localhost IDENTIFIED BY 'demo';
mysql> GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY 'xxxxxxx';
HOT GRANT ALL PRIVILEGES ON vfAutomation.* TO 'username'@'%' IDENTIFIED BY 'xxxxx';
Remove mySQL User
REVOKE ALL PRIVILEGES ON vfAutomation.* FROM 'azoeller '@'%'; DROP USER 'azoeller'@'%';
List user
SELECT User FROM mysql.user; SHOW GRANTS FOR 'user'@'host';
Change User pwd
SET PASSWORD FOR 'user'@'%' = PASSWORD('password');
Dump mySQL Table only
mysqldump -u root -p Statistic tblAirports > mysql_tblAirports.sql
Grant a machine name to security
CREATE LOGIN [MyDomain\MyMachineName$] FROM WINDOWS
List / kill user
SELECT SPID,STATUS, PROGRAM_NAME, LOGINAME=RTRIM(LOGINAME),HOSTNAME,CMD FROM MASTER.DBO.SYSPROCESSES WHERE DB_NAME(DBID) = 'MyDatabaseName' AND DBID != 0
Note You might need to set the permission for this too:
GRANT VIEW ANY DEFINITION TO [fra01\misadmin]; GRANT VIEW SERVER STATE TO [fra01\misadmin];
To kill connections you would set:
GRANT ALTER ANY CONNECTION TO [fra01\misadmin];
Tipp:
kill spid
Close User Access
use master ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE --do you stuff here ALTER DATABASE YourDatabase SET MULTI_USER
List costs
- This may work on MS SQL > 2005 only
ROUND(s.avg_total_user_cost * s.avg_user_impact * (s.user_seeks + s.user_scans),0) AS [Total Cost] ,d.[statement] AS [Table Name] ,equality_columns ,inequality_columns ,included_columns FROM sys.dm_db_missing_index_groups g INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle ORDER BY [Total Cost] DESC
Move temp table
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID(N'tempdb'); GO USE master; GO ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'c:\MyDir\tempdb.mdf'); GO ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'c:\MyDir\templog.ldf'); GO
Count data on a particiular hour per date
Select sum(case when FlightType = 'WFE' then 1 else 0 end) WFECount, sum(case when FlightType = 'NET' then 1 else 0 end) NETCount, sum(case when FlightType = 'PUB' then 1 else 0 end) PubCount, BookingDate From tblIBE_LiveBookings_Basic group by BookingDate
Formular condition within select statement
use CountingService go DECLARE @sDate DATE='2013-03-16' DECLARE @eDate DATE='2013-04-16' SELECT Count(*) as exp1, case when pcc = then user else pcc end, source FROM Bookings Where convert(date, BookingDateTime) >= @sDate AND convert(date, BookingDateTime) <= @eDate group by PCC,Source order by exp1 desc
Agent Job - delete by Date
DELETE FROM tblFlightAPIStoredFlight WHERE (FlightDateTime < GETDATE() - 1)
Bulk insert with T-SQL
- Insert bulk.sql into table tblVia
BULK INSERT tblVia FROM 'u:\perl\webfares\Condor\bulk.sql' WITH ( FIELDTERMINATOR ='|', ROWTERMINATOR ='|\n' );
Bulk permissions
GRANT ADMINISTER BULK OPERATIONS TO [intern\misadmin]
Insert & Join
- MS
UPDATE tblIBE_LiveBookings_Basic SET Test = 0 FROM tblIBE_LiveBookings_Basic INNER JOIN tblIBE_LiveBookings_Passenger ON tblIBE_LiveBookings_Basic.ID = tblIBE_LiveBookings_Passenger.UniqueID WHERE (tblIBE_LiveBookings_Passenger.LastName NOT LIKE 'hhiker%') AND (tblIBE_LiveBookings_Passenger.FirstName NOT LIKE 'hhiker%') AND (tblIBE_LiveBookings_Basic.Test = 1) AND (tblIBE_LiveBookings_Basic.BookingDate LIKE '201301%') AND (tblIBE_LiveBookings_Passenger.FirstName NOT LIKE 'hitch%') AND (tblIBE_LiveBookings_Passenger.FirstName NOT LIKE 'test%') AND (tblIBE_LiveBookings_Passenger.LastName NOT LIKE 'hitch%') AND (tblIBE_LiveBookings_Passenger.LastName NOT LIKE 'test%') AND (tblIBE_LiveBookings_Basic.Filekey <> 'TESTKEY') and (tblIBE_LiveBookings_Basic.Filekey <> 'TESTBOOKING')
- MySQL
UPDATE tblIBE_LiveBookings_Basic left JOIN tblIBE_LiveBookings_Passenger ON tblIBE_LiveBookings_Basic.ID = tblIBE_LiveBookings_Passenger.UniqueID SET Test = 0 WHERE (tblIBE_LiveBookings_Passenger.LastName NOT LIKE 'hhiker%') AND (tblIBE_LiveBookings_Passenger.FirstName NOT LIKE 'hhiker%') AND (tblIBE_LiveBookings_Basic.Test = 1) AND (tblIBE_LiveBookings_Basic.BookingDate LIKE '201306%') AND (tblIBE_LiveBookings_Passenger.FirstName NOT LIKE 'hitch%') AND (tblIBE_LiveBookings_Passenger.FirstName NOT LIKE 'test%') AND (tblIBE_LiveBookings_Passenger.LastName NOT LIKE 'hitch%') AND (tblIBE_LiveBookings_Passenger.LastName NOT LIKE 'test%') AND (tblIBE_LiveBookings_Basic.Filekey <> 'TESTKEY') and (tblIBE_LiveBookings_Basic.Filekey <> 'TESTBOOKING');
- Check this for join, left join, right join and outer join:
http://joins.spathon.com/
MySQL Add and Del User
CREATE USER 'admin'@'%' IDENTIFIED BY 'xxxxx'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; DROP USER 'admin'@'%';
MySQL Create user by script
#!/bin/bash DATABASE="bla" USERNAME="bla" PASSWORD="bla" Q1="create database if not exists $DATABASE;" Q2="grant usage on $DATABASE.* to $USERNAME@localhost identified by '$PASSWORD';" Q3="grant all privileges on $DATABASE.* to $USERNAME@localhost;" SQL="${Q1}${Q2}${Q3}" mysql -u root -p -e "$SQL"
MS SQL restore Database to a new DataBase Name
RESTORE DATABASE FlightAPI_DER FROM DISK='d:\FlightAPI.bak' WITH MOVE 'FlightAPI' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\FlightAPI_DER.mdf', MOVE 'FlightAPI_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\FlightAPI_DER_log.ldf'
Grant execute to stored procedures
use vfEntry_HLKDB1; GRANT EXEC TO [production\ibeadmin]
Grant select to table only (MS)
1: Create the user and map public permission to the table, then:
GRANT SELECT ON "dbo"."tblFlightAPIErrorDefinitions" TO "fapireader";
Set multi user
-- Start in master USE MASTER; ALTER DATABASE [vfEntry_HLKDB1] SET MULTI_USER
View user permission
SELECT * FROM fn_my_permissions(NULL, 'SERVER');
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
Delete data older then n days
DELETE FROM tblBackOfficeFileTransferLog WHERE (Created < DATEADD(day, - 90, GETDATE()))
Restore database which is in use
use master; ALTER DATABASE FlightAPIProd SET SINGLE_USER WITH ROLLBACK IMMEDIATE
use master; RESTORE DATABASE FlightAPIProd FROM DISK = 'C:\fapi.prod.bak' WITH REPLACE
use master; ALTER DATABASE FlightAPIProd SET MULTI_USER
Highest CPU Rate
-- Find queries that have the highest average CPU usage SELECT TOP 50 ObjectName = OBJECT_SCHEMA_NAME(qt.objectid,dbid) + '.' + OBJECT_NAME(qt.objectid, qt.dbid) ,TextData = qt.text ,DiskReads = qs.total_physical_reads -- The worst reads, disk reads ,MemoryReads = qs.total_logical_reads --Logical Reads are memory reads ,Executions = qs.execution_count ,TotalCPUTime = qs.total_worker_time ,AverageCPUTime = qs.total_worker_time/qs.execution_count ,DiskWaitAndCPUTime = qs.total_elapsed_time ,MemoryWrites = qs.max_logical_writes ,DateCached = qs.creation_time ,DatabaseName = DB_Name(qt.dbid) ,LastExecutionTime = qs.last_execution_time FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt ORDER BY qs.total_worker_time/qs.execution_count DESC
- Another:
-- Find queries that take the most CPU overall SELECT TOP 50 ObjectName = OBJECT_SCHEMA_NAME(qt.objectid,dbid) + '.' + OBJECT_NAME(qt.objectid, qt.dbid) ,TextData = qt.text ,DiskReads = qs.total_physical_reads -- The worst reads, disk reads ,MemoryReads = qs.total_logical_reads --Logical Reads are memory reads ,Executions = qs.execution_count ,TotalCPUTime = qs.total_worker_time ,AverageCPUTime = qs.total_worker_time/qs.execution_count ,DiskWaitAndCPUTime = qs.total_elapsed_time ,MemoryWrites = qs.max_logical_writes ,DateCached = qs.creation_time ,DatabaseName = DB_Name(qt.dbid) ,LastExecutionTime = qs.last_execution_time FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt ORDER BY qs.total_worker_time DESC
Show disk space by table
SELECT t.NAME AS TableName, s.Name AS SchemaName, p.rows AS RowCounts, SUM(a.total_pages) * 8 AS TotalSpaceKB, SUM(a.used_pages) * 8 AS UsedSpaceKB, (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.NAME NOT LIKE 'dt%' AND t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 GROUP BY t.Name, s.Name, p.Rows ORDER BY totalspacekb
Join for FAPI User and PCC
- Use this query to show a pcc/user summary (without passwords) and save your time to answer annoying question
SELECT tblFlightAPILogin.UserName, tblFlightAPIPCC.GUID, tblFlightAPIPCC.PCC, tblFlightAPIPCC.TerminalCountry, tblFlightAPIPCC.GDSName, tblFlightAPIPCC.PCCUser FROM tblFlightAPIPCC INNER JOIN tblFlightAPILogin ON tblFlightAPIPCC.GUID = tblFlightAPILogin.UserGuid AND (tblFlightAPIPCC.GDSName = 'F1' OR tblFlightAPIPCC.GDSName = 'T1')
- Use this query to show all pcc/user details
SELECT tblFlightAPILogin.UserName, tblFlightAPIPCC.GUID, tblFlightAPIPCC.PCC, tblFlightAPIPCC.IsDefault, tblFlightAPIPCC.TerminalCountry, tblFlightAPIPCC.Password, tblFlightAPIPCC.GDSName, tblFlightAPIPCC.PCCUser, tblFlightAPIPCC.ReferenceID, tblFlightAPIPCC.OrganisationID, tblFlightAPIPCC.PCCID, tblFlightAPIPCC.AccessPoint FROM tblFlightAPIPCC INNER JOIN tblFlightAPILogin ON tblFlightAPIPCC.GUID = tblFlightAPILogin.UserGuid AND (tblFlightAPIPCC.GDSName = 'F1' OR tblFlightAPIPCC.GDSName = 'T1')
Rebuild all indexes
DECLARE @Database VARCHAR(255) DECLARE @Table VARCHAR(255) DECLARE @cmd NVARCHAR(500) DECLARE @fillfactor INT SET @fillfactor = 90 DECLARE DatabaseCursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('master','msdb','tempdb','model','distribution') ORDER BY 1 OPEN DatabaseCursor FETCH NEXT FROM DatabaseCursor INTO @Database WHILE @@FETCH_STATUS = 0 BEGIN SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT [ + table_catalog + ].[ + table_schema + ].[ + table_name + ] as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES WHERE table_type = BASE TABLE' -- create table cursor EXEC (@cmd) OPEN TableCursor FETCH NEXT FROM TableCursor INTO @Table WHILE @@FETCH_STATUS = 0 BEGIN IF (@@MICROSOFTVERSION / POWER(2, 24) >= 9) BEGIN -- SQL 2005 or higher command SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')' EXEC (@cmd) END ELSE BEGIN -- SQL 2000 command DBCC DBREINDEX(@Table,' ',@fillfactor) END FETCH NEXT FROM TableCursor INTO @Table END CLOSE TableCursor DEALLOCATE TableCursor FETCH NEXT FROM DatabaseCursor INTO @Database END CLOSE DatabaseCursor DEALLOCATE DatabaseCursor
Reduce Records in FAPI DB
Use the following statement to delete flight data following foreign keys
DELETE FROM tblFlightAPIStoredFlight WHERE (FlightDateTime < GETDATE() - 7)
Transfer Database to a another SQL and create users from there
Problem: We need to transfer the PathFinder DB into the new Velia network and then create and assign local domain users
- 1 Backup
Hint: Make sure you delete the provious backup to avoid FILE assignments
backup database PathFinderDB2 to disk='e:\backup\PathFinderDB2.bak'
- 2 Restore
use Master; RESTORE DATABASE PathFinderDB2 FROM DISK = 'C:\PathFinderDB2.bak' WITH MOVE 'PathFinderDB2' TO 'C:\Data\PathFinderDB2.mdf', MOVE 'PathFinderDB2_Log' TO 'C:\Data\PathFinderDB2.ldf', FILE=1,REPLACE;
- 3: Assign local domain users to the new restored Database
use PathFinderDB2; CREATE USER [FRA01\hhservice] FOR LOGIN [FRA01\hhservice] EXEC sp_addrolemember 'db_datareader', 'FRA01\hhservice'; EXEC sp_addrolemember 'db_datawriter', 'FRA01\hhservice'; EXEC sp_addrolemember 'db_executestoredprocedures', 'FRA01\hhservice';
Create and assign user in ms sql
use PathFinderDB2; CREATE USER [FRA01\hhservice] FOR LOGIN [FRA01\hhservice] EXEC sp_addrolemember 'db_datareader', 'FRA01\hhservice';
Grant permission to a single table only
- Assign Public permissions to the database
Optional:
Use Statistic exec sp_msforeachtable "DENY SELECT ON '?' TO [intern\informationservice];"
Then:
GRANT SELECT ON tblAirports to [intern\informationservice]
Change Logical File Name (MSSQL)
- Get the current name first, sample db = AlomaClient_AvorisNortravel
USE AlomaClient_AvorisNortravel GO SELECT file_id, name as [logical_file_name],physical_name from sys.database_files
Return
1 AlomaClient1_New_Data C:\Data\AlomaClient_AvorisNortravel.mdf 2 AlomaClient1_New_Log C:\Data\AlomaClient_AvorisNortravel_1.ldf
- Change the name by:
USE [master]; GO ALTER DATABASE [AlomaClient_AvorisNortravel] MODIFY FILE ( NAME = AlomaClient1_New_Data, NEWNAME = AlomaClient_AvorisNortravel_Data ); GO
And
USE [master]; GO ALTER DATABASE [AlomaClient_AvorisNortravel] MODIFY FILE ( NAME = AlomaClient1_New_Log, NEWNAME = AlomaClient_AvorisNortravel_Log ); GO
Most I/O intensive query the last 6 hours
- Note: The query can take a long time to complete
SELECT TOP (20)last_execution_time, total_logical_reads/execution_count AS [avg_logical_reads], total_logical_writes/execution_count AS [avg_logical_writes], total_worker_time/execution_count AS [avg_cpu_cost], execution_count, total_worker_time, total_logical_reads, total_logical_writes, (SELECT DB_NAME(dbid) + ISNULL('..' + OBJECT_NAME(objectid), ) FROM sys.dm_exec_sql_text([sql_handle])) AS query_database, (SELECT SUBSTRING(est.[text], statement_start_offset/2 + 1, (CASE WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), est.[text])) * 2 ELSE statement_end_offset END - statement_start_offset ) / 2) FROM sys.dm_exec_sql_text(sql_handle) AS est) AS query_text, last_logical_reads, min_logical_reads, max_logical_reads, last_logical_writes, min_logical_writes, max_logical_writes, total_physical_reads, last_physical_reads, min_physical_reads, max_physical_reads, (total_logical_reads + (total_logical_writes * 5))/execution_count AS io_weighting, plan_generation_num, qp.query_plan FROM sys.dm_exec_query_stats OUTER APPLY sys.dm_exec_query_plan([plan_handle]) AS qp WHERE [dbid] >= 5 AND (total_worker_time/execution_count) > 100 AND last_execution_time>DATEADD(hh,-6,GETDATE()) ORDER BY io_weighting DESC;
Transaction per second
TransactionCache
DECLARE @cntr_value bigint SELECT @cntr_value = cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'transactions/sec' AND object_name = 'SQLServer:Databases' AND instance_name = 'TransactionCache' WAITFOR DELAY '00:00:01' SELECT cntr_value - @cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'transactions/sec' AND object_name = 'SQLServer:Databases' AND instance_name = 'TransactionCache'
BadServiceStore
DECLARE @cntr_value bigint SELECT @cntr_value = cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'transactions/sec' AND object_name = 'SQLServer:Databases' AND instance_name = 'BADServiceStore' WAITFOR DELAY '00:00:01' SELECT cntr_value - @cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'transactions/sec' AND object_name = 'SQLServer:Databases' AND instance_name = 'BADServiceStore'