SELECT * 測試

来源:http://www.cnblogs.com/jil-wen/archive/2017/05/21/6837245.html
-Advertisement-
Play Games

描述 大家通常禁止在生產環境直接使用select * 已成常識了,也常常在開發規範中就會規定不允許直接使用select *,那麼我們為什麼不允許使用select * ,在一些什麼場景下select * 會出問題?能否控制不能直接使用select *?出於這些疑問,我們特別測試記錄一下。 測試環境 M ...


描述

大家通常禁止在生產環境直接使用select * 已成常識了,也常常在開發規範中就會規定不允許直接使用select *,那麼我們為什麼不允許使用select * ,在一些什麼場景下select * 會出問題?能否控制不能直接使用select *?出於這些疑問,我們特別測試記錄一下。

 

測試環境

Microsoft SQL Server 2012 - 11.0.2100.60 (X64)  Feb 10 2012 19:39:15  Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )  

select * 可能會造成業務功能出錯

假設我們有一個視圖 V_test 代碼如下:
1 CREATE VIEW v_test
2 AS
3     SELECT  *
4     FROM    test

 

你在web前端調用直接使用如下腳本並對應好顯示的欄位,當時功能是正常的。
   SELECT  *
    FROM    v_test

 

test 表結構如下: 表結構  後來因為業務調整,有人調整了test表 ,並加一個欄位F ,那麼接下來的後果就會前端相應的功能因新增的欄位F直接報錯。  

select * 可能會造成性能方面的問題

測試數據準備
 1 --新建測試表
 2 IF OBJECT_ID('test', 'U') IS NOT NULL
 3     DROP TABLE test;
 4 CREATE TABLE test
 5     (
 6       id int IDENTITY(1, 1) ,
 7       a nvarchar(20) ,
 8       b nvarchar(15) ,
 9       c nvarchar(20) ,
10       d int ,
11       e float
12     );
 1 --造測試數據
 2 DECLARE @i INT; 
 3 SET @i = 10000;
 4 WHILE ( @i > 0 )
 5     BEGIN 
 6         INSERT  INTO test
 7                 ( a ,
 8                   b ,
 9                   c ,
10                   d ,
11                   e
12                 )
13                 SELECT  RAND() * 1000 ,
14                         RAND() * 1000 ,
15                         REPLICATE('a', 3) ,
16                         @i ,
17                         @i - 1;
18         SELECT  @i = @i - 1;
19     END; 
1 --新建索引(主鍵、非聚集索引)
2 ALTER TABLE dbo.test ADD CONSTRAINT PK_test_id PRIMARY KEY(ID);
3 CREATE INDEX IX_test_1 ON dbo.test(a);

 

查詢條件使用主鍵欄位的執行計劃,主鍵是預設覆蓋全部欄位。 查詢 如直接使用欄位a做查詢條件 a  還是聚集索引掃描,全表掃,無法使用我們已新建好的非聚集索引IX_test_1,在上述語句中因該索引未覆蓋到非a 的欄位。假設實際場景我們只需取a欄位,那麼執行計劃又是怎麼樣的? a欄位  如上圖,就會走我們期望的索引,同時也可以減少因select * 而多讀的欄位(id、b、c、d、e)的網路傳輸,所以,儘量指定自己所需的欄位名,可以避免一些無謂的性能開銷。  

如何控制不讓 select *

假設我們不允許在上述測試表test上執行select * 可以如何處理
 1 --新建測試表
 2 IF OBJECT_ID('test', 'U') IS NOT NULL
 3     DROP TABLE test;
 4 CREATE TABLE test
 5     (
 6       id int IDENTITY(1, 1) ,
 7       a nvarchar(20) ,
 8       b nvarchar(15) ,
 9       c nvarchar(20) ,
10       d int ,
11       e float,
12       abort_select_all  AS  (1/0)        ---新增控制欄位
13     );
14 --造測試數據
15 DECLARE @i INT; 
16 SET @i = 10000;
17 WHILE ( @i > 0 )
18     BEGIN 
19         INSERT  INTO test
20                 ( a ,
21                   b ,
22                   c ,
23                   d ,
24                   e
25                 )
26                 SELECT  RAND() * 1000 ,
27                         RAND() * 1000 ,
28                         REPLICATE('a', 3) ,
29                         @i ,
30                         @i - 1;
31         SELECT  @i = @i - 1;
32     END; 
33 --新建索引 (主鍵、非聚集索引)
34 ALTER TABLE dbo.test ADD CONSTRAINT PK_test_id PRIMARY KEY(ID);
35 CREATE INDEX IX_test_1 ON dbo.test(a);

 

如下圖,如果select *  因讀取了abort_select_all欄位(1/0)就會直接報錯,從而達到不能直接select *的效果; select *
  直接按欄位名查詢沒有問題(非abort_select_all欄位)。 非select * 直接按欄位名查詢沒有問題。
 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文來自:http://www.runoob.com/w3cnote/android-tutorial-imageview.html 本節引言: 本節介紹的UI基礎控制項是:ImageView(圖像視圖),見名知意,就是用來顯示圖像的一個View或者說控制項! 官方API:ImageView;本節講解的 ...
  • 在導出資料庫dmp文件時,有資料庫表空記錄的情況下,該空表不會被導出表結構,應用如下格式代碼: select 'alter table ' || table_name || ' allocate extent(size 64k);' sql_text, table_name, tablespace_ ...
  • " 1、SQL 語句分類 " "1.1、分類方法及類型" "1.2、數據定義語言" "1.3、數據操縱語言" "1.4、其它語句" " 2、動態 SQL 理論 " "2.1、動態 SQL 的用途" "2.2、動態 SQL 的語法" "2.3、綁定變數" " 3、動態 SQL 實戰 " "3.1、封裝 ...
  • 在日常工作中,會碰到如下的場景,如mysql資料庫升級,主伺服器硬體升級等,這個時候就需要將寫操作切換到另外一臺伺服器上,那麼如何進行線上切換呢?同時,要求切換過程短,對業務的影響比較小。 MHA就提供了這樣一種優雅的方式,只會堵塞業務0.5~2s的時間,在這段時間內,業務無法讀取和寫入。 集群信息 ...
  • 這裡向大家介紹一個新的生成T-SQL腳本的SQL Server命令行工具:mssql-scripter。它支持在SQL Server、Azure SQL DB以及Azure SQL DW中為資料庫生成CREATE和INSERT T-SQL腳本。 Mssql-scripter是一個跨平臺的命令行工具, ...
  • 前幾天朋友問我,關於SQLServer資料庫中對樹形結構的表數據統計問題,需求大致如下: 分類表(遞歸數據),A的子分類是B,B的子分類是C……分類關係不間斷,A為第一層,B為第二層,C為第三層……需要統計“每個分類所在的層數”、“子分類的總數”和“子分類的層數”。 ...
  • 此文為慕課網MySql學習筆記,地址:http://www.imooc.com/learn/122 一、在my.ini中配置預設字元集為utf8 a.客戶端:[mysql] default-character-set=utf8 b.服務端:[mysqld] character-set-server= ...
  • MHA(Master High Availability)是一套相對成熟的MySQL高可用方案,能做到在0~30s內自動完成資料庫的故障切換操作,在master伺服器不宕機的情況下,基本能保證數據的一致性。 它由兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點)。其中,MH ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...