Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Имеется два компа. Один мой, другой - закачика, куда я захожу удаленно. У обоих стоит Windows 7, с первым паком. У обоих стоит один и тот же SQL 2012 Express. Ведется работа с базой данных... Там делаю backup, у себя restore. Необходимо отработать импорт данных с разносом и проставлением связей по таблицам. У меня это занимается 40 минут, у клиента - почти 5 часов. Там RAM 5.68 Гб, у меня - 4 Гб. Там стоит Intel Core 2Duo, у меня вообще Intel Celeron. У меня 32-битная система, там - 64 битная.
Из-за чего может быть ТАКОЕ различие в скорости? Какие параметры можно проверить/поменять?
8 авг 13, 13:06    [14680788]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Naile
. У меня это занимается 40 минут,

Что "это" ?
Одна команда ? Скрипт ?
8 авг 13, 13:08    [14680810]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
andy st
Member

Откуда:
Сообщений: 798
телепатия вкл
у клиента HDD (жутко фрагментированный), на локально - SSD
у клиента комп занят еще чем-нибудь, z.b. местное население массово смотрят с него кино
телепатия выкл
8 авг 13, 13:55    [14681134]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Glory,
Naile
импорт данных с разносом и проставлением связей по таблицам

Импорт представляется из себя последовательное сохранение данных из Excel файлов в таблице ForImport. И далее отдельно запускает разнос данных - задействуются 9 таблиц, идут проверки на наличие уже существующих данных, проставляются связи и так далее. И вот этот разнос данных (это где-то около 35000 записей) на моем копмьютере занимает 40-50 минут, на компьютере у клиента - 4 часа.
Разнос оформлен в виде CURSOR

вот начало процедуры разноса :
DECLARE LA_cursor CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT Id, Code, LastName, FirstName, Name, DateFrom, DateTo, Quantity, Region, City, [State], Municipality, Village, Street, Building, Apartment,
		ZIP, [Type], HomePhone, WorkPhone, MobilePhone, Fax, Email, AccountNumber_ACD, ProductNumber, ProductName, PriceType, PriceTypeName,
		OrderNumber, OrderStatus, ReAddressFrom, ReAddressTo, PaymentDate, PaymentFrom, PaymentTo, PaymentAmount, CancelDate, CancelFrom, CancelTo, CancelAmount, AddressID, IsACD
FROM ForImport where IsImport = 0

OPEN LA_cursor

Насколько я понимаю (поскольку база одна и таже) дело в каких то насторйках самих компьютеров? Но в каких?
8 авг 13, 13:58    [14681150]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
andy st,

У меня на компе - ST380817AS ATA, у клиента - QEMU HARDDISK ATA....
8 авг 13, 14:10    [14681212]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Naile
разнос данных (это где-то около 35000 записей) на моем копмьютере занимает 40-50 минут, на компьютере у клиента - 4 часа.
Разнос оформлен в виде CURSOR

35000 записей за 40 минут. Это же целых 15 записей в секунду.
Перепишите ваш "разнос" без курсора, удивитесь полученному ускорению.
8 авг 13, 14:11    [14681220]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
andy st
Member

Откуда:
Сообщений: 798
Naile
у клиента - QEMU HARDDISK ATA....

случаем уж не виртуалка ли?
8 авг 13, 14:16    [14681244]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Гость333,

Я уже думала в эту сторону. Знаю, что CURSOR - зло. :)
Но .. торможу - а как тогда? Мне надо последовательно перебрать все новые (еще не импортированные, т.е. с нулевой отметкой импорта) записи из таблицы.
8 авг 13, 14:16    [14681245]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
andy st,

вот сейчас задала клиенту вопрос... меня это QEMU смутило. Жду ответ.
8 авг 13, 14:18    [14681255]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Naile
а как тогда?

Запросами

Naile
Мне надо последовательно перебрать все новые (еще не импортированные, т.е. с нулевой отметкой импорта) записи из таблицы.

И почему именно последовательно ? Почему не все сразу ?
8 авг 13, 14:19    [14681259]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Оказывается вирутальная машина. Но на этом компе физически это единственная виртуальная машина....
8 авг 13, 14:22    [14681274]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Naile
Гость333,

Я уже думала в эту сторону. Знаю, что CURSOR - зло. :)
Но .. торможу - а как тогда?

Трудно сказать, не видя структуры данных и кода, при помощи которого сейчас идёт импорт.
8 авг 13, 14:25    [14681292]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Гость333,

