Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server强制转换性能_Sql Server_Query Optimization_Query Performance - Fatal编程技术网

Sql server SQL Server强制转换性能

Sql server SQL Server强制转换性能,sql-server,query-optimization,query-performance,Sql Server,Query Optimization,Query Performance,在查询中,我将nvarchar数据类型转换为数字(精度、比例)。 以下是问题- SELECT FIELD_VALUE, FREQUENCY_COUNT FROM Table1 T1 INNER JOIN Table2 T2 ON T1.FIELD_KEY = T2.FIELD_KEY INNER JOIN Table3 T3 ON T3.FUNCTION_KEY = T1.FUNCTION_KEY WHERE T3.PROFILE_RUN_KEY = 65 AND T2.FIEL

在查询中,我将nvarchar数据类型转换为数字(精度、比例)。 以下是问题-

SELECT FIELD_VALUE,
  FREQUENCY_COUNT
FROM Table1 T1
INNER JOIN Table2 T2
ON T1.FIELD_KEY = T2.FIELD_KEY
INNER JOIN Table3 T3
ON T3.FUNCTION_KEY       = T1.FUNCTION_KEY
WHERE T3.PROFILE_RUN_KEY = 65
AND T2.FIELD_NAME          = 'DEPT_ID'
AND
  CASE
    WHEN T2.IS_VIRTUAL = 0
    THEN T2.RECORD_NAME
    ELSE T1.RULE_NAME
  END = 'EMPLOYEES'
ORDER BY FREQUENCY_COUNT DESC,
CAST(FIELD_VALUE AS NUMERIC(4,0)) DESC;
此查询的性能太低。 在做了一些随机的点击和试用后,我改变了像这样的铸造部分-铸造(字段_值为数字),性能得到了改善

有人能解释一下原因吗?(如果需要更多信息,请告诉我)


此处使用的表的行数少于100行。某些字段值也为空。

查看系统在何处进行转换会很有趣。可能快结束了,这意味着这只发生在不到100行的地方。我很惊讶地得知,这甚至会产生可测量的差异

“隐式”转换将
字段_值
转换为9字节的数字(18,0),而显式转换会产生5字节的数字(4,0)

虽然9和5都是“关闭”的数字,但很难相信这一点 *转换本身有很大的不同 *对100*5字节的列表进行排序比对100*9字节的列表进行排序慢

我试图复制你的发现,如下所示,但在持续时间上没有发现任何差异。(估计尺寸略有不同,但与预期一致)。如果它没有显示为10万行,那么我很难相信它会显示为100行

是否您看到了缓存的效果,并错误地将其归因于

    SET STATISTICS TIME ON

IF OBJECT_ID('t_test') IS NOT NULL DROP TABLE t_test

SELECT TOP 100000 FIELD_VALUE = Right(Convert(nvarchar(100), BINARY_CHECKSUM(NewID())), 4)
  INTO t_test
  FROM sys.objects, sys.columns, sys.types
GO
SELECT FIELD_VALUE
  FROM t_test
 ORDER BY CAST ( FIELD_VALUE AS NUMERIC(4, 0))
GO 3
SELECT FIELD_VALUE
  FROM t_test
 ORDER BY CAST ( FIELD_VALUE AS NUMERIC)
GO 3