SQL Server 2005 查詢具有多個條件,一些索引,一些不
我有一張有 5000 萬行的表。它在 zip 上被索引。一個問題
Select * from table where zip = '12345'
在大約 2 秒內返回 20,000 行
當我添加一個附加條件時,它會跳轉到 15 分鐘……
Select * from table where zip = '12345' and otherField = 'Y'
我的期望是 SQL 將使用索引,辨識 20,000 行,然後掃描所有非索引條件。也許最多幾秒鐘。相反,它似乎正在掃描整個數據庫表。
我無法添加另一個索引…我們可能會測試 150 多列,大多數都有 Y/N 值。
有沒有更好的方法來編寫這種類型的查詢?
我可以在伺服器配置中設置錯誤嗎?
謝謝!
有沒有更好的方法來編寫這種類型的查詢?
不,您編寫它的方式是“最佳”方式。當然,除非這種方式行不通。使用聲明式語言的快樂和沮喪是優化器。當它起作用時它是你最好的朋友,當它不起作用時它是你最大的敵人。
讓優化器做正確事情的一種方法是以語義相同的方式重新編寫查詢,例如:
select <whatever> from table as t inner join ( Select <primary key columns> from table as b where b.zip='12345' ) as z on t.PrimaryKey = z.PrimaryKey -- repeat if multi-column key and t.otherField = 'Y';
現在優化器從不同的地方開始,可能最終得到不同的、更好的答案。但是,對於簡單的單表查詢,我擔心它不太可能顯示出太大的變化。
我只建議您在完全確定您已完成所有索引後嘗試此操作。以非顯而易見的方式重寫查詢會增加應用程序的維護成本。當您修補或升級 SQL Server 時,它也可能會適得其反。
您可以嘗試僅使用 zip 條件選擇臨時表,然後從具有附加條件的臨時表中進行選擇。
SELECT * INTO #MyTemp FROM (SELECT * FROM MyTable where zip='1234') data SELECT * from #MyTemp where other = 'Y' DROP Table #MyTemp
不確定這是否會更快,但由於僅 zip 查詢執行速度很快,因此您只需對 20,000 條記錄執行第二個查詢。這是否OK可能取決於一行中有多少數據,伺服器有多少記憶體,tempdb所在的磁碟有多快等等。無論如何都容易嘗試。