2013-09-05 3 views
4

У меня есть странный вопрос с базой данных и запрос в SQL Server 2012.запросов в SQL Server 2012 с DateTime между занимает слишком много времени с разницей миллисекунды

в записях, являются один столбец, который имеет тип DateTime (не datetime2) и сохраняет значения в формате 'YYYY-MM-dd HH:mm:ss.ttt', но у меня есть проблема ... если я сделать этот запрос:

SELECT * 
FROM table1 cg 
INNER JOIN table2 mv ON cg.mv_id = mv.mv_id 
FULL JOIN table3 fu ON cg.fu_id = fu.fu_id 
FULL JOIN table4 cl ON cg.cl_id = cl.cl_id 
INNER JOIN table5 so ON mv.so_id = so.so_id 
WHERE mv.su_id = 1 AND (mv.mv_fecha >= '2013-09-02 17:46:03.571' AND mv.mv_fecha <= '2013-09-04 23:59:59.999') 

Затем принимает как 10 секунд, но если я изменить mv.mv_fecha >= '2013-09-02 17:46:03.571' к '2013-09-02 17:46:03.572' (примечание что я меняю миллисекунду 571 на 572), тогда запрос берется как 4 минуты! и только с этой записью .. и если я сделаю любой запрос, проходящий через миллисекунду, запрос займет это время loooong. я должен указать, что случайно есть запись в table2 с mv_fecha как '2013-09-02 17:46:03.573' но даже если есть запись с этой датой-временем, запрос обыкновения получить его, потому что это запись с su_id = 2 (и в запросе su_id фильтруется 1).

Что происходит ???

UPDATE: У меня есть теория с table1 .. и это что table1 тысячи записей, и это таблица, которая не содержит какой-либо индекс в нем ... может быть, что проблема?

UPDATE 2: Это план выполнения запроса:

Execution Plan

+0

Возможно статистики нуждаются в обновлении. Каково приблизительное количество строк, соответствующих 'mv_fecha> = '2013-09-02 17: 46: 03.570'' и каково предполагаемое соответствие' mv_fecha> =' 2013-09-02 17: 46: 03.573''? –

+0

Также использование 'FULL JOIN' бессмысленно. Предложение 'WHERE' преобразует его обратно во внутренние соединения. –

+0

Можете ли вы рассказать мне, где я могу найти эти цифры? –

ответ

0

Пожалуйста, попробуйте этот запрос -

SELECT * 
FROM Table1 cg 
JOIN table2 mv ON cg.mv_id = mv.mv_id 
FULL JOIN table3 fu ON cg.fu_id = fu.fu_id 
FULL JOIN table4 cl ON cg.cl_id = cl.cl_id 
JOIN table5 so ON mv.so_id = so.so_id 
WHERE mv.su_id = 1 
    AND CAST(mv.mv_fecha AS DATETIME2) BETWEEN '20130902 17:46:03.572' AND '20130904 23:59:59.999') 
+0

С этим запросом требуется слишком много времени от 574 миллисекунды:/ –

+0

Просьба представить план выполнения этого запроса, 'DDL' для ваших таблиц и небольшой набор данных для тестирования. – Devart