百萬級大數據查詢慢


會員表 :  id int ,企業名稱 varchar,

產品表:  ID ,產品名稱,分類1,分類2,分類3 ,會員表ID
________________________________________
服務器配置: win2003   sql2000  至強8核 內存8G  網站就是B2B網站
-----------------------------------------------------------------------
數據有200多萬,然后按分類3的ID 查詢需要44秒
腳本
Select Top 16 a.id,a.id,a.cpmc,b.qymc as gsmc,a.cpsb,a.cpbh,a.cpcd,a.cpgg,a.cpjg,a.jysm,a.picture FROM dbo.productshow a left join corporation b on a.gsid=b.id Where 1=1 and a.typeid='55521615' And a.id Not In (Select Top 0 a.id FROM dbo.productshow a left join corporation b on a.gsid=b.id Where 1=1 and a.typeid='55521615' Order By a.id desc , a.idate desc )Order By a.id desc , a.idate desc 


也可用存儲過程,麻煩那位提供下





  

30 个解决方案

#1


相關的索引都有么

#2


SELECT TOP 0
                                    a.id
                          FROM      dbo.productshow a
                                    LEFT JOIN corporation b ON a.gsid = b.id
                          WHERE     1 = 1
                                    AND a.typeid = '55521615'
                          ORDER BY  a.id DESC ,
                                    a.idate DESC
 

這部分的意圖是干嘛的?

#3


  SELECT TOP 16 a.id,
                a.id,
                a.cpmc,
                b.qymc AS gsmc,
                a.cpsb,
                a.cpbh,
                a.cpcd,
                a.cpgg,
                a.cpjg,
                a.jysm,
                a.picture
    FROM dbo.productshow a
         LEFT JOIN corporation b
           ON a.gsid = b.id
   WHERE 1 = 1
     AND a.typeid = '55521615'
     AND a.id NOT IN (  SELECT TOP 0 a.id -- 這要鬧那樣?
                          FROM dbo.productshow a
                               LEFT JOIN corporation b
                                 ON a.gsid = b.id
                         WHERE 1 = 1
                           AND a.typeid = '55521615'
                      ORDER BY a.id DESC,
                               a.idate DESC)
ORDER BY a.id DESC,
         a.idate DESC

#4


兩邊聯合查詢
,主表是產品表.然后沒條產品信息要跟上是那家公司的

#5


ID 建的索引

#6


我不知道top 0的意圖是干嘛的

#7


Select Top 16 a.id,a.cpmc,b.qymc as gsmc,a.cpsb,a.cpbh,a.cpcd,a.cpgg,a.cpjg,a.jysm,a.picture FROM dbo.productshow a left join corporation b on a.gsid=b.id Where 1=1 and a.typeid='55521615' Order By a.id desc , a.idate desc 
 我已經把TOP 0 刪掉了

#8


分別執行下面兩個語句,然后貼結果
sp_helpindex 'productshow'

sp_helpindex 'corporation'

#9




PK_productshow   clustered, unique, primary key located on PRIMARY   ID


PK_corporation   clustered, unique, primary key located on PRIMARY   ID

#10


將 NOT IN 改用 NOT EXISTS

#11


CREATE INDEX IX_productshow ON productshow(gsid,typeid)	
CREATE INDEX IX_productshow_Date ON productshow(idate)


先執行這兩個索引,再看看性能,2000有點麻煩,可能需要建多一點索引來覆蓋查詢

#12


已經執行了  ....

#13


效果呢?引用一下我的回復,我都不知道你回答誰的。。

#14


引用 13 樓 DBA_Huangzj 的回復:
效果呢?引用一下我的回復,我都不知道你回答誰的。。



查詢時間  18秒

#15


再加兩個,不過你看看里面的列,如果是那些varchar/nvarhcar/char/varchar 並且長度很長的,就先去掉吧
CREATE INDEX IX_productshow_Query ON productshow(cpmc,cpsb,cpbh,cpcd,cpgg,cpjg,jysm,picture)	
CREATE INDEX IX_corporation ON corporation(qymc)

#16


引用 15 樓 DBA_Huangzj 的回復:
再加兩個,不過你看看里面的列,如果是那些varchar/nvarhcar/char/varchar 並且長度很長的,就先去掉吧
CREATE INDEX IX_productshow_Query ON productshow(cpmc,cpsb,cpbh,cpcd,cpgg,cpjg,jysm,picture)	
CREATE INDEX IX_corporation ON corporation(qymc)


====================


執行執行0秒,正常了.如果多用戶同時查詢是否會增加查詢時間?

#17


我不清楚你的表結構、數據情況還有其他應用,所以不敢保證不會增加時間,但是如果索引算是合理的話,即使增加也不會很多

#18


引用 17 樓 DBA_Huangzj 的回復:
我不清楚你的表結構、數據情況還有其他應用,所以不敢保證不會增加時間,但是如果索引算是合理的話,即使增加也不會很多

你覺得用存儲過程是否可以提高效率點,能否下個簡單的存儲過程給我呢
執行執行0秒,正常了.如果多用戶同時查詢是否會增加查詢時間?

#19


CREATE PROC test 
(
@typeid VARCHAR(10) --這里的數據類型建議和a.typeid 的類型一模一樣,避免隱式轉換
)
AS 
SELECT TOP 16
        a.id ,
        a.cpmc ,
        b.qymc AS gsmc ,
        a.cpsb ,
        a.cpbh ,
        a.cpcd ,
        a.cpgg ,
        a.cpjg ,
        a.jysm ,
        a.picture
FROM    dbo.productshow a
        LEFT JOIN corporation b ON a.gsid = b.id
WHERE     a.typeid =@typeid
ORDER BY a.id DESC ,        a.idate DESC 
go



#20


純查詢,問題不大,但是還有用戶在修改數據的時候,那么響應時間就可能很久

#21


引用 20 樓 DBA_Huangzj 的回復:
純查詢,問題不大,但是還有用戶在修改數據的時候,那么響應時間就可能很久



那如何避免這個問題呢?

#22


暴力一點就用
select xxx from 表 with (nolock)

但是除非是一些靜態系統,否則我個人不建議使用,更重要是改進設計,這部分涉及面太廣,我沒什么可以說的了

#23


設計的東西,要懂業務、要懂技術,也要有足夠的經驗,不是三言兩語或者看完一兩本書可以做到的

#24


鎖定表不可取

#25


非常感謝你的耐心解答.

#26


引用 24 樓 tongchou 的回復:
鎖定表不可取
nolock是不鎖表。。。不是鎖表。。

#27


Not In 里面的東西很奇怪,和外面的查詢一直。 而且用了top 0 那不是恆成立嗎?

另外not in換成 not exists應該會好點吧。可以試試。  里面既然是判斷為何要加上排序?沒什么用處吧

然后就是查詢和排序字段添加索引

#28


該回復於2014-08-10 14:46:06被管理員刪除

#29


針對大數據庫性能優化,個人提點建議(僅代表本來觀點):
1.索引優化,為查詢字段建立索引,不過占用內存大
2.盡量使用存儲過程來調用,效率要高
3.使用預處理語句執行效率是否會更快? 比如stmt 預處理語句
4.對於大數據容量的表,建議數據分表存儲(水平拆分與垂直拆分),表容量達到一定數據后動態擴充表

#30


再就是寫查詢語句的時候,盡量縮小查詢范圍

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com