|
|||
|
Hi,
I have a table defined as CREATE TABLE [SH_Data] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [Date] [datetime] NULL , [Time] [datetime] NULL , [TroubleshootId] [int] NOT NULL , [ReasonID] [int] NULL , [reason_desc] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [maj_reason_id] [int] NULL , [maj_reason_desc] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [ActionID] [int] NULL , [action_desc] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [WinningCaseTitle] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [Duration] [int] NULL , [dm_version] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [ConnectMethod] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [dm_motive] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [HnWhichWlan] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [RouterUsedToConnect] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [OS] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [WinXpSp2Installed] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [Connection] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [Login] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [EnteredBy] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , [Acct_Num] [int] NULL , [Site] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CS_AS NULL , CONSTRAINT [PK_SH_Data] PRIMARY KEY CLUSTERED ( [TroubleshootId] ) ON [PRIMARY] ) ON [PRIMARY] GO Which contains 5.6 Million rows and has non clustered indexes on Date, ReasonID, maj_Reason, Connection. Compared to other tables on the same server this one is extremely slow. A simple query such as : SELECT SD.reason_desc, SD.Duration, SD.maj_reason_desc, SD.[Connection], SD.aolEnteredBy FROM dbo.[Sherlock Data] SD Where SD.[Date] > Dateadd(Month,-2,Getdate()) takes over 2 minutes to run ! I realise the table contains several large columns which make the table quite large but unfortunately this cannot be changed for the moment. How can i assess what is causing the length of Query time ? And what could i possibly do to speed this table up ? The database itself is running on a dedicated server which has some other databases. None of which have this performance issue. Anyone have any ideas ? |
|
|
||||
|
||||
|
|
|
|||
|
Do other queries which benefit of indexes also have bad performance ?
Where SD.[Date] > Dateadd(Month,-2,Getdate()) does a row based comparison, not using the indexes or what does the query plan tells you about it ? (Markt the query in QA and press CTRL+L) to see it. Jens Suessmeyer. |
|
|||
|
One possiblility is to change the PK to nonclustered and the index on
[Date] to clustered. If you often do range/grouping queries based on [Date] then that should be useful, but it might also impact queries using TroubleshootId, so you need to test any change with a number of representative queries. Other general advice would be to review the query plan in QA (Ctrl+K), run UPDATE STATISTICS on the table, and also try tracing a typical workload and running it through the Index Tuning Wizard to see what it can recommend. If you need more specific comments, you should post the query plan (using SET SHOWPLAN_TEXT), and it might also be useful to know how many rows are returned by the query. Simon |
|
|||
|
garydevstore (GaryDataStore@gmail.com) writes:
> Which contains 5.6 Million rows and has non clustered indexes on Date, > ReasonID, maj_Reason, Connection. Compared to other tables on the same > server this one is extremely slow. A simple query such as : Maybe some terminology is in order here. A road can be fast, but that does not help you, if you car has a steering wheel out of order causing you to zig-zag over the road. A car can be fast, but that does not help if the road is in poor condition, so you cannot driver faster than 30 km/h anyway. In this case, the table is the road, and the query plan is the car. A table itself does not move, but it can be badly fragmented in which case it can be slow to drive through. More likely, the query plan is not the best for the query. This is your query: > SELECT > SD.reason_desc, > SD.Duration, > SD.maj_reason_desc, > SD.[Connection], > SD.aolEnteredBy > FROM dbo.[Sherlock Data] SD > Where SD.[Date] > Dateadd(Month,-2,Getdate()) There is a non-clustered index on Date. Assuming that rows are added to this table regularly, there are presumably quite a few rows that fits this condition. There are two ways for the optimizer to evaluate this query: using the index, or scanning the table. The index is good if only few rows are hit, but if many rows are hit the table scan is faster. This is because, with the index you will need to read the same page more than once. The optimizer makes it choice of plan from the statistics SQL Server has sampled about the table. The statistics may be out of date (even if by default SQL Server auto-updates statistics). Try an UPDATE STATISTICS WITH FULLSCAN, to see if this makes any difference. But the road can also be in poor condition, that is the table can be badly fragmented. This can be analysed with DBCC SHOWCONTIG and remedied with DBCC DBREINDEX. As suggested in other posts, you should look at the query plan, and see if it says Clustered Index Scan or Index Seek + Bookmark Lookup. -- Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se Books Online for SQL Server SP3 at http://www.microsoft.com/sql/techinf...2000/books.asp |
|
|||
|
Simon Hayes wrote:
> One possiblility is to change the PK to nonclustered and the index on > [Date] to clustered. If you often do range/grouping queries based on > [Date] then that should be useful, but it might also impact queries > using TroubleshootId, so you need to test any change with a number of > representative queries. A covering index might be an option, too, especially if there are several queries with multiple criteria. One question to the OP: why do you have Date and Time both as timestamp columns? Other remarkable things: all char columns seem to be unicode (nvarchar) and have length (255). You might save space by changing to varchar (if possible) and / or reducing the length. Also, this doesn't really look like a normalized schema. I would at least expect having ids for EnteredBy and probably some others. > Other general advice would be to review the query plan in QA (Ctrl+K), > run UPDATE STATISTICS on the table, and also try tracing a typical > workload and running it through the Index Tuning Wizard to see what it > can recommend. > > If you need more specific comments, you should post the query plan > (using SET SHOWPLAN_TEXT), and it might also be useful to know how > many rows are returned by the query. Plus complete index DDL. robert |
|
|
![]() |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Re: Create new tables from old tables | Gerhard Hellriegel | Newsgroup comp.soft-sys.sas | 0 | 01-14-2009 02:14 PM |
| Create new tables from old tables | yom | Newsgroup comp.soft-sys.sas | 0 | 01-14-2009 09:53 AM |