Тут проблема даже больше не в импорте (там просто делается INSERT). А в самом разносе данных через CURSOR.

Ну а если перегнать данных во временную динмическую таблицу, и в цикле по ключу перебирать - будет быстрее чем CURSOR?
8 авг 13, 14:28    [14681312]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Glory,

А можно мини-примерчик тогда?
8 авг 13, 14:29    [14681321]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Naile
А можно мини-примерчик тогда?

Чего ?
8 авг 13, 14:30    [14681323]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
andy st
Member

Откуда:
Сообщений: 798
Naile,
1. уточняем, какие именно ресурсы выделены для виртуалки
2. уточняем, чем нагружена хостовая операциока
3. уточняем, чем нагружена виртуалка кроме этой задачи
4. мониторим счётчики производительности: загрузка процессора, дисковая очередь и т.п. (по возможности и для хостовой ОС тоже)
https://www.sql.ru/articles/mssql/03121001perf_counters.shtml
8 авг 13, 14:31    [14681334]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Naile
Ну а если перегнать данных во временную динмическую таблицу, и в цикле по ключу перебирать - будет быстрее чем CURSOR?

Вряд ли. SQL больше приспособлен под обработку наборов данных, чем циклов по единичным записям.

Такой вопрос — ваш цикл разноса данных обёрнут в единую транзакцию, или каждая DML-команда порождает свою неявную транзакцию?
8 авг 13, 14:33    [14681347]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Naile
Glory,

А можно мини-примерчик тогда?


Как их перебрать для обработки:
Glory
И почему именно последовательно ? Почему не все сразу ?
8 авг 13, 14:39    [14681409]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Naile
Naile
Glory,

А можно мини-примерчик тогда?


Как их перебрать для обработки:
Glory
И почему именно последовательно ? Почему не все сразу ?

Мда

SELECT Id, Code, LastName, FirstName, Name, DateFrom, DateTo, Quantity, Region, City, [State], Municipality, Village, Street, Building, Apartment,
		ZIP, [Type], HomePhone, WorkPhone, MobilePhone, Fax, Email, AccountNumber_ACD, ProductNumber, ProductName, PriceType, PriceTypeName,
		OrderNumber, OrderStatus, ReAddressFrom, ReAddressTo, PaymentDate, PaymentFrom, PaymentTo, PaymentAmount, CancelDate, CancelFrom, CancelTo, CancelAmount, AddressID, IsACD
FROM ForImport where IsImport = 0
8 авг 13, 14:41    [14681418]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Glory,

Этот вариант, понятно, я и сама знаю. :)
У меня идет работа с каждой строкой результата такого запроса. Потому как данных из каждой строки должны проверится/добавится в 9 таблиц. А как я это сделаю, имея просто результат такого SELECT?
8 авг 13, 14:43    [14681439]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Naile
У меня идет работа с каждой строкой результата такого запроса. Потому как данных из каждой строки должны проверится/добавится в 9 таблиц.

Вы в курсе, что во FROM можно указывать 255 таблиц ?
Что такое JOIN вы знаете ?
8 авг 13, 14:45    [14681450]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Glory,

Ну вот моя процедура полностью : (разве тут можно обойтись одними JOIN ???)
ALTER PROCEDURE [dbo].[sp_DataToTable] 

	
AS
BEGIN
	update Document set IsContinue = 0

DECLARE LA_cursor CURSOR LOCAL FORWARD_ONLY STATIC FOR
--DECLARE LA_cursor CURSOR FOR 
SELECT Id, Code, LastName, FirstName, Name, DateFrom, DateTo, Quantity, Region, City, [State], Municipality, Village, Street, Building, Apartment,
		ZIP, [Type], HomePhone, WorkPhone, MobilePhone, Fax, Email, /*AccountNumber_LP,*/ AccountNumber_ACD, ProductNumber, ProductName, PriceType, PriceTypeName,
		OrderNumber, OrderStatus, ReAddressFrom, ReAddressTo, PaymentDate, PaymentFrom, PaymentTo, PaymentAmount, CancelDate, CancelFrom, CancelTo, CancelAmount, AddressID, IsACD
FROM ForImport where IsImport = 0

OPEN LA_cursor

