Friday, May 17, 2013
Where are the databasefiles on disk?
A fast way to see where the databasefiles is placed on disk is to use the sys.master_files. With this you can get a view over the database and where their files reside.
select d.name, m.name, m.type_desc, m.physical_name
from sys.master_files m
inner join sys.databases d
on (m.database_id = d.database_id)
order by m.name
Tuesday, March 26, 2013
Windowing functions - stochastic oscillator
Last time I was looking on the
calculation of simple moving average using the new windowing features in
transact SQL. I was curious how to do some deeper calculation in the stock
analysis area. So today I shall see how we calculate the Stockhastic oscillator.
This function use two inputs. D% and K% and the formula are:
%K = 100*(C - L14)/(H14 - L14). C = the most recent closing price L14 = the low of the 14 previous trading sessions H14 = the highest price traded during the same 14-day period.
%D = 3 or 8-day period moving average of
%K
CREATE table
#calculation (
[id] [int],
[aktie] [nchar](10) NULL,
[datum]
[date] NULL,
[stang] [decimal](18, 2) NULL,
[K] [decimal](18, 2) NULL
CONSTRAINT [PK_calculation] PRIMARY
KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE
= OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ARITHABORT OFF
SET ANSI_WARNINGS
OFF
GO
INSERT INTO
#calculation
SELECT id, aktie, datum, stang
,K = (100*((stang - MIN(stang) OVER (PARTITION BY aktie ORDER BY datum ROWS BETWEEN 13 PRECEDING AND CURRENT ROW))) / ((MAX(stang) OVER (PARTITION BY aktie ORDER BY datum ROWS BETWEEN 13 PRECEDING AND CURRENT ROW)) - (MIN(stang) OVER (PARTITION BY aktie ORDER BY datum ROWS BETWEEN 13 PRECEDING AND CURRENT ROW))))
FROM dbo.borsdata
GO
SELECT id, aktie, datum, stang
,AVG(stang) OVER (PARTITION BY aktie ORDER BY datum ROWS BETWEEN 199 PRECEDING AND CURRENT ROW) as '200 SMA'
,AVG(stang) OVER (PARTITION BY aktie ORDER BY datum ROWS BETWEEN 49 PRECEDING AND CURRENT ROW) as '50 SMA'
,AVG(stang) OVER (PARTITION BY aktie ORDER BY datum ROWS BETWEEN 19 PRECEDING AND CURRENT ROW) as '20 SMA'
,K
,D = (AVG(K) OVER (PARTITION BY aktie ORDER BY datum ROWS BETWEEN 2 PRECEDING AND CURRENT ROW))
FROM #calculation
drop table #calculation
Friday, March 8, 2013
High number of LATCH_EX waits
During an
implementation of a new SQL environment for a customer I went into some problem
with high nr of waits of LATCH_EX type when they run some heavy batches. I was
not sure what this really was. I quite familiar with PAGELATCH and so on. Those
are much more common, at least in server I have seen.
The customer asked
me to investigate what the problem was. First I read the
whitepaper “Diagnosing and Resolving
Latch Contention on SQL Server” from Microsoft.
There
were some ideas coming up after that. The server did have many CPU cores, 32 to
be exact. The database had only one datafile.
First
I tried to add more files to the database. I tried to use 4 but there was no
big change. I went down from 32 ms in average to 27ms. After investigate sys.dm_os_latch_stats is was quite obvious what the problem was.
ACCESS_METHODS_DATASET_PARENT was huge.
Regarding BOL it means Used to synchronize child dataset access to the parent dataset
during parallel operations.
I did some try to set the Max Degree of
Parallelism from default 0 to 4 or 8. This change had the desired effect. In the
graf below we can see the effect very clearly on the black line. We see the batch starts, then a
change to 8 for the Max Degree of Parallelism. Then I change it back, and then
to 4 and then to 8.
Monday, February 4, 2013
Play around with new windowing functions
Im not an developer
but off courseI like to try new features and get knowledge in the transact
language anyway. I have been interested in stocks for many years and was
playing around with Excel to do some simple classic stock analysis. Then it come
to my mind if these calculations is possible direct in SQL.
Here was a must try
scenario to learn some more transact. In my example I have a simple table with
date, high, low, close columns. The data is from OMX30 index beginning from
year 2005 to now.
In the first case I
would like to calculate Moving average for a period of 200 days. One of the
most simple analysis in stock analysis are when the price pass over 200 days
moving average there is a buy situation. When going down under this value you shall sell. If its
tru or not I don’t know. But it’s a good indication if the market is positive
or negative.
How can we use the new
windowing function in transact then? Here is an example:
SELECT id, stock, date, close
,AVG(close) OVER (PARTITION BY stock ORDER BY date ROWS BETWEEN 199 PRECEDING AND CURRENT ROW) as '200 SMA'
Really simple.
Actually I don’t even know how to do when you don´t have this grate functions. Here is the result.
Stock Date Close 200 SMA
omx30 2013-01-28 1160.25 1057.748500
I will investigate those function more and try use them for more advanced calculations. That would be another post.
Wednesday, November 14, 2012
How to switch cluster nodes in Windows 2003 with SQL 2005 installed
This is not the most modern products anymore. Anyway I went in to a
problem where we were forced to switch the old server to new one.
If some of you out there need to do it I describe the steps here. Not in
detail but some aspect to think about.
- Add the new servers to the cluster, so in our case we had now a 4 node cluster. Be sure that the disks also are shred to the new server.
- Expand the SQL installation to the new servers. This is done from the first cluster node. In add remove program you change the SQL installation. Chose the correct instance and add the new server. One important thing when doing this is to NOT be logged on with the same account that you install with on the new servers. The Remote execution will fail if you do. When the installation is success SQL is now installed on the new servers.
- Install same SQL servicepack and patches as the old servers. Run also those from the active cluster node.
- If you need any SQL client tool on the new nodes you have to install this one by on respective server and also the servicepack and patches for those.
If everything went well it’s now some issues to take care of :-)
Certificates
If you have used a certificate in SQL be sure this is installed on the
new servers. If not the engine would not start. You receive an error like: Unable to load
user-specified certificate. The server will not accept a connection. You should
verify that the certificate is correctly installed. See "Configuring
Certificate for Use by SSL" in Books Online.
In our case there was some old ssl certificate
added that was not even in use anymore. I tried to remove the string in register
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL
Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Certificate but that was not so straight forward
as I thought. When failing over the resource it added back the old certificate
key anyway. After some testing I recognized that it has to be done on the active nodes in the cluster before you
move the resources. In
our case the certificate was not used so I just leaved the value blank.
MSDTC
I also had some issues with the transaction cordinator.
It was impossible to start it on the new servers. In the windows log I got some errors like MS DTC has detected that a DC Promotion has happened since the last time
the MS DTC service was started and MS DTC Transaction Manager
start failed. LogInit returned error 0x8007000e. Our clusternodes was also
domain controllers. And the new one had been added as new domain controllers as
well (I know it’s not a nice solution). I found a KB on this http://support.microsoft.com/kb/900216.
After change the register permission on for NETWORK SERVICES account it worked
well.
Service account cant be verified
I you have a trailingspace in the clustergroups name where SQL reside you get a error says that the account you type for SQL service is wrong or can´t be verified.
Service account cant be verified
I you have a trailingspace in the clustergroups name where SQL reside you get a error says that the account you type for SQL service is wrong or can´t be verified.
"SQL Server could not validate the service accounts. Either the service accounts have not been provided for all of the services being installed, or the specified username or password is incorrect." See http://support.microsoft.com/kb/955506 for more info.
Hope this can help someone :-)
Subscribe to:
Posts (Atom)

