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

Откуда: Москва
Сообщений: 5645
будет притормаживать запрос.


для спящего время бодрствования равносильно сну
24 авг 04, 12:09    [903485]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А попробуй все-таки в запросе поменять условия, написать где-то так
Where iddocdef = 91 and (DATE_TIME_IDDOC>'20030801' And DATE_TIME_IDDOC<'20040825')
And ( SP299=' 2 ' 
OR 
(Right(SP1403,9)=' 2 ' And dbo.From36To10(Left(SP1403,4))=Convert(int,14)) )
order by date_time_iddoc
А то такое впечатление, что оптимизатор раком поставлен.
24 авг 04, 12:20    [903528]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Упс... А сколько строк вернет запрос вот при таком условии?
Where iddocdef = 91 and (DATE_TIME_IDDOC>'20030801' And DATE_TIME_IDDOC<'20040825')
24 авг 04, 12:22    [903538]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
tpg
А попробуй все-таки в запросе поменять условия, написать где-то так
Where iddocdef = 91 and (DATE_TIME_IDDOC>'20030801' And DATE_TIME_IDDOC<'20040825')
And ( SP299=' 2 ' 
OR 
(Right(SP1403,9)=' 2 ' And dbo.From36To10(Left(SP1403,4))=Convert(int,14)) )
order by date_time_iddoc
А то такое впечатление, что оптимизатор раком поставлен.

При таком коде все равно происходит clustered index scan. seek по iddocdef и date_time_iddoc работает только при явном указании индекса DOCTYPE
24 авг 04, 12:34    [903597]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
tpg
Упс... А сколько строк вернет запрос вот при таком условии?
Where iddocdef = 91 and (DATE_TIME_IDDOC>'20030801' And DATE_TIME_IDDOC<'20040825')

Порядка 57000
24 авг 04, 12:35    [903603]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А при упрощенном условии все-таки сколько строк вернется?
24 авг 04, 12:36    [903605]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
А при упрощенном условии все-таки сколько строк вернется?

Повторюсь: 57000.
24 авг 04, 12:51    [903670]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
я понимаю что или лень... или вы не слышали меня (или не хотите), или секрет большой тех функция, но вот вам простой пример:
declare @d datetime
set @d = getdate()
select str(s1.id) from sysobjects s1, sysobjects s2
print datediff(ms, @d, getdate())
go
create function dbo.a (@id int)
returns varchar(10)
as begin
 return str(@id)
end
go
declare @d datetime
set @d = getdate()
select dbo.a(s1.id) from sysobjects s1, sysobjects s2
print datediff(ms, @d, getdate())
go
drop function dbo.a


для спящего время бодрствования равносильно сну
24 авг 04, 12:55    [903688]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
redcossack
А при упрощенном условии все-таки сколько строк вернется?

Повторюсь: 57000.
А план такого запроса можно увидеть?
24 авг 04, 12:58    [903697]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
Алексей2003
я понимаю что или лень... или вы не слышали меня (или не хотите), или секрет большой тех функция, но вот вам простой пример:

CREATE FUNCTION dbo.GetTime (@param int)  
RETURNS varchar(8) AS  
BEGIN 
	DECLARE @rez varchar(8), @hour int, @min int, @sec int, @prom int
	Set @prom=@param/10000
	Set @hour=FLOOR(@prom/3600)
	Set @prom=(@prom-(@hour*3600))
	Set @min=FLOOR(@prom/60)
	Set @sec=ROUND(@prom-(@min*60),0)
	Set @rez=RIGHT('0'+Convert(varchar,@hour),2)+':'+RIGHT('0'+Convert(varchar,@min),2)+':'+RIGHT('0'+Convert(varchar,@sec),2)
	Return @rez    
END
Скажите, как подобное можно загнать в запрос, особенно если данные используются во многих запросах?
24 авг 04, 13:13    [903791]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
tpg
А план такого запроса можно увидеть?

  |--Sort(ORDER BY:([_1SJOURN].[DATE_TIME_IDDOC] ASC))
       |--Compute Scalar(DEFINE:([Expr1002]=If ([_1SJOURN].[CLOSED]=5 OR [_1SJOURN].[CLOSED]=1) then 1 else If (Convert([_1SJOURN].[ISMARK])=1) then 3 else 2, [Expr1003]=Convert(Convert(substring(Convert([_1SJOURN].[DATE_TIME_IDDOC]), 1, 8))), [Expr1004]=[
            |--Clustered Index Scan(OBJECT:([local_sklad].[dbo].[_1SJOURN].[PK__1SJOURN]), WHERE:(([_1SJOURN].[IDDOCDEF]=91 AND [_1SJOURN].[DATE_TIME_IDDOC]>'20030801') AND [_1SJOURN].[DATE_TIME_IDDOC]<'20040825'))

24 авг 04, 13:17    [903813]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
redcossack
Алексей2003
я понимаю что или лень... или вы не слышали меня (или не хотите), или секрет большой тех функция, но вот вам простой пример:

CREATE FUNCTION dbo.GetTime (@param int)  
RETURNS varchar(8) AS  
BEGIN 
	DECLARE @rez varchar(8), @hour int, @min int, @sec int, @prom int
	Set @prom=@param/10000
	Set @hour=FLOOR(@prom/3600)
	Set @prom=(@prom-(@hour*3600))
	Set @min=FLOOR(@prom/60)
	Set @sec=ROUND(@prom-(@min*60),0)
	Set @rez=RIGHT('0'+Convert(varchar,@hour),2)+':'+RIGHT('0'+Convert(varchar,@min),2)+':'+RIGHT('0'+Convert(varchar,@sec),2)
	Return @rez    
END
Скажите, как подобное можно загнать в запрос, особенно если данные используются во многих запросах?
Думаю, что не так уж и сложно... А какой тип (а самое главное - какой вид) данных в колонке DATE_TIME_IDDOC?
24 авг 04, 13:18    [903819]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
tpg
А какой тип (а самое главное - какой вид) данных в колонке DATE_TIME_IDDOC?


CHAR(23)
24 авг 04, 13:21    [903841]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
чтото я исследовать не могу... нагрузка большая... вот
set nocount on
declare @i int, @d datetime, @i2 int, @s varchar(8)
select @i = 0, @d = getdate(), @i2 = 36620000
while @i < 3000 begin
 set @i = @i + 1
 select @s = RIGHT('0'+Convert(varchar,FLOOR(@i2/36000000)),2)
   +':'+RIGHT('0'+Convert(varchar,FLOOR(@i2/600000) % 60),2)
   +':'+RIGHT('0'+Convert(varchar,FLOOR(@i2/10000) % 60),2)
 print @s
end
select datediff(ms, @d, getdate())
set nocount off

go

set nocount on
declare @i int, @d datetime, @s varchar(8), @i2 int
select @i = 0, @d = getdate(), @i2 = 36620000
while @i < 3000 begin
 set @i = @i + 1
 select @s = dbo.gettime(@i2)
 print @s
end
select datediff(ms, @d, getdate())
set nocount off

для спящего время бодрствования равносильно сну
24 авг 04, 13:35    [903915]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а другая функция какая?


для спящего время бодрствования равносильно сну
24 авг 04, 13:42    [903948]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
Алексей2003
а другая функция какая?

Прошу не ругаться:
CREATE FUNCTION dbo.From36To10 (@param varchar(9))  
RETURNS int AS  
BEGIN 
	DECLARE @prom varchar(6), @rez int, @char varchar(1), @poz int, @num int, @len int
	Set @prom=LTRIM(RTRIM(@param))
	Set @rez=0
             Set @poz=Len(@prom)
	Set @len=Len(@prom)
	Set @char=substring(@prom,@poz,1)
             While @poz>0 
	Begin
		Set @num=Case
		When @char='0' Then 0
		When @char='1' Then 1
		When @char='2' Then 2
		When @char='3' Then 3
		When @char='4' Then 4
		When @char='5' Then 5
		When @char='6' Then 6
		When @char='7' Then 7
		When @char='8' Then 8
		When @char='9' Then 9
		When @char='A' Then 10
		When @char='B' Then 11
		When @char='C' Then 12
		When @char='D' Then 13
		When @char='E' Then 14
		When @char='F' Then 15
		When @char='G' Then 16
		When @char='H' Then 17
		When @char='I' Then 18
		When @char='J' Then 19
		When @char='K' Then 20
		When @char='L' Then 21
		When @char='M' Then 22
		When @char='N' Then 23
		When @char='O' Then 24
		When @char='P' Then 25
		When @char='Q' Then 26
		When @char='R' Then 27
		When @char='S' Then 28
		When @char='T' Then 29
		When @char='U' Then 30
		When @char='V' Then 31
		When @char='W' Then 32
		When @char='X' Then 33
		When @char='Y' Then 34
		When @char='Z' Then 35
		End
		Set @rez=@rez+@num* power(36,@len-@poz) 
	             Set @poz=@poz-1
		Set @char=substring(@prom,@poz,1)
	End
	Return @rez
END







24 авг 04, 13:45    [903961]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а если сделать денормализацию и добавить колонку в которой уже будет вычисленно это значение по триггеру? нельзя?


для спящего время бодрствования равносильно сну
24 авг 04, 14:00    [904057]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
Идея достойная рассмотрения, хотя вряд ли она будет реализована.
24 авг 04, 14:13    [904116]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
redcossack
Идея достойная рассмотрения, хотя вряд ли она будет реализована.
Кстати, а почему не создать вычисляемые колонки? По ним можно индекс составлять (если с триггером напряжно).
24 авг 04, 14:22    [904151]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
Напряжно не триггером, а с добавлением в таблицу новых поле. Подскажите, пожалуйста, что такое "вычисляемые колонки".
24 авг 04, 14:35    [904219]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
создайте новую таблицу и один к одному джоините... с калстерным индексом, все быстрее...


для спящего время бодрствования равносильно сну
24 авг 04, 14:56    [904341]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
redcossack
Подскажите, пожалуйста, что такое "вычисляемые колонки".

create table #t(a1 int, a2 int, a3 as a1 + a2)
insert #t(a1, a2) values(5, 7)
select * from #t
drop table #t
24 авг 04, 14:56    [904344]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
СПАСИБО
24 авг 04, 15:05    [904386]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
www.perlscript.ru
Member

Откуда: Москва
Сообщений: 344
Я так понимаю - если функции уберешь - будет нормальный индекс DOCTYPE использоваться. Во всяком случае вторая функция может быть вычислена в 1С до начала запроса!
And dbo.From36To10(Left(SP1403,4))=Convert(int,14)

Идет проверка на фиксированное число. Может лучше число 14 преобразоваять в 36-ричную систему, и тогда условие будет
...
...
|And Left(SP1403,4)="+Мое36ричноеЗначение+"";
24 авг 04, 15:55    [904629]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Where  [new]
redcossack
Member

Откуда: Москва
Сообщений: 147
Да, пожалуй
24 авг 04, 16:05    [904674]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить