BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #34591同步于 2009/5/24
SoftDesign机器人发帖

[合集] 【COOL IN】数据库查询优化

FadeToBlack
2009/5/24镜像同步0 回复
☆─────────────────────────────────────☆ atian25 (天猪天狗|阿天) 于 (Fri Nov 14 18:30:46 2008) 提到: CREATE TABLE dbo.TaskResultBaseTestData200805 ( fdiId numeric(10,0) IDENTITY, fdiTaskId numeric(10,0) NOT NULL, fdcIsSummary varchar(2) NOT NULL, fdiFinishFlag numeric(10,0) NULL, fdiTestLogId numeric(10,0) NULL, fdiTestTypeId numeric(10,0) NULL, fdiTestItemId numeric(10,0) NULL, fdiTestGroupLogId numeric(10,0) NULL, fdiTaskLogId numeric(10,0) NULL, fdiResultCode numeric(10,0) NULL, fddStartTime datetime NULL, fddFinishTime datetime NULL, fdiRtdSerialNo1 numeric(10,0) NULL, fdiRtdSerialNo2 numeric(10,0) NULL, fdiRtdSerialNo3 numeric(10,0) NULL, fdcTelNo1 varchar(20) NULL, fdcTelNo2 varchar(20) NULL, fdcTelNo3 varchar(20) NULL, time1 datetime NULL, time2 datetime NULL, time3 datetime NULL, time4 datetime NULL, time5 datetime NULL, time6 datetime NULL, time7 datetime NULL, time8 datetime NULL, time9 datetime NULL, time10 datetime NULL, temp1 varchar(20) NULL, temp2 varchar(20) NULL, temp3 varchar(20) NULL, temp4 varchar(20) NULL, temp5 varchar(20) NULL ) LOCK DATAROWS WITH IDENTITY_GAP=1 go IF OBJECT_ID('dbo.TaskResultBaseTestData200805') IS NOT NULL PRINT '<<< CREATED TABLE dbo.TaskResultBaseTestData200805 >>>' ELSE PRINT '<<< FAILED CREATING TABLE dbo.TaskResultBaseTestData200805 >>>' go EXEC sp_cachestrategy 'elvis_gz','dbo.TaskResultBaseTestData200805','table only','mru','off' go CREATE NONCLUSTERED INDEX index_fdiTestTypeId ON dbo.TaskResultBaseTestData200805(fdcIsSummary,fdiTestTypeId,fddStartTime,fddFinishTime,fdiResultCode) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiTestTypeId') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiTestTypeId >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiTestTypeId >>>' go CREATE NONCLUSTERED INDEX index_fdiTestItemId ON dbo.TaskResultBaseTestData200805(fdcIsSummary,fdiTestItemId,fddStartTime,fddFinishTime,fdiResultCode) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiTestItemId') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiTestItemId >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiTestItemId >>>' go CREATE NONCLUSTERED INDEX index_fdiRtdSerialNo1 ON dbo.TaskResultBaseTestData200805(fdiRtdSerialNo1) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiRtdSerialNo1') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiRtdSerialNo1 >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiRtdSerialNo1 >>>' go CREATE NONCLUSTERED INDEX index_fdiRtdSerialNo2 ON dbo.TaskResultBaseTestData200805(fdiRtdSerialNo2) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiRtdSerialNo2') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiRtdSerialNo2 >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiRtdSerialNo2 >>>' go CREATE NONCLUSTERED INDEX index_fdiRtdSerialNo3 ON dbo.TaskResultBaseTestData200805(fdiRtdSerialNo3) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiRtdSerialNo3') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiRtdSerialNo3 >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiRtdSerialNo3 >>>' go CREATE NONCLUSTERED INDEX index_fdcTelNo1 ON dbo.TaskResultBaseTestData200805(fdcTelNo1) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdcTelNo1') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdcTelNo1 >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdcTelNo1 >>>' go CREATE NONCLUSTERED INDEX index_fdcTelNo2 ON dbo.TaskResultBaseTestData200805(fdcTelNo2) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdcTelNo2') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdcTelNo2 >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdcTelNo2 >>>' go CREATE NONCLUSTERED INDEX index_fdcTelNo3 ON dbo.TaskResultBaseTestData200805(fdcTelNo3) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdcTelNo3') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdcTelNo3 >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdcTelNo3 >>>' go CREATE NONCLUSTERED INDEX index_fddStartTime ON dbo.TaskResultBaseTestData200805(fddStartTime,fddFinishTime) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fddStartTime') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fddStartTime >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fddStartTime >>>' go CREATE NONCLUSTERED INDEX index_fdiResultCode ON dbo.TaskResultBaseTestData200805(fdiResultCode) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiResultCode') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiResultCode >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiResultCode >>>' go CREATE CLUSTERED INDEX clu_index_fddStartTime200805 ON dbo.TaskResultBaseTestData200805(fddStartTime DESC) WITH ALLOW_DUP_ROW go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='clu_index_fddStartTime200805') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.clu_index_fddStartTime200805 >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.clu_index_fddStartTime200805 >>>' go CREATE NONCLUSTERED INDEX index_fdiTestLogId ON dbo.TaskResultBaseTestData200805(fdiTestLogId DESC) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiTestLogId') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiTestLogId >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiTestLogId >>>' go CREATE NONCLUSTERED INDEX index_fdiTestTypeId2 ON dbo.TaskResultBaseTestData200805(fdiTestTypeId) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiTestTypeId2') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiTestTypeId2 >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiTestTypeId2 >>>' go CREATE NONCLUSTERED INDEX index_fdiTestGroupLogId ON dbo.TaskResultBaseTestData200805(fdiTestGroupLogId DESC) go IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.TaskResultBaseTestData200805') AND name='index_fdiTestGroupLogId') PRINT '<<< CREATED INDEX dbo.TaskResultBaseTestData200805.index_fdiTestGroupLogId >>>' ELSE PRINT '<<< FAILED CREATING INDEX dbo.TaskResultBaseTestData200805.index_fdiTestGroupLogId >>>' go ------------------------------------------- select T.fdiId, T.fdiTestLogId, T.fdiTestTypeId, T.fdiTaskLogId,T.fdiTaskId, T.fdiTestGroupLogId, T.fdiTestItemId, T.fdiResultCode, T.fddStartTime,T.fddFinishTime,T.fdiRtdSerialNo1, T.fdiRtdSerialNo2, T.fdiRtdSerialNo3, T.fdcTelNo1,T.fdcTelNo2, T.fdcTelNo3, T.time1, T.time2, T.time3, T.time4, T.time5, T.time6, T.time7,T.time8, T.time9, T.time10, T.temp1, T.temp2, T.temp3, T.temp4, T.temp5 FROM TaskResultBaseTestData200805 T where 1=1 and T.fddStartTime between '2008-05-01 16:45:00' and '2008-05-02 16:45:00' and T.fdiTestTypeId =1 ------------------------------------------- 数据库是sybase,数据量100w,上面的sql查询出1.1w条,在dbms中居然用了12s(我用DBArtisan) ☆─────────────────────────────────────☆ atian25 (天猪天狗|阿天) 于 (Fri Nov 14 18:47:55 2008) 提到: top 100 都用了2s,很不合理. 执行计划如下: ******************************* Beginning selection of qualifying indexes for table 'TaskResultBaseTestData200805', correlation name 'T', varno = 0, objectid 1323200783. The table (Datarows) has 973271 rows, 115268 pages, The table's Data Page Cluster Ratio 0.999990 Table scan cost is 973271 rows, 127757 pages, using no data prefetch (size 2K I/O), in data cache 'default data cache' (cacheid 0) with LRU replacement Selecting best index for the SEARCH CLAUSE: TaskResultBaseTestData200805.fddStartTime <= May 2 2008 4:45:00:000PM TaskResultBaseTestData200805.fddStartTime >= May 1 2008 4:45:00:000PM Estimated selectivity for fddStartTime, selectivity = 0.018402, upper limit = 0.052631. Estimating selectivity of index 'index_fddStartTime', indid 10 scan selectivity 0.018402, filter selectivity 0.018402 17910 rows, 3953 pages, index height 3, Data Row Cluster Ratio 0.912482, Index Page Cluster Ratio 0.998685, Data Page Cluster Ratio 0.946087 Estimating selectivity of index 'clu_index_fddStartTime200805', indid 12 scan selectivity 0.018402, filter selectivity 0.018402 17910 rows, 2630 pages, index height 2, Data Row Cluster Ratio 0.989110, Index Page Cluster Ratio 0.998197, Data Page Cluster Ratio 0.946751 The best qualifying index is 'clu_index_fddStartTime200805' (indid 12) costing 2630 pages, with an estimate of 17910 rows to be returned per scan of the table, using no index prefetch (size 2K I/O) on leaf pages, in index cache 'default data cache' (cacheid 0) with LRU replacement using no data prefetch (size 2K I/O), in data cache 'default data cache' (cacheid 0) with LRU replacement Search argument selectivity is 0.018402. ******************************* QUERY IS CONNECTED Number of tables in join: 1 Number of tables considered at a time: 1 Table count setting: 0 (default value used) 0 - NEW PLAN (total cost = 51538): varno=0 (TaskResultBaseTestData200805) indexid=12 (clu_index_fddStartTime200805) path=0x0x8ac8e000 pathtype=sclause method=NESTED ITERATION scanthreads=1 outerrows=1 rows=17910 joinsel=1.000000 scanpgs=2630 index_prefetch=NO index_iosize=2 index_bufreplace=LRU data_prefetch=NO data_iosize=2 data_bufreplace=LRU scanlio=2630 scanpio=2571 corder=11 TOTAL # PERMUTATIONS: 1 TOTAL # PLANS CONSIDERED: 2 CACHE USED BY THIS PLAN: CacheID = 0: (2K) 2571 (4K) 0 (8K) 0 (16K) 0 FINAL PLAN (total cost = 51538): varno=0 (TaskResultBaseTestData200805) indexid=12 (clu_index_fddStartTime200805) path=0x0x8ac8e000 pathtype=sclause method=NESTED ITERATION scanthreads=1 outerrows=1 rows=17910 joinsel=1.000000 scanpgs=2630 index_prefetch=NO index_iosize=2 index_bufreplace=LRU data_prefetch=NO data_iosize=2 data_bufreplace=LRU scanlio=2630 scanpio=2571 corder=11 QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is SELECT. FROM TABLE TaskResultBaseTestData200805 T Nested iteration. Using Clustered Index. Index : clu_index_fddStartTime200805 Forward scan. Positioning by key. Keys are: fddStartTime DESC Using I/O Size 2 Kbytes for index leaf pages. With LRU Buffer Replacement Strategy for index leaf pages. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Fri Nov 14 19:52:56 2008) 提到: 跟包博士讨论了 结论是: 没有结论.... ☆─────────────────────────────────────☆ wks (cloverprince) 于 (Fri Nov 14 22:19:16 2008) 提到: oh my dog ☆─────────────────────────────────────☆ atian25 (天猪天狗|阿天) 于 (Fri Nov 14 23:16:16 2008) 提到: 谁本地建个帮我测下... mysql什么都成 ☆─────────────────────────────────────☆ flyingmiao (amiao) 于 (Fri Nov 14 23:58:00 2008) 提到: 建了也没数据啊。。 【 在 atian25 的大作中提到: 】 : 谁本地建个帮我测下... : mysql什么都成 ☆─────────────────────────────────────☆ atian25 (天猪天狗|阿天) 于 (Sat Nov 15 00:08:42 2008) 提到: 自己随机造咯... ☆─────────────────────────────────────☆ atian25 (天猪天狗|阿天) 于 (Sat Nov 15 09:45:35 2008) 提到: 数据: http://41.dc.ftn.qq.com/ftn_handler/97867a0dcae040bbb6f8fa1246075d8a03fd1b76888a63a56f84f5bae2f5620969ce3b455048bbe2ab227ada79b5f2bb5808cbbc5c749fbfa43685fbc44e57c9/data.rar?k=0538393886c0a59f59b3353813340a4d090c5a5a510d5903145c0e0c03190c045b5e145a00550d4f09005c0957025d520009080f353c3806584c581647554a62 (提取码 9898548b) ☆─────────────────────────────────────☆ flyingmiao (amiao) 于 (Sat Nov 15 09:47:56 2008) 提到: 好,待我装个MYSQL先。。。。。 【 在 atian25 的大作中提到: 】 : 数据: : http://41.dc.ftn.qq.com/ftn_handler/97867a0dcae040bbb6f8fa1246075d8a03fd1b76888a63a56f84f5bae2f5620969ce3b455048bbe2ab227ada79b5f2bb5808cbbc5c749fbfa43685fbc44e57c9/data.rar?k=0538393886c0a59f59b3353813340a4d090c5a5a510d5903145c0e0c03190c045b5e145a00550d4f09005c0957025d520009080f353c3806584c581647554a62 : (提取码 9898548b) ☆─────────────────────────────────────☆ atian25 (天猪天狗|阿天) 于 (Sat Nov 15 09:52:42 2008) 提到: 随便你用啥数据库... ☆─────────────────────────────────────☆ witkey (Lost) 于 (Sat Nov 15 17:20:41 2008) 提到: 如果统计时间的精确性 要求不高,而且查询条件比较固定的话,可以新做一张表,每天12:00,24:00定时把你需要统计结果的数据预先读取放到新表里面去。 展现统计结果的时候,直接从新表中读数据,这样应该很快。 说错了 别拍我[em40] 【 在 atian25 的大作中提到: 】 : CREATE TABLE dbo.TaskResultBaseTestData200805 : ( : fdiId numeric(10,0) IDENTITY, : ................... ☆─────────────────────────────────────☆ sunmoonstar (摔锅啦) 于 (Sat Nov 15 17:47:11 2008) 提到: 感觉这种规模的数据不到1秒应该在1秒以内 创建index是否会失败了? ☆─────────────────────────────────────☆ atian25 (天猪天狗|阿天) 于 (Sat Nov 15 19:01:02 2008) 提到: 我上面说的已经是我本机的调试数据了. 为了排除一切可能的影响,只配置了唯一的一个sybase服务及库,也是唯一的一个表,所以不存在锁竞争等影响。tempdb只设置了512M,应该是够了,也配置了专门的cache,100M 而且该表也只设置了fddStartTime这一个聚集索引。 你说的这种方式是基础的,肯定考虑过了.实际情况是现在一个月90w的数据,已经做了月分表了.我觉得没理由这么慢,以前做的系统都是日分表的,一天都200w的数据,都没感觉这么慢. 我现在只是想确定下,同样的数据量,同样的查询下,你们的数据库会需要多少秒. 【 在 witkey 的大作中提到: 】 : 如果统计时间的精确性 要求不高,而且查询条件比较固定的话,可以新做一张表,每天12:00,24:00定时把你需要统计结果的数据预先读取放到新表里面去。 : 展现统计结果的时候,直接从新表中读数据,这样应该很快。 : 说错了 别拍我[em40] ☆─────────────────────────────────────☆ atian25 (天猪天狗|阿天) 于 (Sat Nov 15 19:02:27 2008) 提到: 我也觉得不应该超过1s. 可以排除读写竞争,锁竞争,cpu竞争等因素了. 表本身也是没问题的,都做过排除性的测试了. 【 在 sunmoonstar 的大作中提到: 】 : 感觉这种规模的数据不到1秒应该在1秒以内 : 创建index是否会失败了? ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Wed Nov 26 10:54:25 2008) 提到: RP。。。
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。