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

Откуда:
Сообщений: 1389
Здравствуйте, скажите пожалуйста, целесообразно ли делать соединение таблиц по типу datetime,
может лучше сначала преобразовать во что-нибудь, например в int, если в int преобразовать,
то это поможет чётко идентифицировать строку, по которой будет происходить join?
к примеру вот такой вот код:
select * 
    from t1 t1
        join t2 t2
            on convert (int,t1.date)=convert (int,t2.date)
6 окт 16, 09:27    [19749088]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
o-o
Guest
че-то я не понимаю, зачем преобразовывать?
хоть какой-то в этом смысл может быть?
ну еще ладно преобразовать, допустим, к чару формата 112,
когда в одной таблице дата и время, во второй только дата,
у обоих DATETIME, а типа DATE еще нет (2000-ый сервер)
но вот просто так взять и преобразовать, ЗАЧЕМ???
6 окт 16, 10:02    [19749212]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
baza906
Member

Откуда:
Сообщений: 283
o-o,
возможно, автор имел в виду, что при соединении множества строк sql server'у быстрее будет соединяться по полю типа int, и это преимущество компенсирует затраты на конвертацию типов
6 окт 16, 10:07    [19749240]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
o-o
Guest
baza906
o-o,
возможно, автор имел в виду, что при соединении множества строк sql server'у быстрее будет соединяться по полю типа int, и это преимущество компенсирует затраты на конвертацию типов

нет, у него datetime "нечетко" определяет строку:
RMagistr2015
...то это поможет чётко идентифицировать строку, по которой будет происходить join

вот интересно, чем же int "четче".
6 окт 16, 10:13    [19749270]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
baza906,

Затраты на конвертацию в любом случае не будут компенсированы, ибо в данном случае не получится искать в индексе
6 окт 16, 10:14    [19749273]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20960
RMagistr2015
целесообразно ли делать соединение таблиц по типу datetime,
может лучше сначала преобразовать во что-нибудь, например в int, если в int преобразовать,
то это поможет чётко идентифицировать строку, по которой будет происходить join?
Преобразование - это плюс время и минус индекс. И если за время ещё где-то как-то можно предположить, что
baza906
при соединении множества строк sql server'у быстрее будет соединяться по полю типа int, и это преимущество компенсирует затраты на конвертацию типов
то вот НЕиспользование индексов гарантирует тормоза.

Оптимум же имхо будет в создании индекса по выражению CAST(field AS DATETIME) и связывание по нему же. Выигрыш по сравнению с прямым индексом - за счёт компактности, всё-таки 4 байта поменьше 8 будут. Но если для связывания нужны и другие поля, а селективность по индексу с одиночным полем невелика, или если покрывающий индекс выгоднее, то выигрыш уже станет не столь очевидным...
6 окт 16, 10:20    [19749308]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
iap
Member

Откуда: Москва
Сообщений: 47049
Pavel1211
baza906,

Затраты на конвертацию в любом случае не будут компенсированы, ибо в данном случае не получится искать в индексе
Были тут сообщения, что CAST(DateTimeField AS DATE) не мешает использовать индекс.
Вот только тип DATE появился только в 2008
6 окт 16, 10:23    [19749320]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
iap
Member

Откуда: Москва
Сообщений: 47049
Akina
Оптимум же имхо будет в создании индекса по выражению CAST(field AS DATETIME) и связывание по нему же
Индекс не по выражению, а по вычисляемому полю.
6 окт 16, 10:25    [19749326]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Pavel1211
baza906,

Затраты на конвертацию в любом случае не будут компенсированы, ибо в данном случае не получится искать в индексе

это если индекс есть. ну и convert (int,t1.date)=convert (int,t2.date) даст не тоже самое что t1.date = t2.date
6 окт 16, 10:26    [19749334]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
RMagistr2015
Здравствуйте, скажите пожалуйста, целесообразно ли делать соединение таблиц по типу datetime,
может лучше сначала преобразовать во что-нибудь, например в int, если в int преобразовать,
то это поможет чётко идентифицировать строку, по которой будет происходить join?
к примеру вот такой вот код:
select * 
    from t1 t1
        join t2 t2
            on convert (int,t1.date)=convert (int,t2.date)
у вас уже спрашивали выше 19749270 опишите какую конкретную проблему пытаетесь решить
6 окт 16, 11:40    [19749656]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
iap
Были тут сообщения, что CAST(DateTimeField AS DATE) не мешает использовать индекс.
Вот только тип DATE появился только в 2008

Ага, я помню: 15847969
Но у ТСа же другой тип конвертации
6 окт 16, 11:45    [19749694]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
o-o
Guest
Pavel1211
iap
Были тут сообщения, что CAST(DateTimeField AS DATE) не мешает использовать индекс.
Вот только тип DATE появился только в 2008

Ага, я помню: 15847969
Но у ТСа же другой тип конвертации

его конвертация выбрасывает временнУю часть даты.
спрашивается,
1) зачем ее выкидывать?
2) почему именно так извращенно?
для >= 2008 уже сказали, появился тип date, к нему надо кастить
для 2000-ого конвертить к 112 всяко нагляднее, чем к int.
6 окт 16, 11:51    [19749732]     Ответить | Цитировать Сообщить модератору
 Re: join по datetime  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
Дедушка
RMagistr2015
Здравствуйте, скажите пожалуйста, целесообразно ли делать соединение таблиц по типу datetime,
может лучше сначала преобразовать во что-нибудь, например в int, если в int преобразовать,
то это поможет чётко идентифицировать строку, по которой будет происходить join?
к примеру вот такой вот код:
select * 
    from t1 t1
        join t2 t2
            on convert (int,t1.date)=convert (int,t2.date)
у вас уже спрашивали выше 19749270 опишите какую конкретную проблему пытаетесь решить


Вопрос исследовательского характера,
Спасибо
6 окт 16, 12:12    [19749845]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить