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

Откуда: Брест, Белоруссия
Сообщений: 27
Есть селект:

select 	jOper.OperationDate,
        	jOper.SysDate,
        	jOper.OperationID,
        	jOpChain.OperationChainID,
        	jOper.Number,
        	ot.OperName 
     	
			
    from	
    		Z_JOperation jOper(index JOperationDateInd),
    		OperationType ot (index PK_OPERATIONTYPE)
    where
		
                ot.ContractType = jOper.ContractType and
    		ot.OperationType = jOper.OperationType and
    		(@IsShowAll = 1 or
    			exists (select 1 from Z_JTransaction (index IND_OperID) where OperationID = jOper.OperationID) or
    			ot.IsAlwaysInJournal = 1)        


Чем можно заменить exists? Ну никак нельзя его использовать, а в голову ничего умнее exists не приходит :(
28 ноя 11, 11:35    [11669458]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
ninchik
Чем можно заменить exists? Ну никак нельзя его использовать
Почему нельзя? Можно!
28 ноя 11, 11:38    [11669482]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
ninchik
Member

Откуда: Брест, Белоруссия
Сообщений: 27
Паганель, потому что нельзя! Z_JTransaction - это прокси таблица, которая ссылается на другой сервер и для оптимизатора то, что хранится на другом конце - черный ящик. Сначала выполняется основной запрос, а затем каждой строчке результата выполняется exists, что, естественно, гигантски увеличивает время выполнения запроса. Поэтому и нельзя использовать:(. а нужно как-то выкручиваться
28 ноя 11, 11:46    [11669527]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Перед выполнением запроса сохраните в табличную переменную результат этого
select distinct OperationID from Z_JTransaction
28 ноя 11, 11:49    [11669550]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
ninchik
Member

Откуда: Брест, Белоруссия
Сообщений: 27
Паганель
Перед выполнением запроса сохраните в табличную переменную результат этого
select distinct OperationID from Z_JTransaction


Невозможно, потому что Z_JTransaction одна из самых топовых таблиц, размер около 800 млн. записей
28 ноя 11, 11:54    [11669597]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
А индекс IND_OperID не поможет?
28 ноя 11, 11:58    [11669632]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
ninchik
Member

Откуда: Брест, Белоруссия
Сообщений: 27
Паганель
А индекс IND_OperID не поможет?

К сожалению, нет :( . Если не найдется более изящного приёма буду использовать union

select 	jOper.OperationDate,
        	jOper.SysDate,
        	jOper.OperationID,
        	jOpChain.OperationChainID,
        	jOper.Number,
        	ot.OperName 
	
    from	
    		Z_JOperation jOper(index JOperationDateInd),
    		OperationType ot (index PK_OPERATIONTYPE)
    where
		
                ot.ContractType = jOper.ContractType and
    		ot.OperationType = jOper.OperationType and
    		(@IsShowAll = 1 or ot.IsAlwaysInJournal = 1)      

union 

select 	jOper.OperationDate,
        	jOper.SysDate,
        	jOper.OperationID,
        	jOpChain.OperationChainID,
        	jOper.Number,
        	ot.OperName 
     	
			
    from	
    		Z_JOperation jOper(index JOperationDateInd),
    		OperationType ot (index PK_OPERATIONTYPE),
                Z_JTransaction  jtr (index IND_OperID)
    where
		
                ot.ContractType = jOper.ContractType and
    		ot.OperationType = jOper.OperationType and
                jtr.OperationID = jOper.OperationID
 
28 ноя 11, 12:07    [11669706]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
Glory
Member

Откуда:
Сообщений: 104751
ninchik
Невозможно, потому что Z_JTransaction одна из самых топовых таблиц, размер около 800 млн. записей

Пишите триггер, который при изменении Z_JTransaction будет обновлять признак в таблице Z_JOperation
28 ноя 11, 12:08    [11669722]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
ninchik
Паганель
А индекс IND_OperID не поможет?

К сожалению, нет :( . Если не найдется более изящного приёма буду использовать union

select 	jOper.OperationDate,
        	jOper.SysDate,
        	jOper.OperationID,
        	jOpChain.OperationChainID,
        	jOper.Number,
        	ot.OperName 
     	
			
    from	
    		Z_JOperation jOper(index JOperationDateInd),
    		OperationType ot (index PK_OPERATIONTYPE),
                Z_JTransaction  jtr (index IND_OperID)
    where
		
                ot.ContractType = jOper.ContractType and
    		ot.OperationType = jOper.OperationType and
                jtr.OperationID = jOper.OperationID
 



А что толку-то? Думаешь, так твоя удалённая таблица читаться не будет ?
28 ноя 11, 13:15    [11670352]     Ответить | Цитировать Сообщить модератору
 Re: Чем заменить exists  [new]
trew
Member

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

У Вас какая версия сервера?
Для ms sql 2008 можно создавать индексы с условием IsAlwaysInJournal = 1
28 ноя 11, 13:22    [11670425]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить