比较时,任何人都可以提供任何具体的表现证据
int = int
和
string = string
在MS-SQL的WHERE
子句中。
例如
select *
from Samples
where SamplesID = 5
和
select *
from Samples
where Name = 'Shampoo'
是否有差异或表现相同?
答案 0 :(得分:10)
好的有趣的问题总是把它当作读取整数更快并且从未实际测试过它。我将1M随机姓氏和类型从我的数据中的联系人列表中删除到没有索引或主键只是原始数据的临时数据库。没有对我的数据范围进行测量,其中任何一列都没有标准化,因此反映了我的数据库的实际情况而不是纯粹的统计集。
select top 100 * from tblScratch where contactsurname = '<TestSurname>' order by NEWID()
select top 100 * from tblScratch where contacttyperef = 1-22 order by NEWID()
Newid每次都会将数据列表随机化。快速运行20个姓氏和20种类型。查询运行姓氏比ref和姓氏。搜索参考编号几乎快了4倍,使用了大约1/2,因此几年前这些书都是正确的。
字符串 -
SELECT TOP 100 * FROM tblScratch WHERE contactsurname = 'hoare' ORDER BY NEWID()
Duration 430ms
Reads 902
CPU 203
整数 -
SELECT TOP 100 * FROM tblScratch WHERE contacttyperef = 3 ORDER BY NEWID()
Duration 136ms
Reads 902
CPU 79
答案 1 :(得分:2)
将两个查询放在同一个查询窗口中。在最顶层(在这些查询之前)放置: SET STATISTICS IO ON
当您运行代码时,使用“包含实际执行计划”选项运行它(工具栏上的图标看起来像三个小框,“执行”按钮右侧大约有7个图标)
这将在结果中生成三个选项卡:结果,消息,计划。 消息和计划将显示IO成本和完整的执行成本。
数字较大的查询成本最高! 此方法将允许您向自己证明哪个查询具有最低成本(最高性能)
答案 2 :(得分:2)
史蒂夫在评论中指出,索引的存在和构成将极大地影响你的结果;但是,由于SQL Server使用页面来查找数据,而较窄的列类型可以在每页存储更多数据,因此使用窄类型可以比需要考虑更多值的更宽类型执行得更好。
所以,如果你有一张小桌子(几行),那可能并不重要;大桌子?在int列上放置一个索引,它可能会超出索引的varchar列。
当然,构成大表或小表的内容取决于您的硬件。
答案 3 :(得分:1)
比较整数应该更快,在非常低的水平上它将以1 cmp
指令结束。比较字符串涉及更多指令,因此性能更差
我假设您在两个字段上都有或没有索引,索引具有相同的选择性,记录数也相同