Dass Sathiyamoorthi Ответов: 1

Я пытаюсь получить данные таблицы, но это занимает слишком много времени.общая запись составляет 2000 строк ...пожалуйста любой орган дайте решение


CREATE TABLE [dbo].[TRANSDTL](
	[fin_year] [nvarchar](4) NOT NULL,
	[tran_no] [decimal](18, 0) NOT NULL,
	[tran_dt] [smalldatetime] NULL,
	[part_no] [nvarchar](20) NOT NULL,
	[loc_from] [nvarchar](50) NOT NULL,
	[stor_typ] [nvarchar](2) NOT NULL,
	[gfin_year] [nvarchar](4) NOT NULL,
	[giv_no] [decimal](18, 0) NOT NULL,
	[doc_typ] [nvarchar](2) NOT NULL,
	[indt_no] [nvarchar](20) NOT NULL,
	[pack_size] [nvarchar](50) NULL,
	[tot_qty] [decimal](18, 3) NOT NULL,
	[SentQty] [decimal](18, 3) NULL,
	[loc_to] [nvarchar](20) NULL,
	[CMPY_CD] [int] NOT NULL,
	[tranType] [nvarchar](3) NOT NULL,
	[custo_no] [nvarchar](50) NULL,
	[custo_dt] [datetime] NULL,
	[AcceptDate] [datetime] NULL,
	[CheckField]  AS (hashbytes('SHA1',(((((CONVERT([nvarchar](10),[giv_no],(0))+CONVERT([nvarchar](20),[part_no],(0)))+[gfin_year])+CONVERT([nvarchar](10),[cmpy_cd],(0)))+CONVERT([char](2),[stor_typ],(0)))+case when rtrim(ltrim([indt_no]))='' then 'a' when [indt_no] IS NULL then 'a' else [indt_no] end)+CONVERT([nvarchar](2),[doc_typ],(0)))),
	[checkFieldLoc]  AS (hashbytes('SHA1',((((((CONVERT([nvarchar](10),[giv_no],(0))+CONVERT([nvarchar](20),[part_no],(0)))+[gfin_year])+CONVERT([nvarchar](10),[cmpy_cd],(0)))+CONVERT([char](2),[stor_typ],(0)))+case when rtrim(ltrim([indt_no]))='' then 'a' when [indt_no] IS NULL then 'a' else [indt_no] end)+CONVERT([nvarchar](2),[doc_typ],(0)))+CONVERT([nvarchar](20),[loc_from],(0)))),
	[GRate]  AS ([dbo].[f_GetGivRate](hashbytes('SHA1',(((((CONVERT([nvarchar](10),[giv_no],(0))+CONVERT([nvarchar](20),[part_no],(0)))+[gfin_year])+CONVERT([nvarchar](10),[cmpy_cd],(0)))+CONVERT([char](2),[stor_typ],(0)))+case when rtrim(ltrim([indt_no]))='' then 'a' when [indt_no] IS NULL then 'a' else [indt_no] end)+CONVERT([nvarchar](2),[doc_typ],(0))))),
	[checkFieldDC]  AS (hashbytes('SHA1',(CONVERT([nvarchar](20),[custo_no],(0))+CONVERT([nvarchar](20),[part_no],(0)))+CONVERT([nvarchar](10),[cmpy_cd],(0)))),
	[Gin_Rate] [decimal](18, 3) NOT NULL,
	[Curr_Code] [int] NULL,
	[Exchange_Rate] [decimal](18, 5) NOT NULL,
	[CheckFieldStr]  AS ((((((CONVERT([nvarchar](10),[giv_no],(0))+CONVERT([nvarchar](20),[part_no],(0)))+[gfin_year])+CONVERT([nvarchar](10),[cmpy_cd],(0)))+CONVERT([char](2),[stor_typ],(0)))+case when rtrim(ltrim([indt_no]))='' then 'a' when [indt_no] IS NULL then 'a' else [indt_no] end)+CONVERT([nvarchar](2),[doc_typ],(0))),
	[tdoc_typ] [nvarchar](10) NULL,
 CONSTRAINT [PK_TRANSDTL] PRIMARY KEY CLUSTERED 
(
	[fin_year] ASC,
	[tran_no] ASC,
	[part_no] ASC,
	[loc_from] ASC,
	[stor_typ] ASC,
	[gfin_year] ASC,
	[giv_no] ASC,
	[doc_typ] ASC,
	[indt_no] ASC,
	[CMPY_CD] ASC,
	[tranType] 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 ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[TRANSDTL] ADD  CONSTRAINT [DF_TRANSDTL_tot_qty]  DEFAULT ((0)) FOR [tot_qty]
GO

ALTER TABLE [dbo].[TRANSDTL] ADD  CONSTRAINT [DF_TRANSDTL_SentQty]  DEFAULT ((0)) FOR [SentQty]
GO

ALTER TABLE [dbo].[TRANSDTL] ADD  CONSTRAINT [DF_TRANSDTL_CMPY_CD_1]  DEFAULT ((0)) FOR [CMPY_CD]
GO

ALTER TABLE [dbo].[TRANSDTL] ADD  CONSTRAINT [DF_TRANSDTL_Rate]  DEFAULT ((0)) FOR [Gin_Rate]
GO

ALTER TABLE [dbo].[TRANSDTL] ADD  CONSTRAINT [DF_TRANSDTL_Exchange_Rate]  DEFAULT ((0)) FOR [Exchange_Rate]
GO


Что я уже пробовал:

я пытаюсь получить данные таблицы, но это занимает слишком много времени

[no name]

Профилируйте свой запрос и посмотрите, что занимает так много времени, а затем посмотрите, что вы можете сделать, чтобы сократить это время.

Dave Kreskowiak

Вы вызываете HASHBYTES 8000 раз (что дорого сделать один раз!), делаете кучу конвертов, манипуляций со строками и падежами в SQL-запросе и удивляетесь, почему он медленный?

Решение очень простое. Не выполняйте всю эту работу в запросе SELECT. Сделайте это в разделе вставка и / или обновление и сохраните данные по мере необходимости. Сделайте как можно больше работы заранее, прежде чем вам нужно будет использовать эти данные.

Dass Sathiyamoorthi

Спасибо, Мистер Дейв!!
Ваше предложение очень полезно для меня..

1 Ответов

Рейтинг:
9

David_Wimbley

Вам нужно научиться профилировать / отлаживать sql-запросы. Я предполагаю, что это sql-сервер.

Как использовать sql profiler - Google Search[^]

Как использовать SQL Profiler[^]

Также загляните в свой план выполнения запроса и посмотрите, что он делает/что занимает много ресурсов/времени.
Основы Плана Выполнения-Простой Разговор[^]

Оттуда вам нужно оценить, нужно ли вам больше нормализовать свою схему (или, возможно, денормализовать в странных случаях), посмотреть на добавление индексов, если это применимо, а также посмотреть на переписывание ваших запросов, чтобы быть более эффективными (например, возможно, вы делаете подзапросы и должны смотреть на соединение или наоборот).

Только вы можете отлаживать / улучшать производительность вашей базы данных, так как никто из нас здесь не имеет доступа к вашему серверу БД, поэтому вам нужно будет сделать всю работу, чтобы улучшить то, что вы считаете плохой производительностью в вашей базе данных.


Dass Sathiyamoorthi

Спасибо Вам мистер Дэвид Кимбли,
я нашел точную проблему,в этой таблице, имеющей ограничения проверки, так что только это занимает так много времени, чтобы получить.
в этом случае любой другой способ прояснить эту проблему.
пожалуйста, любезно дайте мне идею, как решить эту проблему.