sql排行榜為什麼性能不好
1. SQL資料庫性能怎麼樣
SQL Server資料庫查詢速度慢的原因有很多,常見的有以下幾種: 1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是資料庫設計的缺陷) 2、I/O吞吐量小,形成了瓶頸效應。 3、沒有創建計算列導致查詢不優化。 4、內存不足 5、網路速度慢 6、查詢出的數據量過大(可以採用多次查詢,其他的方法降低數據量) 7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設計的缺陷) 8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。 9、返回了不必要的行和列 10、查詢語句不好,沒有優化 ●可以通過以下方法來優化查詢 : 1、把數據、日誌、索引放到不同的I/O設備上,增加讀取速度,以前可以將Tempdb應放在RAID0上,SQL2000不在支持。數據量(尺寸)越大,提高I/O越重要。 2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse) 3、升級硬體 4、根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的數據量。注意填充因子要適當(最好是使用默認值0)。索引應該盡量小,使用位元組數小的列建索引好(參照索引的創建),不要對有限的幾個值的欄位建單一索引如性別欄位。 5、提高網速。 6、擴大伺服器的內存,Windows 2000和SQL server 2000能支持4-8G的內存。 配置虛擬內存:虛擬內存大小應基於計算機上並發運行的服務進行配置。運行 Microsoft SQL Server? 2000時,可考慮將虛擬內存大小設置為計算機中安裝的物理內存的1.5倍。如果另外安裝了全文檢索功能,並打算運行Microsoft搜索服務以便執行全文索引和查詢,可考慮:將虛擬內存大小配置為至少是計算機中安裝的物理內存的3倍。將SQL Server max server memory伺服器配置選項配置為物理內存的1.5倍(虛擬內存大小設置的一半)。 7、增加伺服器CPU個數;但是必須 明白並行處理串列處理更需要資源例如內存。使用並行還是串列程是MSSQL自動評估選擇的。單個任務分解成多個任務,就可以在處理器上運行。例如耽擱查詢 的排序、連接、掃描和GROUP BY字句同時執行,SQL SERVER根據系統的負載情況決定最優的並行等級,復雜的需要消耗大量的CPU的查詢最適合並行處理。但是更新操作UPDATE,INSERT, DELETE還不能並行處理。 8、如果是使用like進行查詢的話,簡單的使用index是不行的,但是全文索引,耗空間。 like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查詢時,查詢耗時和欄位值總長度成正比,所以不能用CHAR類型,而是VARCHAR。對於欄位的值很長的建全文索引。 9、DB Server 和APPLication Server 分離;OLTP和OLAP分離 10、分布式分區視圖可用於實現資料庫伺服器聯合體。 聯合體是一組分開管理的伺服器,但它們相互協作分擔系統的處理負荷。這種通過分區數據形成資料庫伺服器聯合體的機制能夠擴大一組伺服器,以支持大型的多層 Web 站點的處理需要。有關更多信息,參見設計聯合資料庫伺服器。(參照SQL幫助文件''分區視圖'') a、在實現分區視圖之前,必須先水平分區表 b、 在創建成員表後,在每個成員伺服器上定義一個分布式分區視圖,並且每個視圖具有相同的名稱。這樣,引用分布式分區視圖名的查詢可以在任何一個成員伺服器上 運行。系統操作如同每個成員伺服器上都有一個原始表的復本一樣,但其實每個伺服器上只有一個成員表和一個分布式分區視圖。數據的位置對應用程序是透明的。 11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數據和日誌 DBCC SHRINKDB,DBCC SHRINKFILE. 設置自動收縮日誌.對於大的資料庫不要設置資料庫自動增長,它會降低伺服器的性能。 在T-sql的寫法上有很大的講究,下面列出常見的要點:首先,DBMS處理查詢計劃的過程是這樣的: 1、 查詢語句的詞法、語法檢查 2、 將語句提交給DBMS的查詢優化器 3、 優化器做代數優化和存取路徑的優化 4、 由預編譯模塊生成查詢規劃 5、 然後在合適的時間提交給系統處理執行 6、 最後將執行結果返回給用戶。 其次,看一下SQL SERVER的數據存放的結構:一個頁面的大小為8K(8060)位元組,8個頁面為一個盤區,按照B樹存放。
2. 請教 SQL TOP 性能
符合id=1條件的記錄有多條:第一句是把符合id=1的記錄全部輸出,第二句是只輸出符合id=1的一條記錄。明顯第二句更快。
符合id=1條件的記錄單條:兩者一樣。
另:如果想進行資料庫寫入的話,select top 1 * from A 更效率。
3. mysql 增加排序 性能差很多 怎麼優化
1、ORDER BY的索引優化。如果一個SQL語句形如:
SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];
在[sort]這個欄位上建立索引就可以實現利用索引進行order by 優化。
2、WHERE + ORDER BY的索引優化,形如:
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort];
建立一個聯合索引(columnX,sort)來實現order by 優化。
注意:如果columnX對應多個值,如下面語句就無法利用索引來實現order by的優化
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] IN ([value1],[value2],…) ORDER BY[sort];
3、WHERE+ 多個欄位ORDER BY
SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;
建立索引(uid,x,y)實現order by的優化,比建立(x,y,uid)索引效果要好得多。
MySQL Order By不能使用索引來優化排序的情況
* 對不同的索引鍵做 ORDER BY :(key1,key2分別建立索引)
SELECT * FROM t1 ORDER BY key1, key2;
* 在非連續的索引鍵部分上做 ORDER BY:(key_part1,key_part2建立聯合索引;key2建立索引)
SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;
* 同時使用了 ASC 和 DESC:(key_part1,key_part2建立聯合索引)
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
* 用於搜索記錄的索引鍵和做 ORDER BY 的不是同一個:(key1,key2分別建立索引)
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
* 如果在WHERE和ORDER BY的欄位上應用表達式(函數)時,則無法利用索引來實現order by的優化
SELECT * FROM t1 ORDER BY YEAR(logindate) LIMIT 0,10;
4. 關於sql語句的性能問題
在多數情況下是第二效率最高,直接使用索引進行篩選。第一種在進行union的時候會進行一些額外的操作,第三種在某些早期資料庫、桌面資料庫、簡單資料庫下可能會不走索引。
5. SQL 語句執行感覺很慢,怎麼回事
到這個數量級的全部更新,肯定會很慢。
第一。你的記錄不一定在同一個partition,
第二。不明白為什麼那麼多人建議你建索引,你建的索引越多,你的更新速度越慢,因為你更新記錄的同時,還有更新索引。
第三。你必須知道更新速度慢的瓶頸在哪裡。是讀寫太多,還是內存不夠,還是CUP不夠快,然後對症下葯。
下面介紹兩個簡單的辦法,也許有效:
第一:
把這個100W行的表縱向劈成兩個,用外鍵關系連接,一個裝小的,經常改變的數據比如ID,外鍵,狀態值,時間等,另一個裝大的,不經常改變的數據,比如很長的字元串,xml,text 等。
這樣更新時操作小的這個表,可以大大節約內存和CPU 開銷,降低磁碟操作。
壞處就是查詢時會慢些。
第二:
把這100W行橫向切成很多個表,比如每個月的記錄裝在一個表裡,這樣每個表的記錄數可能只有幾萬,查詢,更新都會快很多。
壞處是查詢,更新都不如原來好寫。
6. 影響資料庫性能的主要因素有哪些
以MySQL為例:
影響資料庫性能的主要因素總結如下:
1、sql查詢速度
2、網卡流量
3、伺服器硬體
4、磁碟IO
以上因素並不是時時刻刻都會影響資料庫性能,而就像木桶效應一樣。如果其中一個因素嚴重影響性能,那麼整個資料庫性能就會嚴重受阻。另外,這些影響因素都是相對的。
例如:當數據量並沒有達到百萬千萬這樣的級別,那麼sql查詢速度也許就不是個重要因素,換句話說,你的sql語句效率適當低下可能並不影響整個效率多少,反之,這種情況,無論如何怎麼優化sql語句,可能都沒有太明顯的效果。
相關內容拓展:
1、SQL查詢速度
風險:效率低下的SQL
2、網卡流量
風險:網卡IO被占滿(100Mb/8=100MB)
方案:
①減少從伺服器的數量。從伺服器都要從主伺服器上復制日誌,所以,從伺服器越多,網路流量越大。
②進行分級緩存。前方大量緩存突然失效會對資料庫造成嚴重的沖擊。
③避免使用「select * 」進行查詢
④分離業務網路和伺服器網路
3、磁碟IO
風險:磁碟IO性能突然下降。
方案:使用更好的磁碟設備解決。
7. 關於sql性能問題,請各位大俠指教
1)select count(*) from t_plan_detail t1 left join t_plan t2 on t1.plan_id = t2.plan_id where t2.item_code = 『P004』
一:count(*)改為count(1),1000萬條記錄的業務表,count(*)與count(1)會有較為明顯的性能差別;
二:明顯t_plan_detail是t_plan的子表,那麼用明顯表去左連接主表,是毫無意義的,直接關聯即可;(樓主上面說item_code是明顯表的,這個SQL是不是寫錯了?)
(2)select count(1) from t_plan whre plan_id in(
Select plan_id from t_plan_detail where item_code =』p004』
) and plan status in(4,60)
上面萬的記錄集,用in會極其損耗性能,改為
select count(1) from t_plan a whre plan_id exists(
select 1 from t_plan_detail b where b.item_code='p004' and a.plan_id=b.plan_id) and plan status in(4,60)
(如果樓主上面說的表和記錄數是真實的,分別執行會有顯著效果)
(3)
Select plan_code , plan_status , create_date –create_date是t_plan_detail 的欄位
From (select a.create_userid ,a.plan_code ,a..plan_status ,b*
From t_plan a ,t_plan_detail b
Where a.plan_id = b.plan_id
And b.item_code =』p004』
Order by b.create_date , a.plan_code
) X
Where x.create_userid = 1 order by x..plan_code desc
一:子查詢中的order by 完全沒有意義;
二:子查詢中的b.*嚴重影響性能,結果中只需要b表一個欄位,而sql選出所有欄位;
三:完全沒有必要套一層查詢,直接將子查詢加上create_userid=1再修改order by就可以了。
(4)
我沒有能力回答如此學術性的問題,我只能說憑經驗,不會給這個欄位加索引!
invsummary表可否再詳細的說明一下結構及業務原理?
(5)
一:建立許可權主數據,將所有業務單元維護在許可權表中;
二:要求系統中存在用戶、崗位主數據,且存在mapping;
三:建立制授權表,將崗位與許可權mapping;
四:用戶登錄系統,通過用戶查找崗位,再查找所有許可權;
五:做一個許可權檢查程序,或Inc文件,或java程序,引入到每一個頁面文件進行檢查。
8. 為什麼postgrelsql的性能沒有mysql好
一、 PostgreSQL 的穩定性極強, Innodb 等引擎在崩潰、斷電之類的災難場景下抗打擊能力有了長足進步,然而很多 MySQL 用戶都遇到過Server級的資料庫丟失的場景——mysql系統庫是MyISAM的,相比之下,PG資料庫這方面要好一些。
二、任何系統都有它的性能極限,在高並發讀寫,負載逼近極限下,PG的性能指標仍可以維持雙曲線甚至對數曲線,到頂峰之後不再下降,而 MySQL 明顯出現一個波峰後下滑(5.5版本之後,在企業級版本中有個插件可以改善很多,不過需要付費)。
三、PG 多年來在 GIS 領域處於優勢地位,因為它有豐富的幾何類型,實際上不止幾何類型,PG有大量字典、數組、bitmap 等數據類型,相比之下mysql就差很多,instagram就是因為PG的空間資料庫擴展POSTGIS遠遠強於MYSQL的my spatial而採用PGSQL的。
四、PG 的「無鎖定」特性非常突出,甚至包括 vacuum 這樣的整理數據空間的操作,這個和PGSQL的MVCC實現有關系。
五、PG 的可以使用函數和條件索引,這使得PG資料庫的調優非常靈活,mysql就沒有這個功能,條件索引在web應用中很重要。
六、PG有極其強悍的 SQL 編程能力(9.x 圖靈完備,支持遞歸!),有非常豐富的統計函數和統計語法支持,比如分析函數(ORACLE的叫法,PG里叫window函數),還可以用多種語言來寫存儲過程,對於R的支持也很好。這一點上MYSQL就差的很遠,很多分析功能都不支持,騰訊內部數據存儲主要是MYSQL,但是數據分析主要是HADOOP+PGSQL。
七、PG 的有多種集群架構可以選擇,plproxy 可以支持語句級的鏡像或分片,slony 可以進行欄位級的同步設置,standby 可以構建WAL文件級或流式的讀寫分離集群,同步頻率和集群策略調整方便,操作非常簡單。
八、一般關系型資料庫的字元串有限定長度8k左右,無限長 TEXT 類型的功能受限,只能作為外部大數據訪問。而 PG 的 TEXT 類型可以直接訪問,SQL語法內置正則表達式,可以索引,還可以全文檢索,或使用xml xpath。用PG的話,文檔資料庫都可以省了。
九,對於WEB應用來說,復制的特性很重要,mysql到現在也是非同步復制,pgsql可以做到同步,非同步,半同步復制。還有mysql的同步是基於binlog復制,類似oracle golden gate,是基於stream的復制,做到同步很困難,這種方式更加適合異地復制,pgsql的復制基於wal,可以做到同步復制。同時,pgsql還提供stream復制。
十,pgsql對於numa架構的支持比mysql強一些,比MYSQL對於讀的性能更好一些,pgsql提交可以完全非同步,而mysql的內存表不夠實用(因為表鎖的原因)
最後說一下我感覺 PG 不如 MySQL 的地方。
第一,MySQL有一些實用的運維支持,如 slow-query.log ,這個pg肯定可以定製出來,但是如果可以配置使用就更好了。
第二是mysql的innodb引擎,可以充分優化利用系統所有內存,超大內存下PG對內存使用的不那麼充分,
第三點,MySQL的復制可以用多級從庫,但是在9.2之前,PGSQL不能用從庫帶從庫。
第四點,從測試結果上看,mysql 5.5的性能提升很大,單機性能強於pgsql,5.6應該會強更多.
第五點,對於web應用來說,mysql 5.6 的內置MC API功能很好用,PGSQL差一些。
另外一些:
pgsql和mysql都是背後有商業公司,而且都不是一個公司。大部分開發者,都是拿工資的。
說mysql的執行速度比pgsql快很多是不對的,速度接近,而且很多時候取決於你的配置。
對於存儲過程,函數,視圖之類的功能,現在兩個資料庫都可以支持了。
另外多線程架構和多進程架構之間沒有絕對的好壞,oracle在unix上是多進程架構,在windows上是多線程架構。
很多pg應用也是24/7的應用,比如skype. 最近幾個版本VACUUM基本不影響PGSQL 運行,8.0之後的PGSQL不需要cygwin就可以在windows上運行。
至於說對於事務的支持,mysql和pgsql都沒有問題。
9. 關於sql性能問題
WITH AS短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義一個SQL片斷,該SQL片斷會
被整個SQL語句所用到。有的時候,是為了讓SQL語句的可讀性更高些,也有可能是在UNION ALL的不同部分,作為提供數
據的部分。
特別對於UNION ALL比較有用。因為UNION ALL的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,
所以可以使用WITH AS短語,則只要執行一遍即可。如果WITH AS短語所定義的表名被調用兩次以上,則優化器會自動將
WITH AS短語所獲取的數據放入一個TEMP表裡,如果只是被調用一次,則不會。而提示materialize則是強制將WITH AS
短語里的數據放入一個全局臨時表裡。很多查詢通過這種方法都可以提高速度。
後者性能其實差不多,但是with as 好維護,可讀性也好很多
10. 為什麼sql語句在企業管理器和程序中執行的性能差那麼多
一般鏈接資料庫的驅動和直接訪問資料庫的速度會有差別。您用的是SQLSERVER?如果是這樣,那區別更明顯,微軟做自己底層的很棒,但從來不管別人的死活。。。