|
Чудеса с индексами. | ☑ | ||
---|---|---|---|---|
0
H A D G E H O G s
22.03.13
✎
16:15
|
День добрый.
Прошу подтвердить ошибку платформы. Запрос вида: ВЫБРАТЬ МИНИМУМ(Справочник.Данное) КАК Данное ИЗ Справочник.Справочник КАК Справочник ГДЕ Справочник.Данное > 4.6 При условиях: Справочник.Данное - тип Число (5.0), индексированное для данных 1,2,3,4,5,6,7,8.... вернет 6 вместо 5. 8.2.17.169, но думаю, воспроизведется на всех 8.2 dt-шничег http://zalil.ru/34371432 |
|||
1
Фрагстер
22.03.13
✎
16:16
|
(0) там неявный каст происходит
|
|||
2
Фрагстер
22.03.13
✎
16:17
|
Выразить(Справочник.Данное КАК Число(6,1)) > 4.6
|
|||
3
H A D G E H O G s
22.03.13
✎
16:17
|
Казалось бы херня, но эта херня выела мне мозг при расчетах по спирту.
|
|||
4
Фрагстер
22.03.13
✎
16:17
|
и дело даже не в том, что оно индексированное, а что приводится правое к левому, а не наоборот
|
|||
5
Фрагстер
22.03.13
✎
16:18
|
(3) мне выело мозг то, что для дробных точность 6 ставится, если напрямую не сказать больше...
|
|||
6
H A D G E H O G s
22.03.13
✎
16:18
|
(2) Это то понятно, не понятно (0).
|
|||
7
H A D G E H O G s
22.03.13
✎
16:18
|
(4) Почему, когда не индексированное - ничего такого нет?
|
|||
8
Фрагстер
22.03.13
✎
16:19
|
попробуй 4.6 < Справочник.Данное
|
|||
9
sapphire
22.03.13
✎
16:19
|
(0) Автор, подтверждаю, что у тебя ошибка в ... ДНК.
Справочник.Данное > 4.6 При условиях: Справочник.Данное - тип Число (5.0), индексированное, Будет равносильно Справочник.Данное >5 Учи матчасть :) |
|||
10
H A D G E H O G s
22.03.13
✎
16:21
|
(9) Специально для таких мозгоклюев не сказал, что под SQL все нормально.
|
|||
11
H A D G E H O G s
22.03.13
✎
16:21
|
(8) Тоже самое.
|
|||
12
Фрагстер
22.03.13
✎
16:21
|
(10) пиши в 1с, пусть правят
|
|||
13
sapphire
22.03.13
✎
16:23
|
(10) Не имеет значения где именно. Это не ошибка самой 1С и индексы тут вообще не при делах.
|
|||
14
H A D G E H O G s
22.03.13
✎
16:23
|
(12) Выразить(Справочник.Данное как Число(6,1))>4.7
Вполне меня удовлетворит. |
|||
15
H A D G E H O G s
22.03.13
✎
16:23
|
(13) Расскажи об этом SQL-ю.
|
|||
16
Фрагстер
22.03.13
✎
16:24
|
(14) только вот индекс тогда не работает
|
|||
17
H A D G E H O G s
22.03.13
✎
16:25
|
(16) гхм....
|
|||
18
H A D G E H O G s
22.03.13
✎
16:25
|
Индексы там нужны, там у нас большая табличка то.
|
|||
19
sapphire
22.03.13
✎
16:26
|
(15) При чем здесь SQL?
Ты со своими мозгами разберись сначала. Ты сравниваешь числа разной точности и утверждаешь, что виноваты индексы. |
|||
20
H A D G E H O G s
22.03.13
✎
16:26
|
2 запроса штоле, под файловую - с Выразить, под SQL - без выразить. Файловая то для отладки нужна так то.
|
|||
21
sapphire
22.03.13
✎
16:27
|
(20) Да там вообще неважно какая база, а важно как правильно написать запрос, ИМХО.
|
|||
22
trad
22.03.13
✎
16:27
|
||||
23
H A D G E H O G s
22.03.13
✎
16:28
|
(19) Ты dtшнег скачал хоть?
|
|||
24
sapphire
22.03.13
✎
16:30
|
(22) Потому что в 1С на SQL поедет иная конструкция.
|
|||
25
sapphire
22.03.13
✎
16:32
|
(23) Ну скачал и что? И что это меняет?
|
|||
26
sapphire
22.03.13
✎
16:33
|
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ | МИНИМУМ(Справочник.Данное) КАК Данное |ИЗ | Справочник.Справочник КАК Справочник |ГДЕ | 1.0000000000000000000000*Справочник.Данное > 4.6"; Выборка=Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Сообщить("Минимум справочника >4.6 равен "+Выборка.Данное); КонецЕсли; |
|||
27
trad
22.03.13
✎
16:33
|
пофиг что куда поедет.
Ты сказал, что у тех у кого ДНК в норме, кто дружит с мозгами и знает матчасть, Выражение (Данное > 4.6) равносильно выражению (Данное > 5), если Данное - не дробного типа. Так ведь? Так вот, например, mssql с тобой не согласен. |
|||
28
trad
22.03.13
✎
16:34
|
(27) к (24)
|
|||
29
H A D G E H O G s
22.03.13
✎
16:34
|
||||
30
sapphire
22.03.13
✎
16:35
|
(27) Речь об 1С, а не о SQL
|
|||
31
H A D G E H O G s
22.03.13
✎
16:35
|
Кстати, Выразить() вполне себе Индекс использует
|
|||
32
H A D G E H O G s
22.03.13
✎
16:37
|
Но за решение
1.0*Справочник.Данное спасибо. Тоже польза от тебя есть. |
|||
33
sapphire
22.03.13
✎
16:38
|
(29) SQL и файловая 1С по-разному приводят числа к одинаковой точности.
|
|||
34
sapphire
22.03.13
✎
16:38
|
(32) Решение старо, как мир :)
|
|||
35
К_Дач
22.03.13
✎
16:39
|
(32) ты же знаешь, что в запрос например в качестве параметра не рекомендуется передавать таблицу значений, колонка которой не типизирована заранее? здесь тоже самое. а 1.0*переменная - это и есть явная типизация к типу Real
|
|||
36
H A D G E H O G s
22.03.13
✎
16:39
|
(33) Файловая по запросу к индексному полю и файловая по запросу к безындексному полю по разному приводят числа к одинаковой точности.
|
|||
37
H A D G E H O G s
22.03.13
✎
16:40
|
(35) Какое не рекомендуется?! 1С пошлет к херам нетипизированную таблицу и все будет хорошо.
|
|||
38
К_Дач
22.03.13
✎
16:41
|
ты сравниваешь в запросе два числа различного типа, вот я к чему
|
|||
39
trad
22.03.13
✎
16:42
|
(30) осталось понять чья матчасть правильная (1c vs sql) и стоит ли посылать учить неправильную
|
|||
40
sapphire
22.03.13
✎
16:43
|
(39) Нужно учить ту матчасть кою используешь.
Если в 1С, то 1С, если в SQL, то в sql |
|||
41
H A D G E H O G s
22.03.13
✎
16:44
|
(40) 1С придется учить 2-х типов - для индексного поля - Цел(), для не индексного - Окр(). Ага.
|
|||
42
sapphire
22.03.13
✎
16:49
|
(41) Сорьки, поигрался с индексацией, выспылил, был не прав :))))
|
|||
43
sapphire
22.03.13
✎
16:49
|
а ведь фича.
|
|||
44
trad
22.03.13
✎
16:49
|
(40) так почему матчасть зависит от того проиндексировано поле или нет?
|
|||
45
К_Дач
22.03.13
✎
16:49
|
(41) то есть ты утвержадешь, что индексирование числового реквезита (поля) в 1С преобразует его тип? То есть 5 ---> 5.000 ?
|
|||
46
trad
22.03.13
✎
16:50
|
(43) вот именно -баг
|
|||
47
Hmster
22.03.13
✎
16:50
|
ВЫБРАТЬ
ВЫРАЗИТЬ(4 КАК ЧИСЛО(2,1)) КАК Данное ПОМЕСТИТЬ Справочник_Справочник ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ИНДЕКСИРОВАТЬ ПО Данное ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МИНИМУМ(Справочник.Данное) КАК Данное ИЗ Справочник_Справочник КАК Справочник ГДЕ Справочник.Данное > 4.6 |
|||
48
H A D G E H O G s
22.03.13
✎
16:51
|
(42) "Я ... и закурил."
|
|||
49
Hmster
22.03.13
✎
16:51
|
для тех кому грузить лень.
попробуйте поменять 1 на 0 |
|||
50
sapphire
22.03.13
✎
16:52
|
кстати, проверял на 8.3 - таже хрень.
|
|||
51
Serginio1
22.03.13
✎
16:52
|
Скорее всего в файловом варианте (4.6) округляется до 5 ти.
В SQL по другому. |
|||
52
sapphire
22.03.13
✎
16:53
|
(44) Видимо, строение индекса в файловой версии влияет.
|
|||
53
Ёпрст
22.03.13
✎
16:53
|
(47)
5 |
|||
54
Hmster
22.03.13
✎
16:53
|
8.2.15 та же фигня
|
|||
55
Ёпрст
22.03.13
✎
16:53
|
на скуле в 8.1
в 8.2 ща посмотрю |
|||
56
Serginio1
22.03.13
✎
16:53
|
Попробуй
Справочник.Данное >= 4.6 |
|||
57
sapphire
22.03.13
✎
16:53
|
(51) Нет, SDBL одинаковый.
|
|||
58
Hmster
22.03.13
✎
16:53
|
(53) в файловой? 1 на 0 менял?
|
|||
59
H A D G E H O G s
22.03.13
✎
16:53
|
(49) Там загвоздка в
ИНДЕКСИРОВАТЬ ПО Данное |
|||
60
H A D G E H O G s
22.03.13
✎
16:54
|
(56) Будет 5 и это логично, и это мне не надо.
|
|||
61
Hmster
22.03.13
✎
16:55
|
да если ее убрать ли через выразить указать что дробное
|
|||
62
Serginio1
22.03.13
✎
16:56
|
Вернее что выдает Справочник.Данное = 4.6
|
|||
63
Serginio1
22.03.13
✎
16:57
|
(62) в SQL и файловом варианте?
|
|||
64
Classic
22.03.13
✎
16:57
|
(32)
Чем это лучше ВЫРАЗИТЬ? |
|||
65
К_Дач
22.03.13
✎
16:57
|
Да, реально, если закомментить ИНДЕКСИРОВАТЬ ПО
Данное - результат меняется... всегда в запросе пользоваться 1.0000 * Данное - к себе в мемориз... |
|||
66
Serginio1
22.03.13
✎
16:58
|
а по индексу она ищет, так как в поиск в функцию сравнению нужно и передавать нужный тип.
|
|||
67
МихаилМ
22.03.13
✎
17:01
|
после 13 релиза 1с в ms sql намного меньше стало использовать
CAST. так что подобные проблемы возможны. раньше в CAST было обрамлено буквально все. приходилось чистить код. |
|||
68
trad
22.03.13
✎
17:06
|
(57) тем не менее баг проявляется на файловом варианте, на серверном (с mssql) - нет
|
|||
69
mikecool
22.03.13
✎
17:09
|
(10)а в разных скулях - отличается?
|
|||
70
H A D G E H O G s
22.03.13
✎
17:15
|
(69) Вот я еще разные Скули не ставил.
|
|||
71
Serginio1
22.03.13
✎
17:24
|
(32) Если данное будет 4.99 то не спасет.
тогда 1.000000000000000000000000..... На все случаи жизни |
|||
72
Serginio1
22.03.13
✎
17:35
|
Кстати по приведению типа в SQL
http://technet.microsoft.com/ru-ru/library/ms187928.aspx Например, результатом следующего преобразования будет 10: SELECT CAST(10.6496 AS int); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |