I run same JAVA application (spring/hibernate) on different system both use same SQL Server version.
I'm using SQL Server Profiler to trace a query which I run (exactly same) on both systems.
This is my SQL Server version on both system:
Trace System 1 : slow-system2.trc query takes randomly between 100 - 300ms
Trace System 2 : fast.trc query takes randomly between 10-20ms
It seems here on slow-screenshot a query of "use database" takes "331ms" compared to fast.trc (0ms= :
What can cause this difference just by running "use database" query ?
I tried on a 3th system running on sql express which is too slow here is trace
It seems here on "sql express" it is due to the fact I have two additional classEvent Audit Logout that takes time :
Maybe I missed out some option on SQL Server?
The long duration of the USE statement indicates the database may be set to AUTO_CLOSE ON. Overhead is incurred during database startup when it must be opened.
The setting can be changed with:
ALTER DATABASE [YourDatabase] SET AUTO_CLOSE OFF;
What's a good way of checking how much (actual) memory is currently
being used vs. how much is SQL Server allocated to itself?
I've been resorting to memory_utilization_percentage but that doesn't seem to change after running the following to release memory.
SELECT [Memory_usedby_Sqlserver_MB] = ( physical_memory_in_use_kb / 1024 ) ,
[Memory_utilization_percentage] = memory_utilization_percentage
FROM sys.dm_os_process_memory;
DBCC FREESYSTEMCACHE ('ALL')
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
SELECT [Memory_usedby_Sqlserver_MB] = ( physical_memory_in_use_kb / 1024 ) ,
[Memory_utilization_percentage] = memory_utilization_percentage
FROM sys.dm_os_process_memory;
A solution is to drop max server memory for the SQL Server and increase it again to force SQL Server to release unused but allocated memory. However an issue with this approach is that we cannot be sure how far to reduce max server memory, hence run the risk of killing SQL Server. This is why it's important to understand how much SQL Server is 'actually' using before reducing the value for max server memory.
The modified script below worked for me. I needed to temporarily release a bunch of RAM held by SQLServer so that we could run some other one-off processes on the same server. It temporarily releases SQL's reserved mem space while still allowing it to gobble the mem back up as needed.
I added a built-in wait to let SQLServer actually release the mem before bumping it back to the original level. Obviously adjust the values as needed to suit your needs.
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
/*** Drop the max down to 64GB temporarily ***/
sp_configure 'max server memory', 65536; --64GB
GO
RECONFIGURE;
GO
/**** Wait a couple minutes to let SQLServer to naturally release the RAM..... ****/
WAITFOR DELAY '00:02:00';
GO
/** now bump it back up to "lots of RAM"! ****/
sp_configure 'max server memory', 215040; --210 GB
GO
RECONFIGURE;
GO
SQL Server always assumes it is the primary application running. It is not designed to share resources. It will always take all the available memory and it will only release it for the operating system unless you throttle with 'max server memory'.
By design, Sql Server does not play well with others.
This sqlskills article recommends a baseline for throttling followed by monitoring and raising the throttle as needed:
https://www.sqlskills.com/blogs/jonathan/how-much-memory-does-my-sql-server-actually-need/
I don't have a solution for how to release the allocated memory. However, for our purposes we were able to figure out, how to allow active-active clusters to run safely. We've decided to set minimum server memory to ~2GB. This is helpful because no matter how much max memory an instance decides to use, it will never run other instances out of memory. So again, this solves our purpose but it still doesn't answer the question of how much memory is actually being used, how low can we drop the max server memory, etc...
You have to set 'Max server memory' to some value between 1-2 GB. This range is safe in most cases. It may take a time to release the memory after executing below:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 1024;
GO
RECONFIGURE;
GO
That setting allows to clear the pool, compile memory, all the caches, clr memory, etc.
The minimum value for 'max server memory' is 128 MB, but it's not recommended as SQL Server may not start in certain configurations. If it happens, use "-f" switch to force SQL start with minimal configuration, then change the value to the original one.
This post is solved in the following link, please check the format:
SQL Server not releasing memory after query executes
I don't think SQL Server releases memory unless the operating system actively requests it. If there is a case of other processes requesting more memory and if there is none at all, SQL Server will release the unused memory on its own. Rather than trying to flush the unusued memory, I'd probably go with limiting the SQL's maximum allowed memory.
sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
sp_configure 'max server memory', 512; --or some other value
GO
RECONFIGURE
GO
For further info, you could check this MSDN article: https://msdn.microsoft.com/en-us/library/ms178067.aspx
Just in case you are in an emergency situation and if you can have a small downtime, just restart your SQL service. It's just a few seconds to restart and do the job very well. Right click on your server name and click Restart.
It might be very basic question for you friends, but how to allow multiple users on SQL Server installed on remote windows server 2012 machine.?
right now only two user can work at the same time if third one comes one of two who are active has to allow and get out himself.
we are building new server which will allow multiple user to work on the same time.
My question is once we install SQL server on windows server machine what configuration needs to be done to achieve our goal(Multiple user can work on same time) on server machine as well as what configuration needs to be done on computers of people who will be logging into it.
do we need same number of instance similar to how many people will be working on it? if yes it means that many number of same database on the server and more space will be occupied right?
Thanks.
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'user connections', 777;
GO
RECONFIGURE;
GO
Replace 777 with your limit of connections.
For linked servers, I see how it is possible to change the "remote query timeout" configuration to hint a call to a linked server should complete or rollback within the specific timeout value. This appears to work across the SQL Server engine--is it possible to change the hint within a stored procedure, so that a specific stored procedure could run longer if needs to, but all other non-hinted SPROCs would timeout quicker if they run long?
Linked Query Timeout is discussed here:
http://support.microsoft.com/kb/314530
Example code to set it to timeout in 3 seconds is here:
sp_configure 'remote query timeout', 3
go
reconfigure with override
go
Not really advisable to change it within a stored procedure. remote query timeout is a global server setting when altered with sp_configure, so changing it in a stored procedure affects all remote queries for all linked servers on the server.
Additionally, executing sp_configure requires the ALTER SETTINGS server permission, which typically only sysadmin and serveradmin have. Granting these permissions to a data access account would be a security concern since they could potentially take your server down with sp_configure commands.
What I would suggest is creating a second linked server with a different name that you would use with just this one stored procedure. You can, in SSMS, configure a query timeout for each individual linked server. Adding a second linked server would enable you to query the same server with different linked server client settings. You might need to create a DNS CNAME to accomplish this if you're using plain SQL Server Linked Servers.
I have a large script file (nearly 300MB, and feasibly bigger in the future) that I am trying to run. It has been suggested in the comments of Gulzar's answer to my question about it that I should change the script timeout to 0 (no timeout).
What is the best way to set this timeout from within the script? At the moment I have all of this at the top of the script file in the hopes that one of them does something:
sp_configure 'remote login timeout', 600
go
sp_configure 'remote query timeout', 0
go
sp_configure 'query wait', 0
go
reconfigure with override
go
However, I'm still getting the same result and I can't tell if I'm succeeding in setting the timeout because the response from sqlcmd.exe is the world's least helpful error message:
Sqlcmd: Error: Scripting error.
Your solution - Add GO every 100 or 150 lines
http://www.red-gate.com/MessageBoard/viewtopic.php?t=8109
sqlcmd -t {n}
Where {n} must be a number between 0 and 65535.
Note that your question is a bit misleading since the server has no concept of a timeout and therefore you cannot set the timeout within your script.
In your context the timeout is enforced by sqlcmd
I think there is no concept of timeout within a SQL script on SQL Server. You have to set the timeout in the calling layer / client.
According to this MSDN article you could try to increase the timeout this way:
exec sp_configure 'remote query timeout', 0
go
reconfigure with override
go
"Use the remote query timeout option to specify how long, in seconds, a remote operation can take before Microsoft SQL Server times out. The default is 600, which allows a 10-minute wait. This value applies to an outgoing connection initiated by the Database Engine as a remote query. This value has no effect on queries received by the Database Engine."
P.S.: By 300 MB you mean the resulting file is 300 MB? I don't hope that the script file itself is 300 MB. That would be a world record. ;-)