客户ç«?br>机器åç§°åQšJoy
æ“作¾pÈ»ŸåQšWindows 2000 Server
æ•°æ®åº“版本:SQL 2000 Server ä¼ä¸šç‰?br>
åQï¼2:建用户å¸å?br>在æœåŠ¡å™¨ç«¯å¾ç«‹åŸŸç”¨æˆ·å¸å·
我的电脑½Ž¡ç†->本地用户和组->用户->建立
UserNameåQšJoy
UserPwdåQšJoy
==3:釿–°å¯åЍæœåС噍MSSQLServer
我的电脑->控制é¢ç‰ˆ->½Ž¡ç†å·¥å…·->æœåŠ¡->MSSQLServer æœåŠ¡
(更改为:域用户å¸å?我们新å¾çš„joy用户 .\joy,密ç :joy)
åQï¼4:å®‰è£…åˆ†å‘æœåŠ¡å™?br>A:é…ç½®åˆ†å‘æœåŠ¡å™?br>工具->å¤åˆ¶->é…ç½®å‘布ã€è®¢é˜…æœåŠ¡å™¨å’Œåˆ†å?>下一æ?>下一æ?所有的å‡é‡‡ç”¨é»˜è®¤é…¾|?
B:é…ç½®å‘布æœåŠ¡å™?br>工具->å¤åˆ¶->创å¾å’Œç®¡ç†å‘å¸?>选择è¦å‘布的数æ®åº?pubs)->下一æ?>å¿«ç…§å‘布->下一æ?>
选择è¦å‘布的内容->下一æ?>下一æ?>下一æ?>完æˆ
C:强制é…置订阅æœåŠ¡å™?推模å¼?拉模å¼ä¸Žæ¤é›·å?
工具->å¤åˆ¶->é…ç½®å‘布ã€è®¢é˜…æœåŠ¡å™¨å’Œåˆ†å?>订阅æœåŠ¡å™?>æ–°å¾->SQL Serveræ•°æ®åº?>输入客户端æœåС噍åç§°(joy)->使用SQL Server íw«ä†¾éªŒè¯(sa,sa)->¼‹®å®š->应用->¼‹®å®š
D:åˆå§‹åŒ–订é˜?br>å¤åˆ¶ç›‘视å™?>å‘布æœåŠ¡å™?serverDB)->åŒå‡»è®¢é˜…->强制新å¾->下一æ?>选择å¯ç”¨çš„订阅æœåС噍->joy->
下一æ?>下一æ?>下一æ?>下一æ?>完æˆ
åQï¼6:‹¹‹è¯•æ•°æ®
--在æœåŠ¡å™¨æ‰§è¡Œ:
选择表storesåQŒæ‰‹åŠ¨æˆ–è€…é€šè¿‡sqlè¯å¥ä¿®æ”¹å…¶ä¸çš„æ•°æ®ï¼Œinsert ,update ,deleteå‡å¯ã€?br>
å¤åˆ¶ç›‘视å™?>å‘布æœåŠ¡å™?serverDB)->->å¿«ç…§->å¯åŠ¨ä»£ç†½E‹åº
->ZLP:SZ(强制)->å¯åŠ¨åŒæ¥å¤„ç†
åŽÀLŸ¥çœ‹åŒæ¥çš„ joy:stores æ˜¯å¦æ’å…¥äº†ä¸€æ¡æ–°çš„è®°å½?/p>
‹¹‹è¯•完毕åQŒé€šè¿‡ã€?/p>
åQï¼7修改数æ®åº“çš„åŒæ¥æ—‰™—´,一般选择夜晚执行数æ®åº“åŒæ¥å¤„ç?br>(具体æ“作ç•? :D
〔注æ„说明ã€?/strong>
æœåŠ¡å™¨ä¸€ç«¯ä¸èƒ½ä»¥(local)˜q›è¡Œæ•°æ®çš„å‘布与分å‘,需è¦å…ˆåˆ 除注册åQŒç„¶åŽæ–°å»ºæ³¨å†Œæœ¬åœ°è®¡½Ž—机åç§°
å¸è²æ–¹å¼åQšå·¥å…?>å¤åˆ¶->¼›æ¢å‘布->是在"ZehuaDb"ä¸Šé™æ¢å‘å¸?å¸è²æ‰€æœ‰çš„æ•°æ®åº“åŒæ¥é…¾|®æœåС噍
注æ„åQšå‘布æœåС噍ã€åˆ†å‘æœåС噍ä¸çš„SQLServerAgentæœåŠ¡å¿…é¡»å¯åЍ
采用推模å¼? "D:\Microsoft SQL Server\MSSQL\REPLDATA\unc" 目录文äšgå¯ä»¥ä¸è®¾¾|®å…±äº?br> 拉模å¼?则需è¦å…±äº«~!
ž®‘釿•°æ®åº“åŒæ¥å¯ä»¥é‡‡ç”¨è§¦å‘器实现,åŒæ¥å•表å›_¯ã€?br>
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?br>é…ç½®˜q‡ç¨‹ä¸å¯èƒ½å‡ºçŽ°çš„é—®é¢˜
在SQL Server 2000里设¾|®å’Œä½¿ç”¨æ•°æ®åº“å¤åˆ¶ä¹‹å‰ï¼Œåº”å…ˆ‹‚€æŸ¥ç›¸å…³çš„å‡ å°SQL ServeræœåС噍䏋é¢å‡ ç‚ÒŽ˜¯å¦æ»¡‘»I¼š
1ã€MSSQLserverå’ŒSqlserveragentæœåŠ¡æ˜¯å¦æ˜¯ä»¥åŸŸç”¨æˆ¯‚ín份å¯åŠ¨åÆˆ˜q行的(.\administrator用户也是å¯ä»¥çš„)
如果ç™Õd½•用的是本地系¾lŸå¸æˆ·localåQŒå°†ä¸å…·å¤‡ç½‘¾lœåŠŸèƒ½ï¼Œä¼šäñ”生以下错è¯?
˜q›ç¨‹æœªèƒ½˜qžæŽ¥åˆ°Distributor '@Server name'
(如果您的æœåС噍已¾l用了SQL Server全文‹‚€ç´¢æœåŠ? 请ä¸è¦ä¿®æ”¹MSSQLserverå’ŒSqlserveragentæœåŠ¡çš„localå¯åЍã€?br> 会照æˆå…¨æ–‡æ£€ç´¢æœåŠ¡ä¸èƒ½ç”¨ã€‚请æ¢å¦å¤–䏀尿œºå™¨æ¥åšSQL Server 2000里å¤åˆ¶ä¸çš„åˆ†å‘æœåС噍ã€?
修改æœåŠ¡å¯åŠ¨çš„ç™»å½•ç”¨æˆøP¼Œéœ€è¦é‡æ–°å¯åЍMSSQLserverå’ŒSqlserveragentæœåŠ¡æ‰èƒ½ç”Ÿæ•ˆã€?nbsp;
2ã€æ£€æŸ¥ç›¸å…³çš„å‡ å°SQL ServeræœåŠ¡å™¨æ˜¯å¦æ”¹˜q‡å¿U?需è¦srvid=0的本地机器上srvnameå’Œdatasource一æ ?
在查询分æžå™¨é‡Œæ‰§è¡?
use master
select srvid,srvname,datasource from sysservers
如果没有srvid=0或者srvid=0åQˆä¹Ÿž®±æ˜¯æœ¬æœºå™¨ï¼‰ä½†srvnameå’Œdatasourceä¸ä¸€æ ? éœ€è¦æŒ‰å¦‚下æ–ÒŽ³•修改:
  USE master
GO
-- 讄¡½®ä¸¤ä¸ªå˜é‡
DECLARE @serverproperty_servername varchar(100),
@servername varchar(100)
-- å–å¾—Windows NT æœåŠ¡å™¨å’Œä¸ŽæŒ‡å®šçš„ SQL Server 实例兌™”的实例信æ?br> SELECT @serverproperty_servername = CONVERT(varchar(100), SERVERPROPERTY('ServerName'))
-- ˜q”回˜q行 Microsoft SQL Server 的本地æœåС噍åç§°
SELECT @servername = CONVERT(varchar(100), @@SERVERNAME)
-- 昄¡¤ºèŽ·å–çš„è¿™ä¸¤ä¸ªå‚æ•°
select @serverproperty_servername,@servername
--如果@serverproperty_servernameå’Œ@servernameä¸åŒ(å› äØ“ä½ æ”¹˜q‡è®¡½Ž—机åå—),å†è¿è¡Œä¸‹é¢çš„
--åˆ é™¤é”™è¯¯çš„æœåС噍å?br> EXEC sp_dropserver @server=@servername
--æ·ÕdŠ æ£ç¡®çš„æœåŠ¡å™¨å?br> EXEC sp_addserver @server=@serverproperty_servername, @local='local'
修改˜q™é¡¹å‚æ•°åQŒéœ€è¦é‡æ–°å¯åЍMSSQLserverå’ŒSqlserveragentæœåŠ¡æ‰èƒ½ç”Ÿæ•ˆã€?nbsp;
˜q™æ ·ä¸€æ¥å°±ä¸ä¼šåœ¨åˆ›å»ºå¤åˆ¶çš„˜q‡ç¨‹ä¸å‡ºçŽ?8482ã€?8483错误了ã€?br>
3ã€æ£€æŸ¥SQL Serverä¼ä¸š½Ž¡ç†å™¨é‡Œé¢ç›¸å…³çš„å‡ å°SQL Serveræ³¨å†Œåæ˜¯å¦å’Œä¸Šé¢½W¬äºŒç‚šw‡Œä»‹ç»çš„srvname一æ ?br>
ä¸èƒ½ç”¨IP地å€çš„æ³¨å†Œåã€?br>
åQˆæˆ‘们å¯ä»¥åˆ 掉IP地å€çš„æ³¨å†Œï¼Œæ–°å¾ä»¥SQL Server½Ž¡ç†å‘˜çñ”别的用户注册的æœåС噍å)
˜q™æ ·ä¸€æ¥å°±ä¸ä¼šåœ¨åˆ›å»ºå¤åˆ¶çš„˜q‡ç¨‹ä¸å‡ºçŽ?4010ã€?0084ã€?8456ã€?8482ã€?8483错误了ã€?nbsp;
4ã€æ£€æŸ¥ç›¸å…³çš„å‡ å°SQL ServeræœåŠ¡å™¨ç½‘¾lœæ˜¯å¦èƒ½å¤Ÿæ£å¸¸è®¿é—?br>
如果pingä¸ÀLœºIP地å€å¯ä»¥åQŒä½†pingä¸ÀLœºåä¸é€šçš„æ—¶å€™ï¼Œéœ€è¦åœ¨
winnt\system32\drivers\etc\hosts (WIN2000)
windows\system32\drivers\etc\hosts (WIN2003)
æ–‡äšg里写入数æ®åº“æœåС噍IP地å€å’Œä¸»æœºå的对应关¾p…R€?br>
例如åQ?nbsp;
127.0.0.1 localhost 192.168.0.35 oracledb oracledb 192.168.0.65 fengyu02 fengyu02 202.84.10.193 bj_db bj_db |
或者在SQL Server客户端网¾lœå®žç”¨å·¥å…·é‡Œå»ºç«‹åˆ«ååQŒä¾‹å¦?
5ã€ç³»¾lŸéœ€è¦çš„æ‰©å±•å˜å‚¨˜q‡ç¨‹æ˜¯å¦å˜åœ¨(如果ä¸å˜åœ¨ï¼Œéœ€è¦æ¢å¤?:
sp_addextendedproc 'xp_regenumvalues',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletevalue',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletekey',@dllname ='xpstar.dll'
go
sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
接下æ¥å°±å¯ä»¥ç”¨SQL Serverä¼ä¸š½Ž¡ç†å™¨é‡Œ[å¤åˆ¶]-> å³é”®é€‰æ‹©
->[é…ç½®å‘布ã€è®¢é˜…æœåŠ¡å™¨å’Œåˆ†å‘]çš„å›¾å½¢ç•Œé¢æ¥é…置数æ®åº“å¤åˆ¶äº†
2ã€?nbsp; é¿å…使用ä¸å…¼å®¹çš„æ•°æ®¾cÕdž‹ã€‚例如floatå’Œintã€charå’Œvarcharã€binaryå’Œvarbinary是ä¸å…¼å®¹çš„。数æ®ç±»åž‹çš„ä¸å…¼å®¹å¯èƒ½ä‹Éä¼˜åŒ–å™¨æ— æ³•æ‰§è¡Œä¸€äº›æœ¬æ¥å¯ä»¥è¿›è¡Œçš„优化æ“作。例å¦?
SELECT name FROM employee WHERE salary åQ?60000
在这æ¡è¯å¥ä¸,如salaryå—æ®µæ˜¯money型的,则优化器很难对其˜q›è¡Œä¼˜åŒ–,å› äØ“60000是个整型数。我们应当在¾~–程时将整型转化æˆäؓ钱å¸åž?而ä¸è¦ç‰åˆ°è¿è¡Œæ—¶è½¬åŒ–ã€?
3ã€?nbsp; ž®½é‡é¿å…在WHEREåå¥ä¸å¯¹å—段˜q›è¡Œå‡½æ•°æˆ–表辑ּæ“作åQŒè¿™ž®†å¯¼è‡´å¼•擎放弃ä‹É用烦引而进行全表扫æã€‚如åQ?
SELECT * FROM T1 WHERE F1/2=100
应改�
SELECT * FROM T1 WHERE F1=100*2
SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改�
SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’
SELECT member_number, first_name, last_name FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改�
SELECT member_number, first_name, last_name FROM members
WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
å»I¼šä»ÖM½•对列的æ“作都ž®†å¯¼è‡´è¡¨æ‰«æåQŒå®ƒåŒ…括数æ®åº“函数ã€è®¡½Ž—表辑ּ½{‰ç‰åQŒæŸ¥è¯¢æ—¶è¦å°½å¯èƒ½ž®†æ“作移至ç‰å·å³è¾V€?/p>
4ã€?nbsp; é¿å…使用!=或<åQžã€IS NULL或IS NOT NULLã€IN åQŒNOT IN½{‰è¿™æ ïLš„æ“ä½œ½W?å› äØ“˜q™ä¼šä½¿ç³»¾lŸæ— 法ä‹É用烦å¼?而åªèƒ½ç›´æŽ¥æœç´¢è¡¨ä¸çš„æ•°æ®ã€‚例å¦?
SELECT id FROM employee WHERE id != 'B%'
ä¼˜åŒ–å™¨å°†æ— æ³•é€šè¿‡ç´¢å¼•æ¥ç¡®å®šå°†è¦å‘½ä¸çš„行数,å› æ¤éœ€è¦æœç´¢è¯¥è¡¨çš„æ‰€æœ‰è¡Œã€?br>
5ã€?nbsp; ž®½é‡ä½¿ç”¨æ•°å—型嗌Dµï¼Œä¸€éƒ¨åˆ†å¼€å‘äh员和数æ®åº“管ç†äh员喜‹Æ¢æŠŠåŒ…嫿•°å€ég¿¡æ¯çš„å—æ®µ
设计为嗽W¦åž‹åQŒè¿™ä¼šé™ä½ŽæŸ¥è¯¢å’Œ˜qžæŽ¥çš„æ€§èƒ½åQŒåÆˆä¼šå¢žåŠ å˜å‚¨å¼€é”€ã€‚è¿™æ˜¯å› ä¸ºå¼•æ“Žåœ¨å¤„ç†æŸ¥è¯¢å’Œè¿žæŽ¥å›žé€ä¸ªæ¯”较å—ç¬¦ä¸²ä¸æ¯ä¸€ä¸ªå—½W¦ï¼Œè€Œå¯¹äºŽæ•°å—型而言åªéœ€è¦æ¯”较一‹Æ¡å°±å¤Ÿäº†ã€?/p>
6ã€?nbsp; åˆç†ä½¿ç”¨EXISTS,NOT EXISTSåå¥ã€‚如下所½Cºï¼š
1.SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
SELECT * FROM T2 WHERE T2.C2=T1.C2)
两者äñ”生相åŒçš„¾l“æžœåQŒä½†æ˜¯åŽè€…的效率昄¡„¶è¦é«˜äºŽå‰è€…ã€‚å› ä¸ºåŽè€…ä¸ä¼šäñ”生大é‡é”å®šçš„è¡¨æ‰«ææˆ–是烦引扫æã€?br>å¦‚æžœä½ æƒ³æ ¡éªŒè¡¨é‡Œæ˜¯å¦å˜åœ¨æŸæ¡¾Uªå½•åQŒä¸è¦ç”¨count(*)é‚£æ ·æ•ˆçŽ‡å¾ˆä½ŽåQŒè€Œä¸”‹¹ªè´¹æœåŠ¡å™¨èµ„æºã€‚å¯ä»¥ç”¨EXISTS代替。如åQ?br>IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
å¯ä»¥å†™æˆåQ?br>IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')
¾l常需è¦å†™ä¸€ä¸ªT_SQLè¯å¥æ¯”较一个父¾l“果集和å结果集åQŒä»Žè€Œæ‰¾åˆ°æ˜¯å¦å˜åœ¨åœ¨çˆ¶ç»“æžœé›†ä¸æœ‰è€Œåœ¨åç»“æžœé›†ä¸æ²¡æœ‰çš„记录åQŒå¦‚åQ?br>1.SELECT a.hdr_key FROM hdr_tbl a---- tbl a 表示tbl用别åa代替
WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key)
2.SELECT a.hdr_key FROM hdr_tbl a
LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key WHERE b.hdr_key IS NULL
3.SELECT hdr_key FROM hdr_tbl
WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)
三ç§å†™æ³•都å¯ä»¥å¾—åˆ°åŒæ äh£¼‹®çš„¾l“æžœåQŒä½†æ˜¯æ•ˆçŽ‡ä¾‹Æ¡é™ä½Žã€?/p>
7ã€?nbsp; ž®½é‡é¿å…在烦引过的嗽W¦æ•°æ®ä¸åQŒä‹Éç”¨éžæ‰“头嗿¯æœçƒ¦ã€‚这也ä‹Éå¾—å¼•æ“Žæ— æ³•åˆ©ç”¨çƒ¦å¼•ã€?nbsp;
è§å¦‚下例å:
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
SELECT * FROM T1 WHERE NAME LIKE ‘L%’
å³ä‹ÉNAMEå—æ®µå»ºæœ‰ç´¢å¼•åQŒå‰ä¸¤ä¸ªæŸ¥è¯¢ä¾ç„¶æ— 法利用索引完æˆåŠ å¿«æ“作åQŒå¼•擎ä¸å¾—ä¸å¯¹å…¨è¡¨æ‰€æœ‰æ•°æ®é€æ¡æ“作æ¥å®Œæˆä“Q务。而第三个查询能够使用索引æ¥åŠ å¿«æ“作ã€?/p>
8ã€?nbsp; 分利用连接æ¡ä»Óž¼Œåœ¨æŸ¿U情况下åQŒä¸¤ä¸ªè¡¨ä¹‹é—´å¯èƒ½ä¸åªä¸€ä¸ªçš„˜qžæŽ¥æ¡äšgåQŒè¿™æ—¶åœ¨ WHERE åå¥ä¸å°†˜qžæŽ¥æ¡äšg完整的写上,有å¯èƒ½å¤§å¤§æé«˜æŸ¥è¯¢é€Ÿåº¦ã€?br>例:
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO AND A.ACCOUNT_NO=B.ACCOUNT_NO
½W¬äºŒå¥å°†æ¯”ç¬¬ä¸€å¥æ‰§è¡Œå¿«å¾—多ã€?/p>
9ã€?nbsp; 消除对大型表行数æ®çš„™åºåºå˜å–
ž®½ç®¡åœ¨æ‰€æœ‰çš„‹‚€æŸ¥åˆ—上都有烦引,但æŸäº›åÅžå¼çš„WHEREåå¥å¼ø™¿«ä¼˜åŒ–器ä‹É用顺åºå˜å–。如åQ?br>SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR
order_num=1008
解决办法å¯ä»¥ä½¿ç”¨òq‰™›†æ¥é¿å…顺åºå˜å–:
SELECT åQ?FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT åQ?FROM orders WHERE order_num=1008
˜q™æ ·ž®Þpƒ½åˆ©ç”¨ç´¢å¼•è·¯å¾„å¤„ç†æŸ¥è¯¢ã€?/p>
10ã€?é¿å…困难的æ£è§„表辑ּ
LIKE关键嗿”¯æŒé€šé…½W¦åŒ¹é…ï¼ŒæŠ€æœ¯ä¸Šå«æ£è§„表辑ּ。但˜q™ç§åŒšw…特别耗费旉™—´ã€‚例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
å³ä‹É在zipcodeå—æ®µä¸Šå¾ç«‹äº†ç´¢å¼•åQŒåœ¨˜q™ç§æƒ…况下也˜q˜æ˜¯é‡‡ç”¨™åºåºæ‰«æçš„æ–¹å¼ã€‚如
果把è¯å¥æ”¹äØ“SELECT åQ?FROM customer WHERE zipcode >“98000”åQŒåœ¨æ‰§è¡ŒæŸ¥è¯¢
æ—¶å°±ä¼šåˆ©ç”¨çƒ¦å¼•æ¥æŸ¥è¯¢åQŒæ˜¾ç„¶ä¼šå¤§å¤§æé«˜é€Ÿåº¦ã€?br>11ã€?ä½¿ç”¨è§†å›¾åŠ é€ŸæŸ¥è¯?br>把表的一个å集进行排åºåƈ创å¾è§†å›¾åQŒæœ‰æ—¶èƒ½åŠ é€ŸæŸ¥è¯¢ã€‚å®ƒæœ‰åŠ©äºŽé¿å…å¤šé‡æŽ’åº?br>æ“作åQŒè€Œä¸”在其他方é¢è¿˜èƒ½ç®€åŒ–优化器的工作。例如:
SELECT cust.nameåQŒrcvbles.balanceåQ?#8230;…other columns
FROM custåQŒrcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
如果˜q™ä¸ªæŸ¥è¯¢è¦è¢«æ‰§è¡Œå¤šæ¬¡è€Œä¸æ¢ä¸€‹Æ¡ï¼Œå¯ä»¥æŠŠæ‰€æœ‰æœªä»˜æ¬¾çš„客æˆäh‰¾å‡ºæ¥æ”‘Öœ¨ä¸€ä¸?br>视图ä¸ï¼Œòq¶æŒ‰å®¢æˆ·çš„åå—进行排åºï¼š
CREATE VIEW DBO.V_CUST_RCVLBES
AS
SELECT cust.nameåQŒrcvbles.balanceåQ?#8230;…other columns
FROM custåQŒrcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
ç„¶åŽä»¥ä¸‹é¢çš„æ–¹å¼åœ¨è§†å›¾ä¸æŸ¥è¯¢åQ?
SELECT åQ?FROM V_CUST_RCVLBES
WHERE postcode>“98000”
视图ä¸çš„è¡Œè¦æ¯”主表ä¸çš„行ž®‘,而且物熙åºåºž®±æ˜¯æ‰€è¦æ±‚的顺åºï¼Œå‡å°‘了ç£ç›?br>I/OåQŒæ‰€ä»¥æŸ¥è¯¢å·¥ä½œé‡å¯ä»¥å¾—到大幅å‡å°‘ã€?/p>
12ã€?能够用BETWEEN的就ä¸è¦ç”¨IN
SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)
æ”ÒŽˆåQ?br>SELECT * FROM T1 WHERE ID BETWEEN 10 AND 14
å› äØ“IN会ä‹É¾pÈ»Ÿæ— 法使用索引,而åªèƒ½ç›´æŽ¥æœç´¢è¡¨ä¸çš„æ•°æ®ã€?/p>
13ã€?DISTINCT的就ä¸ç”¨GROUP BY
SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID
坿”¹ä¸ºï¼š
SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10
14�nbsp; 部分利用索引
1.SELECT employeeID, firstname, lastname
FROM names
WHERE dept = 'prod' or city = 'Orlando' or division = 'food'
2.SELECT employeeID, firstname, lastname FROM names WHERE dept = 'prod'
UNION ALL
SELECT employeeID, firstname, lastname FROM names WHERE city = 'Orlando'
UNION ALL
SELECT employeeID, firstname, lastname FROM names WHERE division = 'food'
如果dept åˆ—å¾æœ‰çƒ¦å¼•则查询2å¯ä»¥éƒ¨åˆ†åˆ©ç”¨ç´¢å¼•åQŒæŸ¥è¯?则ä¸èƒ½ã€?/p>
15ã€?nbsp; 能用UNION ALLž®×ƒ¸è¦ç”¨UNION
UNION ALL䏿‰§è¡ŒSELECT DISTINCT函数åQŒè¿™æ ·å°±ä¼šå‡ž®‘很多ä¸å¿…è¦çš„资æº?/p>
16ã€?nbsp; ä¸è¦å†™ä¸€äº›ä¸åšä“Q何事的查è¯?br>如:SELECT COL1 FROM T1 WHERE 1=0
SELECT COL1 FROM T1 WHERE COL1=1 AND COL1=2
˜q™ç±»æÈ ä¸ä¼š˜q”回ä»ÖM½•¾l“果集,但是会消耗系¾lŸèµ„æºã€?/p>
17ã€?nbsp; ž®½é‡ä¸è¦ç”¨SELECT INTOè¯å¥ã€?br>SELECT INOT è¯å¥ä¼šå¯¼è‡´è¡¨é”定åQŒé˜»æ¢å…¶ä»–用戯‚®¿é—®è¯¥è¡¨ã€?/p>
18ã€?å¿…è¦æ—¶å¼ºåˆ¶æŸ¥è¯¢ä¼˜åŒ–器使用æŸä¸ªç´¢å¼•
SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45)
æ”ÒŽˆåQ?br>SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND processid IN (8,32,45)
则查询优化器ž®†ä¼šå¼ø™¡Œåˆ©ç”¨ç´¢å¼•IX_ProcessID 执行查询ã€?br>
19ã€?nbsp; 虽然UPDATEã€DELETEè¯å¥çš„写法基本固定,但是˜q˜æ˜¯å¯¹UPDATEè¯å¥¾l™ç‚¹å»ø™®®åQ?br>a) ž®½é‡ä¸è¦ä¿®æ”¹ä¸»é”®å—段ã€?br>b) 当修改VARCHAR型嗌D‰|—¶åQŒå°½é‡ä‹É用相åŒé•¿åº¦å†…容的å€ég»£æ›Ñ€?br>c) ž®½é‡æœ€ž®åŒ–å¯¹äºŽå«æœ‰UPDATE触å‘器的表的UPDATEæ“作ã€?br>d) é¿å…UPDATEž®†è¦å¤åˆ¶åˆ°å…¶ä»–æ•°æ®åº“的列ã€?br>e) é¿å…UPDATE建有很多索引的列ã€?br>f) é¿å…UPDATE在WHEREå奿¡äšgä¸çš„列ã€?/p>
ä¸Šé¢æˆ‘们æåˆ°çš„æ˜¯ä¸€äº›åŸºæœ¬çš„æé«˜æŸ¥è¯¢é€Ÿåº¦çš„æ³¨æ„事™å?但是在更多的情况ä¸?往往需è¦åå¤è¯•验比较ä¸åŒçš„è¯å¥ä»¥å¾—到最ä½Ïx–¹æ¡ˆã€‚最好的æ–ÒŽ³•当然是测试,看实现相åŒåŠŸèƒ½çš„SQLè¯å¥å“ªä¸ªæ‰§è¡Œæ—‰™—´æœ€ž®‘,但是数æ®åº“ä¸å¦‚果数æ®é‡å¾ˆž®‘,是比较ä¸å‡ºæ¥çš„,˜q™æ—¶å¯ä»¥ç”¨æŸ¥çœ‹æ‰§è¡Œè®¡åˆ’,å»I¼šæŠŠå®žçŽ°ç›¸åŒåŠŸèƒ½çš„å¤šæ¡SQLè¯å¥è€ƒåˆ°æŸ¥è¯¢åˆ†æžå™¨ï¼ŒæŒ‰CTRL+Lçœ‹æŸ¥æ‰€åˆ©ç”¨çš„çƒ¦å¼•ï¼Œè¡¨æ‰«ææ¬¡æ•ŽÍ¼ˆ˜q™ä¸¤ä¸ªå¯¹æ€§èƒ½å½±å“最大)åQŒæ€ÖM½“ä¸Šçœ‹è¯¢æˆæœ¬ç™¾åˆ†æ¯”å›_¯ã€?br>½Ž€å•çš„å˜å‚¨˜q‡ç¨‹å¯ä»¥ç”¨å‘坯D‡ªåŠ¨ç”Ÿæˆï¼šåœ¨ä¼ä¸šç®¡ç†å™¨å·¥å…·æ 点击è¿è¡Œå‘å¯¼å›¾æ ‡ï¼Œç‚¹å‡»”æ•°æ®åº?#8221;ã€?#8221;创å¾å˜å‚¨˜q‡ç¨‹å‘导”ã€‚å¤æ‚å˜å‚¨è¿‡½E‹çš„调试åQšåœ¨æŸ¥è¯¢åˆ†æžå™¨å·¦è¾¹çš„对象‹¹è§ˆå™¨ï¼ˆæ²¡æœ‰åQŸæŒ‰F8åQ‰é€‰æ‹©è¦è°ƒè¯•çš„å˜å‚¨˜q‡ç¨‹,点å³é”®ï¼Œç‚¹è°ƒè¯•ï¼Œè¾“å…¥å‚æ•°æ‰§è¡ŒåQŒå‡ºçŽîC¸€ä¸ªæÕQ动工å…äh¡åQŒä¸Šé¢æœ‰å•æ¥æ‰§è¡ŒåQŒæ–点设¾|®ç‰ã€?/p>
select count(*) from record where date >
''19991201'' and date < ''19991214''and amount >
2000 (25¿U?
select date,sum(amount) from record group by date
(55¿U?
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'') (27¿U?
select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000 åQ?4¿U’)
select date,sum(amount) from record group by date
åQ?8¿U’)
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'')åQ?4¿U’)
select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000 åQ?6¿U’)
select date,sum(amount) from record group by date
åQ?7¿U’)
select count(*) from record where date >
''19990901'' and place in (''BJ, ''SH'')åQ?lt; 1¿U’)
select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000(< 1¿U?
select date,sum(amount) from record group by date
åQ?1¿U’)
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'')åQ?lt; 1¿U’)
  分æžåQ?
  ˜q™æ˜¯ä¸€ä¸ªåˆç†çš„¾l„åˆç´¢å¼•。它ž®†dateä½œäØ“å‰å¯¼åˆ—,使æ¯ä¸ªSQL都å¯ä»¥åˆ©ç”¨çƒ¦å¼•,òq¶ä¸”在第一和第三个SQLä¸åÅžæˆäº†ç´¢å¼•覆盖åQŒå› 而性能辑ֈ°äº†æœ€ä¼˜ã€?
  5.æ€È»“åQ?
  ¾~ºçœæƒ…况下å¾ç«‹çš„索引是鞾Ÿ¤é›†ç´¢å¼•åQŒä½†æœ‰æ—¶å®ƒåÆˆä¸æ˜¯æœ€ä½³çš„åQ›åˆç†çš„索引设计è¦å¾ç«‹åœ¨å¯¹å„¿U查询的分æžå’Œé¢„‹¹‹ä¸Šã€‚一般æ¥è¯ß_¼š
  â‘?有大é‡é‡å¤å€¹{€ä¸”¾l常有范围查è¯?
  åQˆbetween, >,< åQ?gt;=,< =åQ‰å’Œorder byã€group byå‘生的列åQŒå¯è€ƒè™‘建立¾Ÿ¤é›†ç´¢å¼•åQ?
  â‘?¾lå¸¸åŒæ—¶å˜å–多列åQŒä¸”æ¯åˆ—éƒ½å«æœ‰é‡å¤å€¼å¯è€ƒè™‘建立¾l„åˆç´¢å¼•åQ?
  â‘?¾l„åˆç´¢å¼•è¦å°½é‡ä‹É关键查询形æˆç´¢å¼•覆盖åQŒå…¶å‰å¯¼åˆ—一定是使用最频ç¹çš„列ã€?/p>
二ã€ä¸å……䆾的连接æ¡ä»?/strong>
  例:表cardæœ?896行,在card_no上有一个éžèšé›†ç´¢å¼•åQŒè¡¨accountæœ?91122行,åœ?account_no上有一个éžèšé›†ç´¢å¼•åQŒè¯•看在ä¸åŒçš„表˜qžæŽ¥æ¡äšg下,两个SQL的执行情况:
select sum(a.amount) from account a,
card b where a.card_no = b.card_noåQ?0¿U’)
  ž®†SQLæ”¹äØ“åQ?
select sum(a.amount) from account a,
card b where a.card_no = b.card_no and a.
account_no=b.account_noåQ?lt; 1¿U’)
  分æžåQ?
  在第一个连接æ¡ä»¶ä¸‹åQŒæœ€ä½ÏxŸ¥è¯¢æ–¹æ¡ˆæ˜¯ž®†account作外层表åQŒcard作内层表åQŒåˆ©ç”¨card上的索引åQŒå…¶I/O‹Æ¡æ•°å¯ç”±ä»¥ä¸‹å…¬å¼ä¼°ç®—为:
  外层表account上的22541™å?åQˆå¤–层表accountçš?91122è¡?内层表card上对应外层表½W¬ä¸€è¡Œæ‰€è¦æŸ¥æ‰„¡š„3™åµï¼‰=595907‹Æ¡I/O
  在第二个˜qžæŽ¥æ¡äšg下,最ä½ÏxŸ¥è¯¢æ–¹æ¡ˆæ˜¯ž®†card作外层表åQŒaccount作内层表åQŒåˆ©ç”¨account上的索引åQŒå…¶I/O‹Æ¡æ•°å¯ç”±ä»¥ä¸‹å…¬å¼ä¼°ç®—为:
  外层表card上的1944™å?åQˆå¤–层表cardçš?896è¡?内层表account上对应外层表æ¯ä¸€è¡Œæ‰€è¦æŸ¥æ‰„¡š„4™åµï¼‰= 33528‹Æ¡I/O
  å¯è§åQŒåªæœ‰å……份的˜qžæŽ¥æ¡äšgåQŒçœŸæ£çš„æœ€ä½Ïx–¹æ¡ˆæ‰ä¼šè¢«æ‰§è¡Œã€?
  æ€È»“åQ?
  1.多表æ“作在被实际执行å‰ï¼ŒæŸ¥è¯¢ä¼˜åŒ–器会æ ÒŽ®˜qžæŽ¥æ¡äšgåQŒåˆ—å‡ºå‡ ¾l„å¯èƒ½çš„˜qžæŽ¥æ–ÒŽ¡ˆòq¶ä»Žä¸æ‰¾å‡ºç³»¾lŸå¼€é”€æœ€ž®çš„æœ€ä½Ïx–¹æ¡ˆã€‚连接æ¡ä»¶è¦å……䆾考虑带有索引的表ã€è¡Œæ•°å¤šçš„表åQ›å†…外表的选择å¯ç”±å…¬å¼åQšå¤–层表ä¸çš„匚w…行数*å†…å±‚è¡¨ä¸æ¯ä¸€‹Æ¡æŸ¥æ‰„¡š„‹Æ¡æ•°¼‹®å®šåQŒä¹˜¿U¯æœ€ž®äؓ最ä½Ïx–¹æ¡ˆã€?
  2.查看执行æ–ÒŽ¡ˆçš„æ–¹æ³?- 用set showplanonåQŒæ‰“å¼€showplan选项åQŒå°±å¯ä»¥çœ‹åˆ°˜qžæŽ¥™åºåºã€ä‹É用何¿U烦引的信æ¯åQ›æƒ³çœ‹æ›´è¯¦ç»†çš„ä¿¡æ¯ï¼Œéœ€ç”¨sa角色执行dbcc(3604,310,302)ã€?
三ã€ä¸å¯ä¼˜åŒ–çš„whereåå¥
  1.例:下列SQLæ¡äšgè¯å¥ä¸çš„列都建有æ°å½“的烦引,但执行速度å´éžå¸¸æ…¢åQ?
select * from record where
substring(card_no,1,4)=''5378''(13¿U?
select * from record where
amount/30< 1000åQ?1¿U’)
select * from record where
convert(char(10),date,112)=''19991201''åQ?0¿U’)
  分æžåQ?
  whereåå¥ä¸å¯¹åˆ—çš„ä»ÖM½•æ“作¾l“果都是在SQL˜q行旉™€åˆ—è®¡ç®—å¾—åˆ°çš„ï¼Œå› æ¤å®ƒä¸å¾—丘q›è¡Œè¡¨æœç´¢ï¼Œè€Œæ²¡æœ‰ä‹É用该列上é¢çš„索引åQ›å¦‚果这些结果在查询¾~–译时就能得刎ͼŒé‚£ä¹ˆž®±å¯ä»¥è¢«SQL优化器优化,使用索引åQŒé¿å…表æœçƒ¦åQŒå› æ¤å°†SQLé‡å†™æˆä¸‹é¢è¿™æ øP¼š
select * from record where card_no like
''5378%''åQ?lt; 1¿U’)
select * from record where amount
< 1000*30åQ?lt; 1¿U’)
select * from record where date= ''1999/12/01''
åQ?lt; 1¿U’)
ã€€ã€€ä½ ä¼šå‘现SQL明显快è“væ¥ï¼
  2.例:表stuffæœ?00000行,id_no上有éžç¾¤é›†çƒ¦å¼•,è¯ïLœ‹ä¸‹é¢˜q™ä¸ªSQLåQ?
select count(*) from stuff where id_no in(''0'',''1'')åQ?3¿U’)
  分æžåQ?
  whereæ¡äšgä¸çš„''in''在逻辑上相当于''or''åQŒæ‰€ä»¥è¯æ³•分æžå™¨ä¼šå°†in (''0'',''1'')转化为id_no =''0'' or id_no=''1''æ¥æ‰§è¡Œã€‚æˆ‘ä»¬æœŸæœ›å®ƒä¼šæ ¹æ®æ¯ä¸ªoråå¥åˆ†åˆ«æŸ¥æ‰¾åQŒå†ž®†ç»“æžœç›¸åŠ ï¼Œ˜q™æ ·å¯ä»¥åˆ©ç”¨id_no上的索引åQ›ä½†å®žé™…上(æ ÒŽ® showplanåQ?它å´é‡‡ç”¨äº?OR½{–ç•¥"åQŒå³å…ˆå–出满‘Ïx¯ä¸ªoråå¥çš„行åQŒå˜å…¥äÍæ—¶æ•°æ®åº“的工作表ä¸ï¼Œå†å¾ç«‹å”¯ä¸€ç´¢å¼•以去掉é‡å¤è¡ŒåQŒæœ€åŽä»Ž˜q™ä¸ªä¸´æ—¶è¡¨ä¸è®¡ç®—¾l“æžœã€‚å› æ¤ï¼Œå®žé™…˜q‡ç¨‹æ²¡æœ‰åˆ©ç”¨id_no上烦引,òq¶ä¸”å®Œæˆæ—‰™—´˜q˜è¦å—tempdbæ•°æ®åº“性能的媄å“ã€?
ã€€ã€€å®žè·µè¯æ˜ŽåQŒè¡¨çš„行数越多ã·éž…淼男阅芫驮讲ç¿îƒçœ˜tuffæœ?20000行时åQŒæ‰§è¡Œæ—¶é—´ç«Ÿè¾‘Öˆ°220¿U’8q˜ä¸å¦‚å°†oråå¥åˆ†å¼€åQ?
select count(*) from stuff where id_no=''0''
select count(*) from stuff where id_no=''1''
  得到两个¾l“æžœåQŒå†ä½œä¸€‹Æ¡åŠ æ³•åˆ½Ž—ã€‚å› ä¸ºæ¯å¥éƒ½ä½¿ç”¨äº†çƒ¦å¼•,执行旉™—´åªæœ‰3¿U’,åœ?20000行下åQŒæ—¶é—´ä¹Ÿåªæœ‰4¿U’。或者,用更好的æ–ÒŽ³•åQŒå†™ä¸€ä¸ªç®€å•çš„å˜å‚¨˜q‡ç¨‹åQ?
create proc count_stuff as
declare @a int
declare @b int
declare @c int
declare @d char(10)
begin
select @a=count(*) from stuff where id_no=''0''
select @b=count(*) from stuff where id_no=''1''
end
select @c=@a+@b
select @d=convert(char(10),@c)
print @d
  直接½Ž—出¾l“æžœåQŒæ‰§è¡Œæ—¶é—´åŒä¸Šé¢ä¸€æ ·å¿«åQ?
  æ€È»“åQ?br>
  å¯è§åQŒæ‰€è°“优化å³whereåå¥åˆ©ç”¨äº†çƒ¦å¼•,ä¸å¯ä¼˜åŒ–å›_‘ç”Ÿäº†è¡¨æ‰«ææˆ–é¢å¤–开销ã€?
  1.ä»ÖM½•对列的æ“作都ž®†å¯¼è‡´è¡¨æ‰«æåQŒå®ƒåŒ…括数æ®åº“函数ã€è®¡½Ž—表辑ּ½{‰ç‰åQŒæŸ¥è¯¢æ—¶è¦å°½å¯èƒ½ž®†æ“作移至ç‰å·å³è¾V€?
  2.inã€oråå¥å¸æ€¼šä½¿ç”¨å·¥ä½œè¡¨ï¼Œä½¿çƒ¦å¼•失效;如果ä¸äñ”生大é‡é‡å¤å€û|¼Œå¯ä»¥è€ƒè™‘把å奿‹†å¼€åQ›æ‹†å¼€çš„åå¥ä¸åº”该包å«ç´¢å¼•ã€?
  3.è¦å–„于ä‹É用å˜å‚¨è¿‡½E‹ï¼Œå®ƒä‹ÉSQLå˜å¾—æ›´åŠ ç‰|´»å’Œé«˜æ•ˆã€?
  从以上这些例åå¯ä»¥çœ‹å‡ºï¼ŒSQL优化的实质就是在¾l“æžœæ£ç¡®çš„剿䏋åQŒç”¨ä¼˜åŒ–器å¯ä»¥è¯†åˆ«çš„è¯å¥åQŒå……份利用烦引,å‡å°‘表扫æçš„I/O‹Æ¡æ•°åQŒå°½é‡é¿å…表æœçƒ¦çš„å‘生。其实SQLçš„æ€§èƒ½ä¼˜åŒ–æ˜¯ä¸€ä¸ªå¤æ‚çš„˜q‡ç¨‹åQŒä¸Š˜q°è¿™äº›åªæ˜¯åœ¨åº”用层次的一¿U体玎ͼŒæ·±å…¥ç ”ç©¶˜q˜ä¼šæ¶‰åŠæ•°æ®åº“层的资æºé…¾|®ã€ç½‘¾lœå±‚çš„æµé‡æŽ§åˆ¶ä»¥åŠæ“作系¾lŸå±‚çš„æ€ÖM½“设计ã€?