Ⅰ sql 是一個爛設計嗎
初學的時候感覺sql很高級啊,簡單的說就是只需描述你想要的結果,不用管過程。真使用起來才發現,數據量大的時候其實並不是這樣的,不考慮過程的話,運行速度根本難以接受,還會有互鎖的問題。而優化sql語句和資料庫結構以達到合理的查詢速度又是一門高深的學問。
有時候調整sql語句來讓資料庫引擎按照你的意願執行查詢更象是一種藝術創作。
sql語言的設計初衷是把復雜的關系資料庫細節操作隱藏起來,暴露給用戶一個相對簡單而優雅的界面,可是然並卵,很多時候反而象是隔靴搔癢。這與C++有異曲同工之妙。
Ⅱ ERP 重新安裝SQL資料庫要額外收費,合理嗎
"故意"的成分應該不多, 畢竟他們給你們去現場安裝是付出勞動的, 在這個行業去現場支持(非服務方過錯導致的), 除非是合同里註明的免費情形, 都是需要收取費用的
Ⅲ 、如何檢查其他同事寫的不合理SQL ,防止發生線上故障
重啟下SQL服務,把下面腳本運行即可。運行後,壞掉的資料庫可能會丟失。
MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。long_query_time的默認值為10,意思是運行10s以上的語句。
Ⅳ 影響資料庫性能的主要因素有哪些
以MySQL為例:
影響資料庫性能的主要因素總結如下:
1、sql查詢速度
2、網卡流量
3、伺服器硬體
4、磁碟IO
以上因素並不是時時刻刻都會影響資料庫性能,而就像木桶效應一樣。如果其中一個因素嚴重影響性能,那麼整個資料庫性能就會嚴重受阻。另外,這些影響因素都是相對的。
例如:當數據量並沒有達到百萬千萬這樣的級別,那麼sql查詢速度也許就不是個重要因素,換句話說,你的sql語句效率適當低下可能並不影響整個效率多少,反之,這種情況,無論如何怎麼優化sql語句,可能都沒有太明顯的效果。
相關內容拓展:
1、SQL查詢速度
風險:效率低下的SQL
2、網卡流量
風險:網卡IO被占滿(100Mb/8=100MB)
方案:
①減少從伺服器的數量。從伺服器都要從主伺服器上復制日誌,所以,從伺服器越多,網路流量越大。
②進行分級緩存。前方大量緩存突然失效會對資料庫造成嚴重的沖擊。
③避免使用「select * 」進行查詢
④分離業務網路和伺服器網路
3、磁碟IO
風險:磁碟IO性能突然下降。
方案:使用更好的磁碟設備解決。
Ⅳ 如何優化sql語句
一、問題的提出
在應用系統開發初期,由於開發資料庫數據比較少,對於查詢SQL語句,復雜視圖的的編寫等體會不出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中數據的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中一個很重要的方面就是SQL語句的優化。對於海量數據,劣質SQL語句和優質SQL語句之間的速度差別可以達到上百倍,可見對於一個系統不是簡單地能實現其功能就可,而是要寫出高質量的SQL語句,提高系統的可用性。
在多數情況下,Oracle使用索引來更快地遍歷表,優化器主要根據定義的索引來提高性能。但是,如果在SQL語句的where子句中寫的SQL代碼不合理,就會造成優化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質SQL語句。在編寫SQL語句時我們應清楚優化器根據何種原則來刪除索引,這有助於寫出高性能的SQL語句。
二、SQL語句編寫注意問題
下面就某些SQL語句的where子句編寫中需要注意的問題作詳細介紹。在這些where子句中,即使某些列存在索引,但是由於編寫了劣質的SQL,系統在運行該SQL語句時也不能使用該索引,而同樣使用全表掃描,這就造成了響應速度的極大降低。
1. IS NULL 與 IS NOT NULL
不能用null作索引,任何包含null值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。也就是說如果某列存在空值,即使對該列建索引也不會提高性能。
任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的。
2. 聯接列
對於有聯接的列,即使最後的聯接值為一個靜態值,優化器是不會使用索引的。我們一起來看一個例子,假定有一個職工表(employee),對於一個職工的姓和名分成兩列存放(FIRST_NAME和LAST_NAME),現在要查詢一個叫比爾.柯林頓(Bill Cliton)的職工。
下面是一個採用聯接查詢的SQL語句,
select * from employss where first_name||''||last_name ='Beill Cliton';
上面這條語句完全可以查詢出是否有Bill Cliton這個員工,但是這里需要注意,系統優化器對基於last_name創建的索引沒有使用。
當採用下面這種SQL語句的編寫,Oracle系統就可以採用基於last_name創建的索引。
*** where first_name ='Beill' and last_name ='Cliton';
. 帶通配符(%)的like語句
同樣以上面的例子來看這種情況。目前的需求是這樣的,要求在職工表中查詢名字中包含cliton的人。可以採用如下的查詢SQL語句:
select * from employee where last_name like '%cliton%';
這里由於通配符(%)在搜尋詞首出現,所以Oracle系統不使用last_name的索引。在很多情況下可能無法避免這種情況,但是一定要心中有底,通配符如此使用會降低查詢速度。然而當通配符出現在字元串其他位置時,優化器就能利用索引。在下面的查詢中索引得到了使用:
select * from employee where last_name like 'c%';
4. Order by語句
ORDER BY語句決定了Oracle如何將返回的查詢結果排序。Order by語句對要排序的列沒有什麼特別的限制,也可以將函數加入列中(象聯接或者附加等)。任何在Order by語句的非索引項或者有計算表達式都將降低查詢速度。
仔細檢查order by語句以找出非索引項或者表達式,它們會降低性能。解決這個問題的辦法就是重寫order by語句以使用索引,也可以為所使用的列建立另外一個索引,同時應絕對避免在order by子句中使用表達式。
5. NOT
我們在查詢時經常在where子句使用一些邏輯表達式,如大於、小於、等於以及不等於等等,也可以使用and(與)、or(或)以及not(非)。NOT可用來對任何邏輯運算符號取反。下面是一個NOT子句的例子:
... where not (status ='VALID')
如果要使用NOT,則應在取反的短語前面加上括弧,並在短語前面加上NOT運算符。NOT運算符包含在另外一個邏輯運算符中,這就是不等於(<>)運算符。換句話說,即使不在查詢where子句中顯式地加入NOT詞,NOT仍在運算符中,見下例:
... where status <>'INVALID';
對這個查詢,可以改寫為不使用NOT:
select * from employee where salary<3000 or salary>3000;
雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用索引。
雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用索引。
Ⅵ SQL中的存儲過程在什麼時候才能得到最合理的利用
這個問題問的太籠統了吧,存儲過程的優點有哪些,在哪些地方用它,能夠發揮它的優點,應該就是合理的利用了吧
Ⅶ sql訂單表怎麼設計比較合理
訂單主表裡的總金額有沒有兩可,你可以不要這個欄位,查詢的時候直接匯總明細表的金額。當然如果考慮到查詢速度,也可以要這個欄位,在創建訂單和修改訂單時,把總金額寫入到欄位中。
你擔心匯總明細金額時太慢,我覺得這是多餘的,一張訂單的明細數據能有多少呢?1萬條,夠多了吧?可是即使是3萬條,一個「sum(金額)」的查詢也是很快的。
關於怕程序運行一半出問題的事情,你可以在做程序時用事務控制一下。(事務:多條資料庫寫入操作的集合,特性是要麼所有操作都執行成功,要麼所有操作都被回滾,取消執行),這樣就保證了你數據的一致性。
Ⅷ 關於SQL語句
可以這樣理解
SELECT
為選擇,FORM
為從哪裡,WHERE為條件
整句話就是選擇系號從教師表,其中DISTINCT為去除重復的關鍵字
Ⅸ sql數據表中有100多萬條紀錄,合理嗎
合理的,你可按照時間分表,這樣可以提高資料庫操作的效率,當然建立索引是必須的
Ⅹ sql 2000 這么設置表結構合不合理
1、表2中兩個姓名會和表1中的姓名重復,造成數據冗餘,應該都去掉,表2欄位建議為:
id,mid,wid
2、表1欄位更改為:id、姓名、性別、身份證號,td=表2.id
3、查詢的時候就可以使用 表1.td=表2.id