DECLARE @Id int, 
		@Code varchar(50),
		@LastName nvarchar(250),
		@FirstName nvarchar(250),
		@Name nvarchar(250),
		@DateFrom datetime,
		@DateTo datetime,
		@Quantity int,
		@Region nvarchar(250),
		@City nvarchar(250),
		@State nvarchar(250),
		@Municipality nvarchar(250),
		@Village nvarchar(250),
		@Street nvarchar(250),
		@Building nvarchar(250),
		@Apartment nvarchar(250),
		@ZIP varchar(50),
		@Type nvarchar(50),
		@HomePhone nvarchar(250),
		@WorkPhone nvarchar(250),
		@MobilePhone nvarchar(250),
		@Fax nvarchar(250),
		@Email nvarchar(250),
		--@AccountNumber_LP varchar(50),
		@AccountNumber_ACD varchar(50),
		@ProductNumber varchar(20),
		@ProductName nvarchar(250),
		@PriceTypeName nvarchar(20),
		@PriceTypeDescription nvarchar(250),
		@OrderNumber varchar(20),
		@OrderStatus nvarchar(250),
		@ReAddressFrom varchar(20),
		@ReAddressTo varchar(20),
		@PaymentDate datetime,
		@PaymentFrom datetime,
		@PaymentTo datetime,
		@PaymentAmount decimal(18, 2),
		@CancelDate datetime,
		@CancelFrom datetime,
		@CancelTo datetime,
		@CancelAmount decimal(18, 2),
		@AddressID varchar(20),
		@IsACD bit,
		@AccountId uniqueidentifier, @ProductId uniqueidentifier, @DocumentId uniqueidentifier, @SourceId uniqueidentifier, @PriceTypeId uniqueidentifier,
		@Price decimal(18,2), @AccountName nvarchar(250), @Address nvarchar(max), @AccountCategoryId uniqueidentifier, @AccountAddressId uniqueidentifier

FETCH NEXT FROM LA_cursor 
INTO @Id, @Code, @LastName, @FirstName, @Name, @DateFrom, @DateTo, @Quantity, @Region, @City, @State, @Municipality, @Village, @Street, @Building, @Apartment,
	@ZIP, @Type, @HomePhone, @WorkPhone, @MobilePhone, @Fax, @Email, /*@AccountNumber_LP,*/ @AccountNumber_ACD, @ProductNumber, @ProductName, @PriceTypeName, @PriceTypeDescription,
	@OrderNumber, @OrderStatus, @ReAddressFrom, @ReAddressTo, @PaymentDate, @PaymentFrom, @PaymentTo, @PaymentAmount, @CancelDate, @CancelFrom, @CancelTo, @CancelAmount, @AddressID, @IsACD

