2015-10-24 3 views
1

Отборные возвращаются вправо на 23 000 строк
В за исключением того, будет возвращать в пределах от 60 до 200 строк (а не одних и тех же строк)
The исключения должно возвращать 0, как это выбрать, за исключением выбораСреднего флоят несогласованности

PK:... [docSVenum1] [enumID], [docSVenum1] [valueID], [FTSindexWordOnce] [wordID]

[тс] является поплавок и и я получаю поплавок не точен
Но я наивно думал, avg (float) будет повторяться
Средство (поплавок) похоже на повторяемость

Какое решение?
TF составляет от 0 и 1, и мне нужно только как 5 значащих цифр
мне просто нужно в среднем (TF), чтобы быть тем же номер запуска для запуска
Десятичных (9,8) дает мне достаточно точно, и если я бросаю в decimal (9,8) за исключением правильно возвращает 0
Я могу изменить [TF] на десятичную (9,8), но это будет бит работы и много регрессионного тестирования, поскольку некоторые из тестов, которые используют [tf], принимают в день для запуска
Является ли изменение [TF] на десятичное (9,8) лучшим решением?

SELECT [docSVenum1].[enumID], [docSVenum1].[valueID], [FTSindexWordOnce].[wordID] 
     , avg([FTSindexWordOnce].[tf]) AS [avgTFraw] 
    FROM [docSVenum1] 
    JOIN [docFieldLock] 
      ON [docFieldLock].[sID] = [docSVenum1].[sID] 
      AND [docFieldLock].[fieldID] = [docSVenum1].[enumID] 
      AND [docFieldLock].[lockID] IN (4, 5) /* secLvl docAdm */ 
    JOIN [FTSindexWordOnce] 
      ON [FTSindexWordOnce].[sID] = [docSVenum1].[sID] 
GROUP BY [docSVenum1].[enumID], [docSVenum1].[valueID], [FTSindexWordOnce].[wordID] 

except 

    SELECT [docSVenum1].[enumID], [docSVenum1].[valueID], [FTSindexWordOnce].[wordID] 
     , avg([FTSindexWordOnce].[tf]) AS [avgTFraw] 
    FROM [docSVenum1] 
    JOIN [docFieldLock] 
      ON [docFieldLock].[sID] = [docSVenum1].[sID] 
      AND [docFieldLock].[fieldID] = [docSVenum1].[enumID] 
      AND [docFieldLock].[lockID] IN (4, 5) /* secLvl docAdm */ 
    JOIN [FTSindexWordOnce] 
      ON [FTSindexWordOnce].[sID] = [docSVenum1].[sID] 
GROUP BY [docSVenum1].[enumID], [docSVenum1].[valueID], [FTSindexWordOnce].[wordID] 

order by [docSVenum1].[enumID], [docSVenum1].[valueID], [FTSindexWordOnce].[wordID] 

В этом случае ТФ термин частота tf-idf
тф нормализации носит субъективный характер и не требует большой точностью
Avg (ТФ) должна соответствовать от выбора, чтобы выбрать или результаты не соответствуют
в один выбор с соединениями мне нужно последовательно СРЕДНЕМ (тс)
Идущий с десятичной и низкая точность для ТФ получил стабильные результаты

+1

В чем проблема с кажущимися неопределенными вариациями, которые очень близки к 0? – trincot

+0

@Frisbee Для кого-то ваша проблема неясна (основано на знаке закрытия). – lad2025

+0

@ trincot Мне просто нужно, чтобы avg (TF) выполнялось так же, как и число – Paparazzi

ответ

3

Это очень похож на: SELECT SUM(...) is non-deterministic when adding the column-values of datatype float.

Проблема в том, что с неточным типом данных (FLOAT/REAL) порядок арифметических операций по вопросам с плавающей точкой. Демо от подключения:

DECLARE @fl FLOAT = 100000000000000000000 
DECLARE @i SMALLINT = 0 
WHILE (@i < 100) 
BEGIN 
    SET @fl = @fl + CONVERT(float, 5000) 
    SET @i = @i + 1 
END 
SET @fl = @fl - 100000000000000000000 
SELECT CONVERT(NVARCHAR(40), @fl, 2) 
-- 0.000000000000000e+000 


DECLARE @fl FLOAT = 0 
DECLARE @i SMALLINT = 0 
WHILE (@i < 100) 
BEGIN 
    SET @fl = @fl + CONVERT(float, 5000) 
    SET @i = @i + 1 
END 
SET @fl = @fl + 100000000000000000000 
SET @fl = @fl - 100000000000000000000 
SELECT @fl 
-- 507904 

LiveDemo

Возможные решения:

  • CAST все аргументы точного типа данных, как DECIMAL/NUMERIC
  • альтер стол и изменить FLOAT к DECIMAL
  • Вы можете попытаться заставить оптимизатор запросов вычислить сумму с тем же заказом.

Хорошая новость заключается в том, что, когда стабильные вопросы результата запроса к вашему приложению, вы можете заставить заказ быть такими же путем предотвращения параллелизма с ВАРИАНТОМ (MAXDOP 1).

+1

Порядок расчета входных данных в среднем будет зависеть от намного большего, чем последовательный или параллельный. Например. Используются физические пути доступа, Используются используемые заказы, используемые алгоритмы соединения, агрегация потока и агрегат хеша. –

+0

@MartinSmith В ответ на соединение это скорее означает порядок между выполнением одного и того же запроса (тот же план выполнения). Конечно, когда статистика изменится, и план выполнения обновится, он тоже изменится. Единственный способ - использовать соответствующий тип данных (DECIMAL). – lad2025

+0

Спасибо, это используется для поиска около дубликатов с использованием cosine tf-idf. Этот avg ([FTSindexWordOnce]. [Tf]) называется буквально миллиардами раз в течение 24 часов. Я полагаю, что изменение таблицы до десятичной является наиболее эффективным? – Paparazzi

Смежные вопросы