Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не получается слить из четрёх баз в одну  [new]
Dims
Member

Откуда: Москва
Сообщений: 397
В чём может быть дело? Очень тяжеловесный запрос?

При попытке слить четыре таблицы из разных баз в одну возникают ошибки:


Msg 1204, Level 19, State 4, Line 4
The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions.
Msg 1204, Level 19, State 4, Line 4
The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions.
Msg 1204, Level 19, State 4, Line 4
The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions.
Msg 1204, Level 19, State 4, Line 4
The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions.

Вот скрипт:

USE Sayfalar
GO

DECLARE @DBName varchar(24)
SET @DBName = 'Sayfalar'
INSERT INTO SayfalarBig.dbo.SonuclariTots 
	SELECT Sonuclari.Phone AS Phone, Sonuclari.Address AS Addres, Sonuclari.FullName AS FullName, Sayfalar.White AS White, @DBName AS DBName, Sonuclari.Id AS SonuclariID 
		FROM Sonuclari 
			INNER JOIN BySemtleri ON Sonuclari.BySemtleriId=BySemtleri.Id 
			INNER JOIN Sayfalar ON BySemtleri.SayfalarId = Sayfalar.Id 
		WHERE 
			Sonuclari.Phone NOT IN (SELECT Phone FROM SayfalarBig.dbo.SonuclariTots) AND
			Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
	   
	
USE Sayfalar_15x13
GO

DECLARE @DBName varchar(24)
SET @DBName = 'Sayfalar_15x13'
INSERT INTO SayfalarBig.dbo.SonuclariTots 
	SELECT Sonuclari.Phone AS Phone, Sonuclari.Address AS Addres, Sonuclari.FullName AS FullName, Sayfalar.White AS White, @DBName AS DBName, Sonuclari.Id AS SonuclariID 
		FROM Sonuclari 
			INNER JOIN BySemtleri ON Sonuclari.BySemtleriId=BySemtleri.Id 
			INNER JOIN Sayfalar ON BySemtleri.SayfalarId = Sayfalar.Id 
		WHERE 
			Sonuclari.Phone NOT IN (SELECT Phone FROM SayfalarBig.dbo.SonuclariTots) AND
			Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
	   
	
USE Sayfalar_15x400
GO

DECLARE @DBName varchar(24)
SET @DBName = 'Sayfalar_15x400'
INSERT INTO SayfalarBig.dbo.SonuclariTots 
	SELECT Sonuclari.Phone AS Phone, Sonuclari.Address AS Addres, Sonuclari.FullName AS FullName, Sayfalar.White AS White, @DBName AS DBName, Sonuclari.Id AS SonuclariID 
		FROM Sonuclari 
			INNER JOIN BySemtleri ON Sonuclari.BySemtleriId=BySemtleri.Id 
			INNER JOIN Sayfalar ON BySemtleri.SayfalarId = Sayfalar.Id 
		WHERE 
			Sonuclari.Phone NOT IN (SELECT Phone FROM SayfalarBig.dbo.SonuclariTots) AND
			Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
	   
	   
USE Sayfalar_400x400
GO

DECLARE @DBName varchar(24)
SET @DBName = 'Sayfalar_400x400'
INSERT INTO SayfalarBig.dbo.SonuclariTots 
	SELECT Sonuclari.Phone AS Phone, Sonuclari.Address AS Addres, Sonuclari.FullName AS FullName, Sayfalar.White AS White, @DBName AS DBName, Sonuclari.Id AS SonuclariID 
		FROM Sonuclari 
			INNER JOIN BySemtleri ON Sonuclari.BySemtleriId=BySemtleri.Id 
			INNER JOIN Sayfalar ON BySemtleri.SayfalarId = Sayfalar.Id 
		WHERE 
			Sonuclari.Phone NOT IN (SELECT Phone FROM SayfalarBig.dbo.SonuclariTots) AND
			Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
11 авг 09, 16:18    [7523847]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Не знаю насчёт тяжеловесности, но вот этот фрагмент странный
Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
Зачем MIN и GROUP BY?
11 авг 09, 16:22    [7523869]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Не знаю насчёт тяжеловесности, но вот этот фрагмент странный
Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
Зачем MIN и GROUP BY?

Ага,учитывая еще

FROM Sonuclari 
WHERE Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
Это типа найти все записи таблицы, которые есть в этой же таблице ?
11 авг 09, 16:29    [7523912]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
msLex
Member

Откуда:
Сообщений: 7894
Glory
iap
Не знаю насчёт тяжеловесности, но вот этот фрагмент странный
Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
Зачем MIN и GROUP BY?

Ага,учитывая еще

FROM Sonuclari 
WHERE Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
Это типа найти все записи таблицы, которые есть в этой же таблице ?

мож я чего не понимаю, но выбираются записи с минимальным ID для каждого Phone, что в этом плохого?
11 авг 09, 17:44    [7524436]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Glory
Member

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

мож я чего не понимаю, но выбираются записи с минимальным ID для каждого Phone, что в этом плохого?

Ну так памяти серверу не хватает для выполнения этого вашего запроса
11 авг 09, 17:46    [7524450]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
msLex
Member

Откуда:
Сообщений: 7894
Glory
msLex

мож я чего не понимаю, но выбираются записи с минимальным ID для каждого Phone, что в этом плохого?

Ну так памяти серверу не хватает для выполнения этого вашего запроса

1. запрос не мой
2. меня смутил вот этот комментарий
Glory
Это типа найти все записи таблицы, которые есть в этой же таблице ?
11 авг 09, 17:48    [7524465]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
vov@
Member

Откуда: Днепропетровск
Сообщений: 110
попробуйте переписать это
Sonuclari.Phone NOT IN (SELECT Phone FROM SayfalarBig.dbo.SonuclariTots) AND
через NOT EXISTS
a это
SELECT MIN(Id) FROM Sonuclari GROUP BY Phone
закешируйте во временной таблице, если таблица не активно юзается, конечно...
11 авг 09, 18:03    [7524547]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Glory
Member

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

мож я чего не понимаю, но выбираются записи с минимальным ID для каждого Phone, что в этом плохого?

Ну так памяти серверу не хватает для выполнения этого вашего запроса

1. запрос не мой
2. меня смутил вот этот комментарий
Glory
Это типа найти все записи таблицы, которые есть в этой же таблице ?

Т.к. вы не сообщили ничего о ваших таблицах, то каждый может по своему решать, что у вас там ключ и зачем нужны подзапросы.
11 авг 09, 18:06    [7524563]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
msLex
Member

Откуда:
Сообщений: 7894
Glory
msLex
Glory
msLex

мож я чего не понимаю, но выбираются записи с минимальным ID для каждого Phone, что в этом плохого?

Ну так памяти серверу не хватает для выполнения этого вашего запроса

1. запрос не мой
2. меня смутил вот этот комментарий
Glory
Это типа найти все записи таблицы, которые есть в этой же таблице ?

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



еще раз
1. запрос не мой, я НЕ являюсь автором топика
2. Вы с iap сделали неверное предположени в бесполезности конструкции вида
select * from table1 where id in (select min(id) from table1 group by field1)


ЗЫ
Glory, при всем уважении к вам, вы не умеете признавать своих ошибок.
11 авг 09, 18:19    [7524619]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Glory
Member

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


еще раз
1. запрос не мой, я НЕ являюсь автором топика
2. Вы с iap сделали неверное предположени в бесполезности конструкции вида
select * from table1 where id in (select min(id) from table1 group by field1)


ЗЫ
Glory, при всем уважении к вам, вы не умеете признавать своих ошибок.

Еще раз. Если вы не знаете или не желаете сообщить, что делает ваш запрос, то каждый вправе решить это за вас. Если вы считаете, что это ошибка, то претензии переадресуйте себе
11 авг 09, 20:26    [7525006]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
msLex
Member

Откуда:
Сообщений: 7894
Glory
msLex


еще раз
1. запрос не мой, я НЕ являюсь автором топика
2. Вы с iap сделали неверное предположени в бесполезности конструкции вида
select * from table1 where id in (select min(id) from table1 group by field1)


ЗЫ
Glory, при всем уважении к вам, вы не умеете признавать своих ошибок.

Еще раз. Если вы не знаете или не желаете сообщить, что делает ваш запрос, то каждый вправе решить это за вас. Если вы считаете, что это ошибка, то претензии переадресуйте себе


ЭТО НЕ МОЙ ЗАПРОС. ВОТ АВТОР ТОПИКА Dims
11 авг 09, 20:45    [7525035]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
msLex
решить это за вас. Если вы считаете, что это ошибка, то претензии переадресуйте себе


ЭТО НЕ МОЙ ЗАПРОС. ВОТ АВТОР ТОПИКА Dims[/quot]
Ну так если не ваш, то откуда вы знаете про необходимость его частей ?
11 авг 09, 21:15    [7525091]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
msLex
2. Вы с iap сделали неверное предположени в бесполезности конструкции вида
select * from table1 where id in (select min(id) from table1 group by field1)
Я только сказал, что она кажется мне странной.
Сейчас присмотрелся - и не такая уж она странная... Извините.
11 авг 09, 21:42    [7525139]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Dims
Member

Откуда: Москва
Сообщений: 397
iap
Не знаю насчёт тяжеловесности, но вот этот фрагмент странный
Sonuclari.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)
Зачем MIN и GROUP BY?


В таблице есть повторяющиеся телефоны. Я отбираю только один Id (минимальный, мне всё равно, какой) для каждого телефона и потом возвращаю из таблицы только строки с указанными Id-ами. В результате я хочу отобрать строки с уникальными телефонными номерами.
11 авг 09, 22:55    [7525282]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Dims
Member

Откуда: Москва
Сообщений: 397
Переписал запрос нижеследующим образом -- не помогает.
Запрос, который загружает данные во временную таблицу отрабатывает нормально, а второй запрос, который копирует записи из временной таблицы в окончательную с проверкой наличия -- вылетает с той же ошибкой, даже если окончательная таблица пуста.

Может быть, дело в том, что я по ходу скрипте несколько раз меняю базу данных командой USE/GO?

DECLARE @DBName varchar(24)
SET @DBName = 'Sayfalar'


DECLARE @Sonuclari TABLE (
	Phone nvarchar(50) NOT NULL PRIMARY KEY,
	FullName nvarchar(128) NOT NULL,
	White bit,
	SonuclariId INT NOT NULL,
	BySemtleriId INT NOT NULL,
	Address ntext
	
)

INSERT INTO @Sonuclari (Phone,Address,FullName,White,SonuclariId,BySemtleriId)
	SELECT Phone, S.Address A, FullName, Sayfalar.White AS White, S.Id AS SonuclariID, S.BySemtleriId AS BySemtleriId
		FROM Sonuclari AS S
			INNER JOIN BySemtleri ON S.BySemtleriId=BySemtleri.Id 
			INNER JOIN Sayfalar ON BySemtleri.SayfalarId = Sayfalar.Id 
				WHERE 
					S.Id IN (SELECT MIN(Id) FROM Sonuclari GROUP BY Phone)

INSERT INTO SayfalarBig.dbo.SonuclariTots 
	SELECT Phone, Address, FullName, White, @DBName AS DBName, SonuclariID 
		FROM @Sonuclari AS S
		WHERE 
			NOT EXISTS (SELECT Phone FROM SayfalarBig.dbo.SonuclariTots WHERE Phone = S.Phone)
20 авг 09, 12:57    [7561222]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
INSERT INTO @Sonuclari (Phone,Address,FullName,White,SonuclariId,BySemtleriId)
	SELECT Phone, S.Address A, FullName, Sayfalar.White AS White, S.Id AS SonuclariID, S.BySemtleriId AS BySemtleriId
		FROM Sonuclari AS S
			INNER JOIN BySemtleri ON S.BySemtleriId=BySemtleri.Id 
			INNER JOIN Sayfalar ON BySemtleri.SayfalarId = Sayfalar.Id 
			INNER JOIN (SELECT MIN(Id) Id FROM Sonuclari GROUP BY Phone) t on S.Id = t.Id

INSERT INTO SayfalarBig.dbo.SonuclariTots 
	SELECT Phone, Address, FullName, White, @DBName AS DBName, SonuclariID 
		FROM @Sonuclari AS S
		LEFT JOIN SayfalarBig.dbo.SonuclariTots st on s.Phone = st.Phone
		WHERE st.Phone is null
?

для спящего время бодрствования равносильно сну
20 авг 09, 13:02    [7561279]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Dims
Member

Откуда: Москва
Сообщений: 397
Да, не сообразил так попробовать. Думал, что для SQL сервера не надо запросы красиво писать, думал, что достаточно "как слышится, так и пишется", а он уж сам там разберётся и всё оптимизирует...

Сейчас попробую...
20 авг 09, 15:25    [7562402]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Dims,

а что за версия сервера?
20 авг 09, 15:28    [7562434]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Dims
Member

Откуда: Москва
Сообщений: 397
10.0.2600, триальная версия 2008, якобы дающая на 2 месяца полный функционал
20 авг 09, 16:56    [7563094]     Ответить | Цитировать Сообщить модератору
 Re: Не получается слить из четрёх баз в одну  [new]
Dims
Member

Откуда: Москва
Сообщений: 397
Версия с LEFT JOIN сработала нормально. Спасибо.
22 авг 09, 12:25    [7569462]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить