590
社区成员
发帖
与我相关
我的任务
分享
/*
SELECT max(ID) id ,SBarcode FROM TBSaleBarcode GROUP BY SBarcode
拿到最新的ID
数据 id rerk SBarcode
1 xx 001
2 xx 002
3 xx 001
我想拿到 id=3
*/
--设计测试表,插入 100 万条测试数据
USE tempdb
GO
IF OBJECT_ID('TBSaleBarcode') IS NOT NULL DROP TABLE TBSaleBarcode
CREATE TABLE TBSaleBarcode(id INT PRIMARY KEY,SBarcode NVARCHAR(20))
;WITH cte AS (
SELECT sv.number FROM [master].dbo.spt_values AS sv WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 1000
)
, cte2 AS(
SELECT ROW_NUMBER() OVER (ORDER BY a.number) AS rid FROM cte AS a CROSS APPLY cte AS b
)
INSERT INTO TBSaleBarcode(id,SBarcode)
SELECT t.rid,CASE WHEN t.rid%3=0 THEN '003' WHEN t.rid%2=0 THEN '002' ELSE '001' END
FROM cte2 AS t
SET STATISTICS IO ON
SET STATISTICS TIME ON
--无索引
SELECT SBarcode,MAX(id) AS maxId FROM TBSaleBarcode GROUP BY SBarcode
/*
SBarcode maxId
002 1000000
003 999999
001 999997
*/
/*
(3 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Workfile'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'TBSaleBarcode'。扫描计数 1,逻辑读取 2853 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SQL Server 执行时间:
CPU 时间 = 390 毫秒,占用时间 = 407 毫秒。
*/
CREATE INDEX ix_TBSaleBarcode_SBarcode_include_id ON TBSaleBarcode(SBarcode) INCLUDE(id)
--有索引
SELECT SBarcode,MAX(id) AS maxId FROM TBSaleBarcode GROUP BY SBarcode
/*
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
(3 行受影响)
表 'TBSaleBarcode'。扫描计数 1,逻辑读取 2489 次,物理读取 0 次,预读 12 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SQL Server 执行时间:
CPU 时间 = 219 毫秒,占用时间 = 215 毫秒。
*/
试了一下, 十万条数据也不慢啊。 加索引也只能快一点点。
本想用索引视图,但有sum就没办法用索引视图了,可惜。
你的数据有多少条?