WHILE @@FETCH_STATUS = 0
BEGIN	
	
	SET @Address = (CASE WHEN @Region is not null THEN @Region + ', ' ELSE '' END	+
						CASE WHEN @State is not null THEN @State + ', ' ELSE '' END	+
						CASE WHEN @Municipality is not null THEN @Municipality + ',' ELSE '' END	+
						CASE WHEN @City is not null THEN @City + ', ' ELSE '' END	+
						CASE WHEN @Village is not null THEN @Village + ', ' ELSE '' END	+
						CASE WHEN @Street is not null THEN @Street + ' ' ELSE '' END	+
						CASE WHEN @Building is not null THEN @Building + ', ' ELSE '' END	+
						CASE WHEN @Apartment is not null THEN 'dz. ' + @Apartment + ', ' ELSE '' END	+
						CASE WHEN @ZIP is not null THEN @ZIP ELSE '' END)


	SET @AccountName = ISNULL(LTRIM(RTRIM(@Name)), ISNULL(LTRIM(RTRIM(@FirstName)), '') + ' ' + ISNULL(LTRIM(RTRIM(@LastName)), ''))
	SET @AccountName = LTRIM(RTRIM(@AccountName))

	SET @AccountId = (SELECT ID FROM Account where Name = @AccountName and [Address] = @Address)
	IF @AccountId is null 
	BEGIN
		SET @AccountId = NEWID()		
		IF @Name is null SET @AccountCategoryId = '38ea507c-55e6-df11-971b-001d60e938c6' ELSE SET @AccountCategoryId = '37ea507c-55e6-df11-971b-001d60e938c6'
		IF @IsACD = 1
		/* Insert new Account */
		begin
			INSERT INTO Account (Id, CreatedById, ModifiedById, OwnerId, Name, PrCode, TypeId, AccountCategoryId, Phone, AdditionalPhone, HomePhone, Fax, Web, Zip, [Address], CountryId, ACDClientID, AddressTypeId, Street, Building, Apartment, AddressID_LP)
			VALUES (@AccountId, '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountName, ISNULL(@Code, ''), '03A75490-53E6-DF11-971B-001D60E938C6', @AccountCategoryId,  ISNULL(@MobilePhone, ''),
			ISNULL(@WorkPhone, ''), ISNULL(@HomePhone, ''), ISNULL(@Fax, ''), ISNULL(@Email, ''), ISNULL(@ZIP, ''), ISNULL(@Address, ''), 'F7093A1D-AB8E-41B7-855F-E58557B9A3E7', @AccountNumber_ACD, 
			'760bf68c-4b6e-df11-b988-001d60e938c6', ISNULL(@Street, ''), ISNULL(@Building, ''), ISNULL(@Apartment, ''), ISNULL(@AddressID, ''))
			
		end
		ELSE 
		begin
			INSERT INTO Account (Id, CreatedById, ModifiedById, OwnerId, Name, PrCode, TypeId, AccountCategoryId, Phone, AdditionalPhone, HomePhone, Fax, Web, Zip, [Address], CountryId, LPClientID, AddressTypeId, Street, Building, Apartment, AddressID_LP)
			VALUES (@AccountId, '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountName, ISNULL(@Code, ''), '03A75490-53E6-DF11-971B-001D60E938C6', @AccountCategoryId,  ISNULL(@MobilePhone, ''),
			ISNULL(@WorkPhone, ''), ISNULL(@HomePhone, ''), ISNULL(@Fax, ''), ISNULL(@Email, ''), ISNULL(@ZIP, ''), ISNULL(@Address, ''), 'F7093A1D-AB8E-41B7-855F-E58557B9A3E7',  /*@AccountNumber_LP*/ '', 
			'760bf68c-4b6e-df11-b988-001d60e938c6', ISNULL(@Street, ''), ISNULL(@Building, ''), ISNULL(@Apartment, ''), ISNULL(@AddressID, ''))
			
		end
				
		/* right */
		insert into SysAccountRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 0, 2)
		insert into SysAccountRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 1, 2)
		insert into SysAccountRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 2, 2)

		/* communication */
		
		--'6A3FB10C-67CC-DF11-9B2A-001D60E938C6' primary
		--'2B387201-67CC-DF11-9B2A-001D60E938C6' alter
		--'9A7AB41B-67CC-DF11-9B2A-001D60E938C6' fax
		--'6A8BA927-67CC-DF11-9B2A-001D60E938C6' e=pasts

		IF @MobilePhone is not null
		INSERT INTO AccountCommunication (CreatedById, ModifiedById, AccountId, CommunicationTypeId, Number)
		VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountId, '6A3FB10C-67CC-DF11-9B2A-001D60E938C6', @MobilePhone)

		IF @WorkPhone is not null
		INSERT INTO AccountCommunication (CreatedById, ModifiedById, AccountId, CommunicationTypeId, Number)
		VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountId, '2B387201-67CC-DF11-9B2A-001D60E938C6', @WorkPhone)
		
		IF @Fax is not null
		INSERT INTO AccountCommunication (CreatedById, ModifiedById, AccountId, CommunicationTypeId, Number)
		VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountId, '9A7AB41B-67CC-DF11-9B2A-001D60E938C6', @Fax)

		IF @Email is not null
		INSERT INTO AccountCommunication (CreatedById, ModifiedById, AccountId, CommunicationTypeId, Number)
		VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountId, '6A8BA927-67CC-DF11-9B2A-001D60E938C6', @Email)

		/* Address */

		SET @AccountAddressId = NEWID()

		insert into AccountAddress (Id, AccountId, CreatedById, ModifiedById, AddressTypeId, CountryId, [Address], Zip, iRajons, iPilseta, iNovads, iPagasts, iCiems, Street, Building, Apartment, AddressID_LP)
		values (@AccountAddressId, @AccountId, '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', '760BF68C-4B6E-DF11-B988-001D60E938C6' /*Piegade*/, 'F7093A1D-AB8E-41B7-855F-E58557B9A3E7',
		ISNULL(@Address, ''), ISNULL(@ZIP, ''), ISNULL(@Region, ''), ISNULL(@City, ''), ISNULL(@State, ''), ISNULL(@Municipality, ''), ISNULL(@Village, ''), ISNULL(@Street, ''), ISNULL(@Building, ''),
		ISNULL(@Apartment, ''), ISNULL(@AddressID, ''))
		
		
		UPDATE AA SET RegionId = r.Id FROM AccountAddress AA JOIN Region r ON r.Name = AA.iRajons WHERE AA.Id = @AccountAddressId 
		UPDATE AA SET CityId = c.Id FROM AccountAddress AA JOIN City c ON c.Name = AA.iPilseta WHERE AA.Id = @AccountAddressId  
		UPDATE AA SET StateId = s.Id FROM AccountAddress AA JOIN [State] s ON s.Name = AA.iNovads WHERE AA.Id = @AccountAddressId  
		UPDATE AA SET MunicipalityId = m.Id FROM AccountAddress AA JOIN Municipality m ON m.Name = AA.iPagasts WHERE AA.Id = @AccountAddressId  
		UPDATE AA SET VillageId = v.Id FROM AccountAddress AA JOIN Village v ON v.Name = AA.iCiems WHERE AA.Id = @AccountAddressId 
		
		UPDATE A SET RegionId = AA.RegionId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 
		UPDATE A SET CityId = AA.CityId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 
		UPDATE A SET StateId = AA.StateId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 
		UPDATE A SET MunicipalityId = AA.MunicipalityId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 
		UPDATE A SET VillageId = AA.VillageId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 
		
		insert into SysAccountAddressRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountAddressId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 0, 2)
		insert into SysAccountAddressRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountAddressId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 1, 2)
		insert into SysAccountAddressRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountAddressId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 2, 2)
	END
	ELSE
	BEGIN

		
		IF @MobilePhone is not null
		BEGIN
			IF NOT EXISTS(SELECT ID FROM AccountCommunication WHERE AccountId = @AccountId and CommunicationTypeId = '6A3FB10C-67CC-DF11-9B2A-001D60E938C6' and Number = @MobilePhone)
				INSERT INTO AccountCommunication (CreatedById, ModifiedById, AccountId, CommunicationTypeId, Number)
				VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountId, '6A3FB10C-67CC-DF11-9B2A-001D60E938C6', @MobilePhone)
		END

		IF @WorkPhone is not null
		BEGIN
			IF NOT EXISTS(SELECT ID FROM AccountCommunication WHERE AccountId = @AccountId and CommunicationTypeId = '2B387201-67CC-DF11-9B2A-001D60E938C6' and Number = @WorkPhone)
				INSERT INTO AccountCommunication (CreatedById, ModifiedById, AccountId, CommunicationTypeId, Number)
				VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountId, '2B387201-67CC-DF11-9B2A-001D60E938C6', @WorkPhone)
		END

		IF @Fax is not null
		BEGIN
			IF NOT EXISTS(SELECT ID FROM AccountCommunication WHERE AccountId = @AccountId and CommunicationTypeId = '9A7AB41B-67CC-DF11-9B2A-001D60E938C6' and Number = @Fax)
				INSERT INTO AccountCommunication (CreatedById, ModifiedById, AccountId, CommunicationTypeId, Number)
				VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountId, '9A7AB41B-67CC-DF11-9B2A-001D60E938C6', @Fax)
		END

		IF @Email is not null
		BEGIN
			IF NOT EXISTS(SELECT ID FROM AccountCommunication WHERE AccountId = @AccountId and CommunicationTypeId = '6A8BA927-67CC-DF11-9B2A-001D60E938C6' and Number = @Email)
				INSERT INTO AccountCommunication (CreatedById, ModifiedById, AccountId, CommunicationTypeId, Number)
				VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @AccountId, '6A8BA927-67CC-DF11-9B2A-001D60E938C6', @Email)
		END
		

		

		SET @AccountAddressId = (SELECT Id FROM AccountAddress WHERE iRajons = ISNULL(@Region, '') and  iPilseta = ISNULL(@City, '') and iNovads = ISNULL(@State, '') and iPagasts = ISNULL(@Municipality, '') and 
		iCiems = ISNULL(@Village, '') and Street = ISNULL(@Street, '') and	Building = ISNULL(@Building, '') and Apartment = ISNULL(@Apartment, '') and Zip = ISNULL(@ZIP, '') and AccountId = @AccountId)	
		IF @AccountAddressId is null
		BEGIN			
			SET @AccountAddressId = NEWID()

			insert into AccountAddress (Id, AccountId, CreatedById, ModifiedById, AddressTypeId, CountryId, [Address], Zip, iRajons, iPilseta, iNovads, iPagasts, iCiems, Street, Building, Apartment, AddressID_LP)
			values (@AccountAddressId, @AccountId, '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', '760BF68C-4B6E-DF11-B988-001D60E938C6' /*Piegade*/, 'F7093A1D-AB8E-41B7-855F-E58557B9A3E7',
			ISNULL(@Address, ''), ISNULL(@ZIP, ''), ISNULL(@Region, ''), ISNULL(@City, ''), ISNULL(@State, ''), ISNULL(@Municipality, ''), ISNULL(@Village, ''), ISNULL(@Street, ''), ISNULL(@Building, ''), 
			ISNULL(@Apartment, ''), ISNULL(@AddressID, ''))
			
			insert into SysAccountAddressRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountAddressId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 0, 2)
			insert into SysAccountAddressRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountAddressId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 1, 2)
			insert into SysAccountAddressRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
				values (@AccountAddressId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 2, 2)
							
			UPDATE AA SET RegionId = r.Id FROM AccountAddress AA JOIN Region r ON r.Name = AA.iRajons WHERE AA.Id = @AccountAddressId 
			UPDATE AA SET CityId = c.Id FROM AccountAddress AA JOIN City c ON c.Name = AA.iPilseta WHERE AA.Id = @AccountAddressId  
			UPDATE AA SET StateId = s.Id FROM AccountAddress AA JOIN [State] s ON s.Name = AA.iNovads WHERE AA.Id = @AccountAddressId  
			UPDATE AA SET MunicipalityId = m.Id FROM AccountAddress AA JOIN Municipality m ON m.Name = AA.iPagasts WHERE AA.Id = @AccountAddressId  
			UPDATE AA SET VillageId = v.Id FROM AccountAddress AA JOIN Village v ON v.Name = AA.iCiems WHERE AA.Id = @AccountAddressId 

			UPDATE A SET RegionId = AA.RegionId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 			
			UPDATE A SET CityId = AA.CityId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 
			UPDATE A SET StateId = AA.StateId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 
			UPDATE A SET MunicipalityId = AA.MunicipalityId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId 
			UPDATE A SET VillageId = AA.VillageId From Account A JOIN AccountAddress AA ON AA.AccountId = A.Id WHERE AA.Id = @AccountAddressId

		END
	END

	IF @IsACD = 1 begin SET @ProductId = (SELECT ID FROM Product WHERE CodeACD = @ProductNumber) end
	ELSE begin SET @ProductId = (SELECT ID FROM Product WHERE CodeLP = @ProductNumber) end
	
	
	SET @DocumentId = (SELECT d.ID FROM Document d
					INNER JOIN DocumentProduct dp ON dp.DocumentId = d.Id
					INNER JOIN Product p ON p.Id = dp.ProductId WHERE p.Id = @ProductId and d.AccountId = @AccountId and DueDate = @DateTo and d.Number = @OrderNumber)
	IF @DocumentId is not null begin update Document set IsContinue = 1 where Id = @DocumentId end
	ELSE
	BEGIN
		IF @IsACD = 1 SET @ProductId = (SELECT ID FROM Product WHERE CodeACD = @ProductNumber) ELSE SET @ProductId = (SELECT ID FROM Product WHERE CodeLP = @ProductNumber)
		IF @IsACD = 1 SET @SourceId = '934826CE-BE06-4F2F-8FA8-69EF7061248C' ELSE SET @SourceId = '70141C09-61A8-4E4A-8B17-9D4C62959636'
		
		IF @PriceTypeName is not null
		BEGIN
			SET @PriceTypeId = (SELECT ID FROM PriceType WHERE LTRIM(RTRIM(Name)) = LTRIM(RTRIM(@PriceTypeName)))
			IF @PriceTypeId is null 
			BEGIN
				SET @PriceTypeId = NEWID()
				INSERT INTO PriceType (Id, Name, [Description]) VALUES (@PriceTypeId, @PriceTypeName, @PriceTypeDescription)
			END
		END

		IF @ProductId is null 
		BEGIN
			SET @ProductId = NEWID()
			IF @IsACD = 1 INSERT INTO Product (Id, Name, Code, CodeACD) VALUES (@ProductId, @ProductName, @ProductNumber, @ProductNumber)	
			/* Insert new Product */			
			ELSE INSERT INTO Product (Id, Name, Code, CodeLP) VALUES (@ProductId, @ProductNumber, @ProductNumber, @ProductNumber)
		END
		
		/* Create new Document */	
		SET @DocumentId = NEWID()	
					
		INSERT INTO Document (Id, AccountId, TypeId, StatusId, StartDate, DueDate, Amount, SourceId, CreatedById, ModifiedById, 
		Number, OwnerId, SupplierId, PaymentDate, PaymentFrom, PaymentTo, CancelDate, CancelFrom, CancelTo, CancelAmount, PriceTypeId, iPrevious, iNext, IsContinue, ProductId, PaymentAmmount, Quantity)
		VALUES (@DocumentId, @AccountId, '39B28624-98E6-DF11-971B-001D60E938C6', '25707DD0-69F0-4485-B16E-87AA7D523459', @DateFrom, @DateTo, @PaymentAmount, @SourceId, '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00',
		ISNULL(@OrderNumber, ''), '410006E1-CA4E-4502-A9EC-E54D922D2C00', 'E308B781-3C5B-4ECB-89EF-5C1ED4DA488E', @PaymentDate, @PaymentFrom, @PaymentTo, @CancelDate, @CancelFrom, @CancelTo, ISNULL(@CancelAmount, 0),
		@PriceTypeId, ISNULL(@ReAddressFrom, ''), ISNULL(@ReAddressTo, ''), 1, @ProductId, @PaymentAmount, @Quantity)

		insert into SysDocumentRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
			values (@DocumentId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 0, 2)
		insert into SysDocumentRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
			values (@DocumentId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 1, 2)
		insert into SysDocumentRight (RecordId, SysAdminUnitId, Position, SourceId, Operation, RightLevel)
			values (@DocumentId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 0, 'F41E0268-E324-4228-9E9E-5CB7CC906398', 2, 2)
	
		SET @Price = (@PaymentAmount / @Quantity)
		INSERT INTO DocumentProduct (CreatedById, ModifiedById, Quantity, UnitId, Price, Amount, ProductId, DocumentId)
		VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00', @Quantity,  '917f764e-62e6-df11-971b-001d60e938c6', @Price, @PaymentAmount, @ProductId, @DocumentId)
	END

	UPDATE ForImport SET IsImport = 1 WHERE Id = @Id

	FETCH NEXT FROM LA_cursor 
    INTO @Id, @Code, @LastName, @FirstName, @Name, @DateFrom, @DateTo, @Quantity, @Region, @City, @State, @Municipality, @Village, @Street, @Building, @Apartment,
	@ZIP, @Type, @HomePhone, @WorkPhone, @MobilePhone, @Fax, @Email, /*@AccountNumber_LP,*/ @AccountNumber_ACD, @ProductNumber, @ProductName, @PriceTypeName, @PriceTypeDescription,
	@OrderNumber, @OrderStatus, @ReAddressFrom, @ReAddressTo, @PaymentDate, @PaymentFrom, @PaymentTo, @PaymentAmount, @CancelDate, @CancelFrom, @CancelTo, @CancelAmount, @AddressID, @IsACD
END 
CLOSE LA_cursor;
DEALLOCATE LA_cursor;

UPDATE D SET PreviousDocumentId = p.Id FROM Document D JOIN Document p ON p.Number = D.iPrevious and LEN(D.iPrevious) > 0
UPDATE D SET NextDocumentId = n.Id FROM Document D JOIN Document n ON n.Number = D.iNext and LEN(D.iNext) > 0
UPDATE Document set StatusId = '9A6BC802-50A3-467F-B524-B5245FE08BCE' where IsContinue = 0
END
8 авг 13, 14:48    [14681477]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Naile
Ну вот моя процедура полностью : (разве тут можно обойтись одними JOIN ???)

разумеется нет
один JOIN позволит использовать только 2 таблицы, а не 9
8 авг 13, 14:50    [14681497]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Glory,

Возможно я немного Вас не понимаю.
Мы же говорим о возможности оптимизировать мой разнос данных? Не используя курсор?
8 авг 13, 14:53    [14681516]     Ответить | Цитировать Сообщить модератору
 Re: Скорость работы (SQL 2012)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Naile
Мы же говорим о возможности оптимизировать мой разнос данных? Не используя курсор?

Да
Что такого вычисляется в вашем курсоре, что нельзя сразу вычислить в SELECT ?
8 авг 13, 14:54    [14681521]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить