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

Откуда: Lithuania
Сообщений: 45
Запрос:

select Stock.СhippingCaseId
from   Stock
where  Stock.LocationId = 'CNTMR'
Возвращает результат мгновенно.

И Запрос:

SELECT  StickCode 
FROM FGTraceTest.dbo.ShippingCases  AS ShippingCases 
where ShippingCases.ShippingCaseId in 
					('01',
					'02',
					'03',
					'04',
					'05',
					'06',
					'07',
					'08')
Возвращает результат мгновенно.

А запрос (объединение двух предыдущих):

select Stock.ShippingcaseId,
	(SELECT  top 1 StickCode FROM FGTraceTest.dbo.ShippingCases  AS ShippingCases (index = PK_ShippingCases)  where ShippingCases.shippingcaseid = stock.shippingcaseid collate latin1_general_ci_as) as 'Stick'
from   Stock
where  Stock.LocationId = 'CNTMR'

Работает больше 5 мин и при этом буквально вешает весь SQL.
Я так понимаю, что это баг MS.
Стоит SP4.
Как обойти проблему? Inner – left join, subquery не помогают, насильно говорить что есть индекс тоже.
План такой (plan.PNG).

К сообщению приложен файл. Размер - 0Kb
11 ноя 05, 14:48    [2060488]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Работает больше 5 мин и при этом буквально вешает весь SQL.
Я так понимаю, что это баг MS.

Ну разумеется. Чей же еще.

Как обойти проблему? Inner – left join, subquery не помогают, насильно говорить что есть индекс тоже.
Начните с того, что предоставьте иноформацию о структуре таблиц и их индексах. Желательно скриптами.
Кроме того план выполнения в текстовом виде
11 ноя 05, 14:53    [2060514]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
Andrej S.
А запрос (объединение двух предыдущих):

select Stock.ShippingcaseId,
	(SELECT  top 1 StickCode FROM FGTraceTest.dbo.ShippingCases  AS ShippingCases (index = PK_ShippingCases)  where ShippingCases.shippingcaseid = stock.shippingcaseid collate latin1_general_ci_as) as 'Stick'
from   Stock
where  Stock.LocationId = 'CNTMR'


Мне вот это очень нравиться. Запросы то совсем разные...
Для начала обновите статистику.
11 ноя 05, 15:53    [2060956]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
Glory
Начните с того, что предоставьте иноформацию о структуре таблиц и их индексах. Желательно скриптами.
-- ShippingCases
CREATE TABLE [dbo].[ShippingCases] (
	[ShippingCaseID] [char] (40) COLLATE SQL_Latin1_General_CP1257_CI_AS NOT NULL ,
	[ProductCode] [char] (12) COLLATE SQL_Latin1_General_CP1257_CI_AS NULL ,
	[PackingMachine] [char] (10) COLLATE SQL_Latin1_General_CP1257_CI_AS NULL ,
	[Shift] [char] (2) COLLATE SQL_Latin1_General_CP1257_CI_AS NULL ,
	[ProductionDate] [datetime] NULL ,
	[CurrentSCStatus] [char] (3) COLLATE SQL_Latin1_General_CP1257_CI_AS NULL ,
	[PalletID] [char] (40) COLLATE SQL_Latin1_General_CP1257_CI_AS NULL ,
	[BlockingStatus] [char] (1) COLLATE SQL_Latin1_General_CP1257_CI_AS NULL ,
	[ScanningDateTime] [datetime] NULL ,
	[Factory] [char] (3) COLLATE SQL_Latin1_General_CP1257_CI_AS NULL ,
	[StickCode] [varchar] (10) COLLATE SQL_Latin1_General_CP1257_CI_AS NULL ,
	[PackSpecID] [int] NULL ,
	[rowguid]  uniqueidentifier ROWGUIDCOL  NOT NULL 
) ON [PRIMARY]
GO

 CREATE  CLUSTERED  INDEX [index_ShippingCasesStatusPallet] ON [dbo].[ShippingCases]([CurrentSCStatus], [PalletID]) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ShippingCases] WITH NOCHECK ADD 
	CONSTRAINT [DF__ShippingC__rowgu__6BAEFA67] DEFAULT (newid()) FOR [rowguid],
	CONSTRAINT [PK_ShippingCases] PRIMARY KEY  NONCLUSTERED 
	(
		[ShippingCaseID]
	)  ON [PRIMARY] 
GO

 CREATE  UNIQUE  INDEX [index_254623950] ON [dbo].[ShippingCases]([rowguid]) ON [PRIMARY]
GO

 CREATE  INDEX [IX_Pallet] ON [dbo].[ShippingCases]([PalletID]) ON [PRIMARY]
GO

--Stock
CREATE TABLE [dbo].[Stock] (
	[LocationID] [varchar] (10) COLLATE Lithuanian_CI_AI NOT NULL ,
	[ProductCode] [varchar] (20) COLLATE Lithuanian_CI_AI NOT NULL ,
	[ShippingCaseID] [varchar] (40) COLLATE Lithuanian_CI_AI NOT NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Stock] WITH NOCHECK ADD 
	CONSTRAINT [Stock_PK] PRIMARY KEY  CLUSTERED 
	(
		[LocationID],
		[ShippingCaseID]
	)  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[Stock] ADD 
	CONSTRAINT [Locations_Stock_FK1] FOREIGN KEY 
	(
		[LocationID]
	) REFERENCES [dbo].[Locations] (
		[LocationID]
	)
GO







Кроме того план выполнения в текстовом виде

StmtText StmtId NodeId Parent PhysicalOp LogicalOp Argument DefinedValues EstimateRows EstimateIO EstimateCPU AvgRowSize TotalSubtreeCost OutputList Warnings Type Parallel EstimateExecutions
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ ------------------------------------------------------ -------- ------------------------------ -------- ------------------------

select Stock.ShippingcaseId,
(SELECT top 1 StickCode FROM FGTraceTest.dbo.ShippingCases AS ShippingCases (index = PK_ShippingCases) where ShippingCases.shippingcaseid = stock.shippingcaseid collate latin1_general_ci_as) as 'Stick'
from Stock
where Stock.LocationId = 'CNTMR' 1 1 0 NULL NULL 1 NULL 194.0 NULL NULL NULL 1102.6727 NULL NULL SELECT 0 NULL
|--Compute Scalar(DEFINE:([ShippingCases].[StickCode]=[ShippingCases].[StickCode])) 1 2 1 Compute Scalar Compute Scalar DEFINE:([ShippingCases].[StickCode]=[ShippingCases].[StickCode]) [ShippingCases].[StickCode]=[ShippingCases].[StickCode] 194.0 0.0 0.0000194 58 1102.6727 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([Stock].[ShippingCaseID])) 1 3 2 Nested Loops Left Outer Join OUTER REFERENCES:([Stock].[ShippingCaseID]) NULL 194.0 0.0 8.1092003E-4 118 1102.6727 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Clustered Index Seek(OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD) 1 4 3 Clustered Index Seek Clustered Index Seek OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD [Stock].[ShippingCaseID] 194.0 3.9441655E-3 2.92482E-4 111 4.2366479E-3 [Stock].[ShippingCaseID] NULL PLAN_ROW 0 1.0
|--Top(1) 1 5 3 Top Top NULL NULL 1.0 0.0 0.0000001 16 1102.6676 [ShippingCases].[StickCode] NULL PLAN_ROW 0 194.0
|--Bookmark Lookup(BOOKMARK:([Bmk1002]), OBJECT:([FGTraceTest].[dbo].[ShippingCases] AS [ShippingCases])) 1 7 5 Bookmark Lookup Bookmark Lookup BOOKMARK:([Bmk1002]), OBJECT:([FGTraceTest].[dbo].[ShippingCases] AS [ShippingCases]) [ShippingCases].[StickCode] 1.0 3.1249251E-3 0.0000011 202 1102.6676 [ShippingCases].[StickCode] NULL PLAN_ROW 0 194.0
|--Index Scan(OBJECT:([FGTraceTest].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), WHERE:(Convert([ShippingCases].[ShippingCaseID])=Convert([Stock].[ShippingCaseID]))) 1 8 7 Index Scan Index Scan OBJECT:([FGTraceTest].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), WHERE:(Convert([ShippingCases].[ShippingCaseID])=Convert([Stock].[ShippingCaseID])), FORCEDINDEX [Bmk1002], [ShippingCases].[ShippingCaseID] 1.0 5.1657267 0.57879949 130 1032.8347 [Bmk1002], [ShippingCases].[ShippingCaseID] NULL PLAN_ROW 0 194.0

(7 row(s) affected)



.



WiRuc
Как же разные? Смысл то один и тот же. Идея такая, что по отдельности из каждой таблицы выборка моментально проходит, когда делаешь JOIN, сканирует всю таблицу, не используя индексов.
Статистики обновил, стало вроде быстрее (около 30%), но все равно не то.
14 ноя 05, 10:49    [2065038]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Из-за разных collate столбцов ShippingCaseID сервер не может использовать IndexSeek. Т.к. индексное выражение не совпадает с критерием поиска по collate. А вычислять "новое" индексное выражение на лету сервер не умеет.
14 ноя 05, 11:01    [2065105]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
Glory
Из-за разных collate столбцов ShippingCaseID сервер не может использовать IndexSeek. Т.к. индексное выражение не совпадает с критерием поиска по collate. А вычислять "новое" индексное выражение на лету сервер не умеет.


Вы абсолютно правы,
Поменяв collation в таблице Stock все работает мгновенно.

Возникает 2-а вопроса:
1. Если способ решить эту проблему не меняя collation?
2. И как поменять collation на ДБ не создавая всего заново? Если способ поменять collation оn the fly?
14 ноя 05, 14:33    [2066291]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrew1411
Member

Откуда: Москва
Сообщений: 401
Andrej S.
2. И как поменять collation на ДБ не создавая всего заново? Если способ поменять collation оn the fly?


В ЕМ Managere меняеся для любого поля
14 ноя 05, 15:31    [2066510]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
ChA
Member

Откуда: Москва
Сообщений: 11126
Andrej S.
1. Если способ решить эту проблему не меняя collation?
Можно указывать collate при операции сравнения. Посмотрите collation coercion rules в BOL | Index...
14 ноя 05, 16:39    [2066836]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
ChA
Andrej S.
1. Если способ решить эту проблему не меняя collation?
Можно указывать collate при операции сравнения. Посмотрите collation coercion rules в BOL | Index...

Так и делаю, по другому не возьмешь данные из севера с другим collation.

where ShippingCases.shippingcaseid = stock.shippingcaseid collate latin1_general_ci_as
14 ноя 05, 16:51    [2066887]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
ChA
Member

Откуда: Москва
Сообщений: 11126
Andrej S.
Так и делаю, по другому не возьмешь данные из севера с другим collation.
Да, был невнимателен, но у Вас в плане есть нюанс
Andrej S.
|--Index Scan(OBJECT:([FGTraceTest].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), WHERE:(Convert([ShippingCases].[ShippingCaseID])=Convert([Stock].[ShippingCaseID])))
Аналогичная ситуация
CREATE TABLE A(n char(3) PRIMARY KEY)
CREATE TABLE B(n varchar(3) COLLATE Lithuanian_CI_AI PRIMARY KEY)
INSERT INTO A SELECT '01'
INSERT INTO B SELECT '01'
GO
SET SHOWPLAN_TEXT ON
GO
SELECT * FROM A INNER JOIN B ON (B.n = A.n COLLATE Lithuanian_CI_AI)
GO
SET SHOWPLAN_TEXT OFF
GO

DROP TABLE A, B
Получаем для
SELECT * FROM A INNER JOIN B ON (B.n = A.n COLLATE Lithuanian_CI_AI)

следующий план
-------------------------------------------------------------------------------------------------------------------------------
  |--Nested Loops(Inner Join, OUTER REFERENCES:([A].[n]))
       |--Clustered Index Scan(OBJECT:([master].[dbo].[A].[PK__A__0A695708]))
       |--Clustered Index Seek(OBJECT:([master].[dbo].[B].[PK__B__0C519F7A]), SEEK:([B].[n]=Convert([A].[n])) ORDERED FORWARD)
Операция Convert только с одной стороны. Поройтесь в этом направлении...
14 ноя 05, 18:38    [2067363]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
ChA
Поройтесь в этом направлении...

Порывшись в этом направлении, выяснилось, что.

Конвертирует с двух сторон и работает дооолго.
Используя:

on SC.ShippingCaseId = Stock.ShippingCaseId collate Latin1_General_CI_AS
StmtText                                                                                                                                                                                                                                                                StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                                                  DefinedValues                                            EstimateRows             EstimateIO               EstimateCPU              AvgRowSize  TotalSubtreeCost         OutputList                                             Warnings Type                           Parallel EstimateExecutions       
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ ------------------------------------------------------ -------- ------------------------------ -------- ------------------------

select Stock.ShippingcaseId,
(SELECT top 1 StickCode FROM FGTraceTest.dbo.ShippingCases AS ShippingCases where ShippingCases.shippingcaseid = stock.shippingcaseid collate Latin1_General_CI_AS ) as 'Stick'
from Stock
where Stock.LocationId = 'CNTMR' 3 1 0 NULL NULL 1 NULL 1.0 NULL NULL NULL 17.489105 NULL NULL SELECT 0 NULL
|--Compute Scalar(DEFINE:([ShippingCases].[StickCode]=[ShippingCases].[StickCode])) 3 2 1 Compute Scalar Compute Scalar DEFINE:([ShippingCases].[StickCode]=[ShippingCases].[StickCode]) [ShippingCases].[StickCode]=[ShippingCases].[StickCode] 1.0 0.0 0.0000001 58 17.489105 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([Stock].[ShippingCaseID])) 3 3 2 Nested Loops Left Outer Join OUTER REFERENCES:([Stock].[ShippingCaseID]) NULL 1.0 0.0 0.00001254 118 17.489105 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Clustered Index Seek(OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD) 3 4 3 Clustered Index Seek Clustered Index Seek OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD [Stock].[ShippingCaseID] 1.0 3.2034251E-3 7.9603E-5 111 3.283028E-3 [Stock].[ShippingCaseID] NULL PLAN_ROW 0 1.0
|--Top(1) 3 5 3 Top Top NULL NULL 1.0 0.0 0.0000001 16 17.485809 [ShippingCases].[StickCode] NULL PLAN_ROW 0 3.0
|--Bookmark Lookup(BOOKMARK:([Bmk1002]), OBJECT:([FGTraceTest].[dbo].[ShippingCases] AS [ShippingCases])) 3 7 5 Bookmark Lookup Bookmark Lookup BOOKMARK:([Bmk1002]), OBJECT:([FGTraceTest].[dbo].[ShippingCases] AS [ShippingCases]) [ShippingCases].[StickCode] 1.0 4.8826954E-5 0.0000011 202 17.485809 [ShippingCases].[StickCode] NULL PLAN_ROW 0 3.0
|--Index Scan(OBJECT:([FGTraceTest].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), WHERE:(Convert([ShippingCases].[ShippingCaseID])=Convert([Stock].[ShippingCaseID]))) 3 8 7 Index Scan Index Scan OBJECT:([FGTraceTest].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), WHERE:(Convert([ShippingCases].[ShippingCaseID])=Convert([Stock].[ShippingCaseID])) [Bmk1002], [ShippingCases].[ShippingCaseID] 1.0 5.1657267 0.57879949 130 16.409132 [Bmk1002], [ShippingCases].[ShippingCaseID] NULL PLAN_ROW 0 3.0

(7 row(s) affected)


.


Конвертирует с двух сторон и работает быыыстро.
Используя:

on SC.ShippingCaseId = Stock.ShippingCaseId collate SQL_Latin1_General_CP1257_CI_AS


StmtText StmtId NodeId Parent PhysicalOp LogicalOp Argument DefinedValues EstimateRows EstimateIO EstimateCPU AvgRowSize TotalSubtreeCost OutputList Warnings Type Parallel EstimateExecutions
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ ------------------------------------------------------ -------- ------------------------------ -------- ------------------------

select Stock.ShippingcaseId,
(SELECT top 1 StickCode FROM FGTraceTest.dbo.ShippingCases AS ShippingCases where ShippingCases.shippingcaseid = stock.shippingcaseid collate SQL_Latin1_General_CP1257_CI_AS ) as 'Stick'
from Stock
where Stock.LocationId = 'CNTMR' 4 1 0 NULL NULL 1 NULL 1.0 NULL NULL NULL 1.3354182E-2 NULL NULL SELECT 0 NULL
|--Compute Scalar(DEFINE:([ShippingCases].[StickCode]=[ShippingCases].[StickCode])) 4 2 1 Compute Scalar Compute Scalar DEFINE:([ShippingCases].[StickCode]=[ShippingCases].[StickCode]) [ShippingCases].[StickCode]=[ShippingCases].[StickCode] 1.0 0.0 0.0000001 58 1.3354182E-2 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([Stock].[ShippingCaseID])) 4 3 2 Nested Loops Left Outer Join OUTER REFERENCES:([Stock].[ShippingCaseID]) NULL 1.0 0.0 0.00001254 118 1.3354082E-2 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Clustered Index Seek(OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD) 4 4 3 Clustered Index Seek Clustered Index Seek OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD [Stock].[ShippingCaseID] 1.0 3.2034251E-3 7.9603E-5 111 3.283028E-3 [Stock].[ShippingCaseID] NULL PLAN_ROW 0 1.0
|--Top(1) 4 5 3 Top Top NULL NULL 1.0 0.0 0.0000001 16 1.0058514E-2 [ShippingCases].[StickCode] NULL PLAN_ROW 0 3.0
|--Bookmark Lookup(BOOKMARK:([Bmk1002]), OBJECT:([FGTraceTest].[dbo].[ShippingCases] AS [ShippingCases])) 4 7 5 Bookmark Lookup Bookmark Lookup BOOKMARK:([Bmk1002]), OBJECT:([FGTraceTest].[dbo].[ShippingCases] AS [ShippingCases]) [ShippingCases].[StickCode] 1.0 4.8826954E-5 0.0000011 202 1.0058214E-2 [ShippingCases].[StickCode] NULL PLAN_ROW 0 3.0
|--Index Seek(OBJECT:([FGTraceTest].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), SEEK:([ShippingCases].[ShippingCaseID]=Convert([Stock].[ShippingCaseID])) ORDERED FORWARD) 4 8 7 Index Seek Index Seek OBJECT:([FGTraceTest].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), SEEK:([ShippingCases].[ShippingCaseID]=Convert([Stock].[ShippingCaseID])) ORDERED FORWARD [Bmk1002] 1.0 3.2034251E-3 7.9603997E-5 130 6.6456618E-3 [Bmk1002] NULL PLAN_ROW 0 3.0

(7 row(s) affected)


15 ноя 05, 12:40    [2069669]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Второй как раз конвертирует только с одной стороны.
15 ноя 05, 12:45    [2069703]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
CORRECT: Конвертирует с одной стороны и работает быыыстро.
Sorry for copy/paste
15 ноя 05, 13:20    [2069940]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Единственное отличие пока вижу в том, что SQL_Latin1_General_CP1257_CI_AS это SQL коллэйт, а Lithuanian_CI_AI - windwos-кий

База с SQL_Latin1_General_CP1257_CI_AS создавалась с нуля или портировалась/апгрейдилась со старой версии SQL ?
15 ноя 05, 13:30    [2070006]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
Glory
Единственное отличие пока вижу в том, что SQL_Latin1_General_CP1257_CI_AS это SQL коллэйт, а Lithuanian_CI_AI - windwos-кий
База с SQL_Latin1_General_CP1257_CI_AS создавалась с нуля или портировалась/апгрейдилась со старой версии SQL ?


Обе базы на одном сервере. База SQL_Latin1_General_CP1257_CI_AS была мигрирована с SQL 7 (методом восстановления backup’a). По умолчанию на сервере стоит Lithuanian_CI_AI.
15 ноя 05, 14:02    [2070221]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrej S.
Glory
Единственное отличие пока вижу в том, что SQL_Latin1_General_CP1257_CI_AS это SQL коллэйт, а Lithuanian_CI_AI - windwos-кий
База с SQL_Latin1_General_CP1257_CI_AS создавалась с нуля или портировалась/апгрейдилась со старой версии SQL ?


Обе базы на одном сервере. База SQL_Latin1_General_CP1257_CI_AS была мигрирована с SQL 7 (методом восстановления backup’a). По умолчанию на сервере стоит Lithuanian_CI_AI.

А можете создать аналог мигрировавшей базы с SQL_Latin1_General_CP1257_CI_AS? Не всю конечно, а только вот эту таблицу.
16 ноя 05, 18:12    [2076034]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
Glory
А можете создать аналог мигрировавшей базы с SQL_Latin1_General_CP1257_CI_AS? Не всю конечно, а только вот эту таблицу.


Как это аналог? Не понял. Script table–> Create table -> Import data? Уточните пожалуйста.
16 ноя 05, 20:25    [2076376]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrej S.
Glory
А можете создать аналог мигрировавшей базы с SQL_Latin1_General_CP1257_CI_AS? Не всю конечно, а только вот эту таблицу.


Как это аналог? Не понял. Script table–> Create table -> Import data? Уточните пожалуйста.

- Создать новую базу скриптом/из ЕМ с коллэйт SQL_Latin1_General_CP1257_CI_AS.
- Создать в ней таблицу Stock скриптом из "старой" базы
- Закачать в таблицу Stock данные
- Проверить план запроса для "новой" базы
16 ноя 05, 20:44    [2076411]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

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

- Создать новую базу скриптом/из ЕМ с коллэйт SQL_Latin1_General_CP1257_CI_AS.
- Создать в ней таблицу Stock скриптом из "старой" базы
- Закачать в таблицу Stock данные
- Проверить план запроса для "новой" базы


Без проблем, толка чем это отличается от поменять колатион на узе существующей таблице Stock.
И если делать буквально так как вы сказали то Stock в новой базе SQL_Latin1_General_CP1257_CI_AS будет иметь Lithuanian_CI_AI.

CREATE TABLE [dbo].[Stock] (
	[LocationID] [varchar] (10) COLLATE Lithuanian_CI_AI NOT NULL ,
	[ProductCode] [varchar] (20) COLLATE Lithuanian_CI_AI NOT NULL ,
	[ShippingCaseID] [varchar] (40) COLLATE Lithuanian_CI_AI NOT NULL 
) ON [PRIMARY]
GO
16 ноя 05, 20:56    [2076434]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Без проблем, толка чем это отличается от поменять колатион на узе существующей таблице Stock.
Это отличается тем, что новая база не будет апгрейдженной со старой версии
16 ноя 05, 21:01    [2076442]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
Glory
- Создать новую базу скриптом/из ЕМ с коллэйт SQL_Latin1_General_CP1257_CI_AS.
- Создать в ней таблицу Stock скриптом из "старой" базы
- Закачать в таблицу Stock данные
- Проверить план запроса для "новой" базы


- Создал новую базу скриптом/из ЕМ с коллэйт SQL_Latin1_General_CP1257_CI_AS.
- Создал в ней таблицу ShippingCases скриптом из "старой" базы
- Закачал в таблицу ShippingCases данные

План запроса для "новой" базы:
Ничего не поменялось, конвертирует с двух сторон.
21 ноя 05, 15:49    [2090763]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Что-то у меня как раз не получается по-вашему. Все равно у меня Index Seek

use master
go
if db_id('testdb1') is not null drop database testdb1
go
if db_id('testdb2') is not null drop database testdb2
go

create database testdb1 collate SQL_Latin1_General_CP1257_CI_AS
go
create database testdb2 collate Lithuanian_CI_AI
go
use testdb1
go
CREATE TABLE A(n char(3)PRIMARY KEY )
INSERT INTO A SELECT '01'
go
use testdb2
go
CREATE TABLE B(n varchar(3) PRIMARY KEY)
INSERT INTO B SELECT '01'
go

use testdb1
go
SET SHOWPLAN_TEXT ON
GO
SELECT * FROM testdb1..A a INNER JOIN testdb2..B b ON (B.n = A.n COLLATE Lithuanian_CI_AI)
GO
SET SHOWPLAN_TEXT OFF
GO



use master
go
if db_id('testdb1') is not null drop database testdb1
go
if db_id('testdb2') is not null drop database testdb2
go
21 ноя 05, 20:02    [2091860]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Andrej S.
Member

Откуда: Lithuania
Сообщений: 45
Glory
Что-то у меня как раз не получается по-вашему. Все равно у меня

Что интересно, это работает быстро.
select  Stock.ShippingcaseId,
	max(StickCode)
from   Stock inner join FGTraceLite.dbo.ShippingCases ShippingCases
	on ShippingCases.shippingcaseid = stock.shippingcaseid collate Lithuanian_CI_AI -- SQL_Latin1_General_CP1257_CI_AS -- Lithuanian_CI_AI
where  Stock.LocationId = 'CNTMR'
group by Stock.ShippingcaseId


select Stock.ShippingcaseId,
max(StickCode)
from Stock inner join FGTraceLite.dbo.ShippingCases ShippingCases
on ShippingCases.shippingcaseid = stock.shippingcaseid collate Lithuanian_CI_AI -- SQL_Latin1_General_CP1257_CI_AS -- Lithuanian_CI_AI
where Stock.LocationId = 'CNTMR'
group by Stock.ShippingcaseId 5 1 0 NULL NULL 1 NULL 194.29166 NULL NULL NULL 12.190974 NULL NULL SELECT 0 NULL
|--Stream Aggregate(GROUP BY:([Stock].[ShippingCaseID]) DEFINE:([Expr1003]=MAX([ShippingCases].[StickCode]))) 5 2 1 Stream Aggregate Aggregate GROUP BY:([Stock].[ShippingCaseID]) [Expr1003]=MAX([ShippingCases].[StickCode]) 194.29166 0.0 1.4474728E-3 58 12.190974 [Stock].[ShippingCaseID], [Expr1003] NULL PLAN_ROW 0 1.0
|--Sort(ORDER BY:([Stock].[ShippingCaseID] ASC)) 5 3 2 Sort Sort ORDER BY:([Stock].[ShippingCaseID] ASC) NULL 194.29166 1.1261261E-2 2.4042104E-3 58 12.189527 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Hash Match(Inner Join, HASH:([Stock].[ShippingCaseID])=([Expr1005]), RESIDUAL:([Expr1005]=[Stock].[ShippingCaseID])) 5 4 3 Hash Match Inner Join HASH:([Stock].[ShippingCaseID])=([Expr1005]), RESIDUAL:([Expr1005]=[Stock].[ShippingCaseID]) NULL 194.29166 0.0 3.4605417 58 12.175861 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Clustered Index Seek(OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD) 5 5 4 Clustered Index Seek Clustered Index Seek OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD [Stock].[ShippingCaseID] 194.29166 6.1663878E-3 2.9280368E-4 111 6.4591914E-3 [Stock].[ShippingCaseID] NULL PLAN_ROW 0 1.0
|--Compute Scalar(DEFINE:([Expr1005]=Convert([ShippingCases].[ShippingCaseID]))) 5 6 4 Compute Scalar Compute Scalar DEFINE:([Expr1005]=Convert([ShippingCases].[ShippingCaseID])) [Expr1005]=Convert([ShippingCases].[ShippingCaseID]) 526000.0 0.0 0.0526 56 8.7088566 [ShippingCases].[StickCode], [Expr1005] NULL PLAN_ROW 0 1.0
|--Clustered Index Scan(OBJECT:([FGTraceLite].[dbo].[ShippingCases].[index_ShippingCasesStatusPallet] AS [ShippingCases])) 5 7 6 Clustered Index Scan Clustered Index Scan OBJECT:([FGTraceLite].[dbo].[ShippingCases].[index_ShippingCasesStatusPallet] AS [ShippingCases]) [ShippingCases].[ShippingCaseID], [ShippingCases].[StickCode] 526000.0 8.0775785 0.57867849 153 8.6562567 [ShippingCases].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0



Это долго.

select  Stock.ShippingcaseId,
	(SELECT  top 1 StickCode FROM FGTraceLite.dbo.ShippingCases  AS ShippingCases  where ShippingCases.shippingcaseid = stock.shippingcaseid collate  Lithuanian_CI_AI ) as 'Stick'
from   Stock 
where  Stock.LocationId = 'CNTMR'


select  Stock.ShippingcaseId,
(SELECT top 1 StickCode FROM FGTraceLite.dbo.ShippingCases AS ShippingCases where ShippingCases.shippingcaseid = stock.shippingcaseid collate Lithuanian_CI_AI ) as 'Stick'
from Stock
where Stock.LocationId = 'CNTMR' 6 1 0 NULL NULL 1 NULL 194.29166 NULL NULL NULL 1020.8016 NULL NULL SELECT 0 NULL
|--Compute Scalar(DEFINE:([ShippingCases].[StickCode]=[ShippingCases].[StickCode])) 6 2 1 Compute Scalar Compute Scalar DEFINE:([ShippingCases].[StickCode]=[ShippingCases].[StickCode]) [ShippingCases].[StickCode]=[ShippingCases].[StickCode] 194.29166 0.0 1.9429166E-5 58 1020.8016 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([Stock].[ShippingCaseID])) 6 3 2 Nested Loops Left Outer Join OUTER REFERENCES:([Stock].[ShippingCaseID]) NULL 194.29166 0.0 8.1213913E-4 118 1020.8016 [Stock].[ShippingCaseID], [ShippingCases].[StickCode] NULL PLAN_ROW 0 1.0
|--Clustered Index Seek(OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD) 6 4 3 Clustered Index Seek Clustered Index Seek OBJECT:([FGTRemoteTest].[dbo].[Stock].[Stock_PK]), SEEK:([Stock].[LocationID]='CNTMR') ORDERED FORWARD [Stock].[ShippingCaseID] 194.29166 6.1663878E-3 2.9280368E-4 111 6.4591914E-3 [Stock].[ShippingCaseID] NULL PLAN_ROW 0 1.0
|--Top(1) 6 5 3 Top Top NULL NULL 1.0 0.0 0.0000001 16 1020.7943 [ShippingCases].[StickCode] NULL PLAN_ROW 0 194.29166
|--Bookmark Lookup(BOOKMARK:([Bmk1002]), OBJECT:([FGTraceLite].[dbo].[ShippingCases] AS [ShippingCases])) 6 7 5 Bookmark Lookup Bookmark Lookup BOOKMARK:([Bmk1002]), OBJECT:([FGTraceLite].[dbo].[ShippingCases] AS [ShippingCases]) [ShippingCases].[StickCode] 1.0 3.1249251E-3 0.0000011 153 1020.7943 [ShippingCases].[StickCode] NULL PLAN_ROW 0 194.29166
|--Index Scan(OBJECT:([FGTraceLite].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), WHERE:(Convert([ShippingCases].[ShippingCaseID])=[Stock].[ShippingCaseID])) 6 8 7 Index Scan Index Scan OBJECT:([FGTraceLite].[dbo].[ShippingCases].[PK_ShippingCases] AS [ShippingCases]), WHERE:(Convert([ShippingCases].[ShippingCaseID])=[Stock].[ShippingCaseID]) [Bmk1002], [ShippingCases].[ShippingCaseID] 1.0 4.7331343 0.57867849 130 961.09125 [Bmk1002], [ShippingCases].[ShippingCaseID] NULL PLAN_ROW 0 194.29166

(7 row(s) affected)
22 ноя 05, 16:47    [2095955]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует индексы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Я вообще-то свой скрипт имел ввиду
22 ноя 05, 19:57    [2096785]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить